|
我在写一个LOD + 四叉树的地形的时候发现我的渲染有问题,我是先把所有的顶点计算好,然后再用索引来指定要渲染的顶点(以前是一边采取点,一边渲染),但是在渲染的时候出现了问题,于是我把它给简化了下
我建立了 25 个顶点 如下
m_pDevice->CreateVertexBuffer(
sizeof(Vertex) * m_width*m_height,
0,
FVF_VERTEX,
D3DPOOL_MANAGED,
&m_pVertexBuf,
0);
for(int i = 0; i < m_height; i++)
{
for(int j = 0; j < m_width; j++)
{
int m = i * m_width + j;
vb[m] = Vertex(j * 10,
height,
i * 10,
j * uCellSize,
i * vCellSize);
}
}
然后用索引的方式来指定要渲染的顶点,渲染的代码如下
这个是其中的一个渲染,9个顶点,8个三角型组成的一个扇型,我创建了24个索引,其中当下面的X,Z为(3,1)时可以显示
图形,但是为(1,3)却不行
m_pDevice->CreateIndexBuffer(24 * sizeof(WORD),
0,
D3DFMT_INDEX16,
D3DPOOL_MANAGED,
&m_pIndexBuf,
0);
m_pIndexBuf->Lock(0, 0, (void**)&ib, 0);
// x, z是扇型的中心
ib[0] = z * m_width + x;
ib[1] = (z + 1) * m_width + x - 1;
ib[2] = (z + 1) * m_width + x;
ib[3] = z * m_width + x;
ib[4] = (z + 1) * m_width + x;
ib[5] = (z + 1) * m_width + x + 1;
ib[6] = z * m_width + x;
ib[7] = (z + 1) * m_width + x + 1;
ib[8] = z * m_width + x + 1;
ib[9] = z * m_width + x;
ib[10] = z * m_width + x + 1;
ib[11] = (z - 1) * m_width + x + 1;
ib[12] = z * m_width + x;
ib[13] = (z - 1) * m_width + x + 1;
ib[14] = (z - 1) * m_width + x;
ib[15] = z * m_width + x;
ib[16] = (z - 1) * m_width + x;
ib[17] = (z - 1) * m_width + x -1;
ib[18] = z * m_width + x;
ib[19] = (z - 1) * m_width + x - 1;
ib[20] = z * m_width + x - 1;
ib[21] = z * m_width + x;
ib[22] = z * m_width + x - 1;
ib[23] = (z + 1) * m_width + x - 1;
m_pIndexBuf->Unlock();
m_pDevice->SetTexture(0, m_dxTexture);
m_pDevice->SetStreamSource(0, m_pVertexBuf, 0, sizeof(Vertex));
m_pDevice->SetIndices(m_pIndexBuf);
m_pDevice->SetFVF(FVF_VERTEX);
m_pDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 9, 0, 8);
但是看不到效果,然后我做了个测试,连这样的索引都没有用
m_pIndexBuf->Lock(0, 0, (void**)&ib, 0);
ib[0] = 0;
ib[1] = 12;
ib[2] = 4;
ib[3] = 12;
ib[4] = 20;
ib[5] = 24;
m_pIndexBuf->Unlock();
m_pDevice->SetTexture(0, m_dxTexture);
m_pDevice->SetStreamSource(0, m_pVertexBuf, 0, sizeof(Vertex));
m_pDevice->SetIndices(m_pIndexBuf);
m_pDevice->SetFVF(FVF_VERTEX);
m_pDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 5, 0, 2);
上面的渲染方式也看不到图形,真是不知道怎么的,谢谢各位帮忙 |
|