|
我一开始创建了两个动态大的的Vertexbuffer和Indexbuffer,然后在渲染的时候锁和解锁,最后渲染,但是结果就是画面闪烁,三角形很乱。我用静态VB和IB时,虽然帧数低,但是画面算正常的。请大家帮忙:
下面是渲染代码:
STERRAIN_VERTEX * ptr = NULL;
WORD * idxptr = NULL;
ptr = (STERRAIN_VERTEX *)m_VB->Lock(m_dwLockVertexNum,m_fan.m_iVertexNum,0);
idxptr = (WORD *)m_IB->Lock(m_dwLockIndexNum,m_fan.m_iIndexNum,0);
memcpy((void*)ptr,m_fan.m_vertices,sizeof(STERRAIN_VERTEX)*m_fan.m_iVertexNum);
memcpy((void*)idxptr,m_fan.m_wIndices,sizeof(WORD)*m_fan.m_iIndexNum);
m_VB->UnLock();
m_IB->UnLock();
m_pD3DDevice->SetFVF(TERRAIN_VERTEX_FVF);
m_pD3DDevice->SetIndices(m_IB->GetIndexBuffer());
m_pD3DDevice->SetStreamSource(0,m_VB->GetVertexBuffer(),m_dwLockVertexNum,sizeof(STERRAIN_VERTEX));
m_pD3DDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,m_dwLockVertexNum,0,m_fan.m_iVertexNum,m_dwLockIndexNum,m_fan.m_iIndexNum/3);
/////////////////////////////
动态IndexBuffer的锁定函数
WORD *TBDynamicIB: ock(DWORD& dwOffset,DWORD dwIndicesNum,DWORD dwFlag/* =0*/)
{
WORD * pIndices;
if(m_dwNextLockOffset+dwIndicesNum <= m_dwIndicesNum)
{
dwFlag |= D3DLOCK_NOOVERWRITE;
dwOffset = m_dwNextLockOffset;
m_dwNextLockOffset += dwIndicesNum;
}
else
{
dwFlag |= D3DLOCK_DISCARD;
dwOffset = 0;
m_dwNextLockOffset = dwIndicesNum;
}
if(FAILED(m_pIB->Lock(dwOffset*sizeof(WORD),dwIndicesNum*sizeof(DWORD),(void**)&pIndices,dwFlag)))
{
return NULL;
}
return pIndices;
} |
|