2014-04-17 52 views
0

我试图渲染地图,但不幸的是,只渲染了底部。只能渲染底部的地形

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

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

// 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; 

借口对我的英语不好:(感谢您阅读

+0

最好给一个截图。 – zdd

回答

1

发生给我的第一件事情是你可以如果您的Direct3D上下文期望顶点逆时针旋转,而您的顺时针顺序定义,则“背面剔除”将导致您的多边形不可见,除非从另一侧看到。规格通常情况下,D3D11_RASTERIZER_DESC :: FrontCounterClockwise设置方向。 (请参见http://msdn.microsoft.com/en-us/library/windows/desktop/ff476198%28v=vs.85%29.aspx

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

1

很可能,脸部剔除没有正确设置。

理论上(感谢谷歌提供的链接;)):

在实践

  1. 你d按照顺序将顶点放置在三角形内(实际上,您使用索引操作,因为缓冲区已编入索引) - 顺时针或逆时针。
  2. 有决定#1你现在决定面向必须被视为“前”:

    D3D11_RASTERIZER_DESC rd = {}; 
    rd.FrontCounterClockwise = true; // counterclockwise are front 
    
  3. ,你决定面向光栅必须扑杀:回来的,正面的,或无:

    rd.CullMode = D3D11_CULL_BACK; // back faced primitives will be stripped out 
               // during rasterization 
               // (clockwise ones in our example) 
    

因此,您可以更改您的几何卷绕和/或DirectX卷绕选项和/或DirectX剔除选项。

注意:默认情况下,DirectX 11使用falseD3D11_CULL_BACK以上参数。所以它认为顺时针的原始图像是前面的,并且选择逆时针的原始图像,考虑后面。

备注:为了更好地理解剔除,请在纸片的两侧画一个三角形,就好像从不同侧面看到相同的三角形一样。在每个顶点附近放置索引(纸张两侧都相同)。绘制一个显示收卷顺序的圆形箭头。将它与你的网格进行比较。那么,你必须使用哪种缠绕顺序和扑杀才是显而易见的。

来源:

MSDN的DirectX参考页:

+0

不,不适合我。 – user3476584

+0

@ user3476584向我们展示更多代码和截图,否则我们无法提供帮助。你是如何设置光栅化的? – Drop