因为渲染函数需要通过viewing frustum,你需要一条重载视角范围距离的路。如果你想画出网格的一部分,可以通过制定到视点的距离。比如,如果frustum可以看到20000单位,但你逆袭那个渲染5000单位的多边形,那么指定5000到ZDistance。
Render函数开始与计算viewing frustum和锁定顶点缓冲:
BOOL cNodeTreeMesh::Render(cFrustum *Frustum, float ZDistance) { D3DXMATRIX Matrix; // Matrix used for calculations cFrustum ViewFrustum; // Local viewing frustum // Error checking if(m_Graphics==NULL || m_ParentNode==NULL || !m_NumPolygons) return FALSE; // Construct the viewing frustum (if none passed) if((m_Frustum = Frustum) == NULL) { ViewFrustum.Construct(m_Graphics, ZDistance); m_Frustum = &ViewFrustum; } // Set the world transformation matrix to identity so that // level mesh is rendered around the origin it was designed. D3DXMatrixIdentity(&Matrix); m_Graphics->GetDeviceCOM()->SetTransform(D3DTS_WORLD,&Matrix); // Lock vertex buffers for(unsigned long i=0;i<m_NumGroups;i++) { m_Groups[i].VertexBuffer.Lock(0,0); m_Groups[i].VertexPtr = / (char*)m_Groups[i].VertexBuffer.GetPtr(); m_Groups[i].NumPolygonsToDraw = 0; } m_Mesh->m_Mesh->LockVertexBuffer(D3DLOCK_READONLY, / (BYTE**)&m_VertexPtr); |
在这一点,纹理组顶点缓冲被锁定并准备接收从锁定的资源网格顶点缓冲中的顶点信息(重调用AddNode函数).每个纹理组包含要绘出的多边形数量,并且执行下面的代码,所有的在view中的多边形被增加到纹理组的顶点缓冲。砸那是,所有锁定的顶点缓冲被解锁
// Store current time of render m_Time = timeGetTime(); // Add all polygons to vertex buffer AddNode(m_ParentNode); // Unlock vertex buffers and draw m_Mesh->m_Mesh->UnlockVertexBuffer(); for(i=0;i<m_NumGroups;i++) { m_Groups[i].VertexBuffer.Unlock(); if(m_Groups[i].NumPolygonsToDraw) { m_Graphics->GetDeviceCOM()->SetMaterial( / &m_Mesh->m_Materials[i]); m_Graphics->GetDeviceCOM()->SetTexture(0, / m_Mesh->m_Textures[i]); m_Groups[i].VertexBuffer.Render(0, / m_Groups[i].NumPolygonsToDraw, D3DPT_TRIANGLELIST); } } return TRUE; } |