c++ - 仅渲染底面的地形

标签 c++ directx rendering terrain

我正在尝试渲染 map ,但不幸的是,只渲染了底面。

我想我在设置顶点和索引缓冲区时做错了什么。

这是我初始化顶点和索引缓冲区的部分:

// Initialize vertices and indices
SimpleVertex* vertices = new SimpleVertex[(dimension + 1) * (dimension + 1)];
WORD* indices = new WORD[dimension * dimension * 6];

for (WORD i = 0; i < dimension + 1; ++i)
{
    for (WORD j = 0; j < dimension + 1; ++j)
    {
        vertices[i * (dimension + 1) + j].Pos = XMFLOAT3(i, rand() % 2, j);
        vertices[i * (dimension + 1) + j].Color = XMFLOAT4(rand() % 2, rand() % 2, rand() % 2, 1.0f);
    }
}

for (WORD i = 0; i < dimension; i++)
{
    for (WORD j = 0; j < dimension; j++)
    {
        indices[(i * dimension + j) * 6] = (WORD)(i * (dimension + 1) + j);
        indices[(i * dimension + j) * 6 + 2] = (WORD)(i * (dimension + 1) + j + 1);
        indices[(i * dimension + j) * 6 + 1] = (WORD)((i + 1) * (dimension + 1) + j + 1);
        indices[(i * dimension + j) * 6 + 3] = (WORD)(i * (dimension + 1) + j);
        indices[(i * dimension + j) * 6 + 5] = (WORD)((i + 1) * (dimension + 1) + j + 1);
        indices[(i * dimension + j) * 6 + 4] = (WORD)((i + 1) * (dimension + 1) + j);
    }
}

// Create vertex buffer
D3D11_BUFFER_DESC bd;
ZeroMemory(&bd, sizeof(bd));
bd.Usage = D3D11_USAGE_DEFAULT;
bd.ByteWidth = sizeof(SimpleVertex)* (dimension + 1) * (dimension + 1);
bd.BindFlags = D3D11_BIND_VERTEX_BUFFER;
bd.CPUAccessFlags = 0;
D3D11_SUBRESOURCE_DATA InitData;
ZeroMemory(&InitData, sizeof(InitData));
InitData.pSysMem = vertices;
hr = g_pd3dDevice->CreateBuffer(&bd, &InitData, &g_pVertexBuffer);
delete vertices;
if (FAILED(hr))
    return hr;

// Set vertex buffer
UINT stride = sizeof(SimpleVertex);
UINT offset = 0;
g_pImmediateContext->IASetVertexBuffers(0, 1, &g_pVertexBuffer, &stride, &offset);

// Create indices buffer
bd.Usage = D3D11_USAGE_DEFAULT;
bd.ByteWidth = sizeof(WORD)* dimension * dimension * 6;
bd.BindFlags = D3D11_BIND_INDEX_BUFFER;
bd.CPUAccessFlags = 0;
InitData.pSysMem = indices;
hr = g_pd3dDevice->CreateBuffer(&bd, &InitData, &g_pIndexBuffer);
delete indices;
if (FAILED(hr))
    return hr;

请原谅我的英语不好:(。感谢您的阅读!

最佳答案

我想到的第一件事是您可能以错误的顺序声明了您的顶点。如果您的 Direct3D 上下文期望顶点是逆时针的,而您的顶点是按顺时针顺序定义的,“背面剔除”将导致您的多边形不可见,除非从另一侧查看。

具体来说,D3D11_RASTERIZER_DESC::FrontCounterClockwise 设置方向。 (参见 http://msdn.microsoft.com/en-us/library/windows/desktop/ff476198%28v=vs.85%29.aspx)

在设置光栅器描述的代码中,尝试设置 CullMode=D3D11_CULL_NONE,如果地形出现,那么这是您的问题。

关于c++ - 仅渲染底面的地形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23141246/

相关文章:

c++ - 未解析的外部符号 D3DXSaveSurfaceToFileW

c# - 两个圆的切线

javascript - React Native中的条件渲染错误

c++ - 隐藏 QPushButton 和 QLineEdit 边框

c++ - 是否可以从 std::abort 中恢复?

directx - DirectCompute:如何读取 RWTexture2D<float4>?

c# - 如何在 XNA 中隐藏立方体模型的某些面,以便体素引擎对其进行优化?

java - 如何每帧多次重绘 JFrame 及其组件?

c++ - 在 switch 语句中将多个案例组合在一起

c++ - pthread_create 无法与 pthread_attr_setschedparam 一起正常工作