|
opengl只需要用glVertex3i或者glVertex3f,在d3d里面我需要先填充IDirect3DVertexBuffer8结构,然后调用SetStreamSource()梆定顶点缓冲,调用DrawPrimitive绘制设定的那些顶点。关键是做四叉树lod的时候,用triangle-fan方式绘制顶点,因此渲染一个网格,定义中心点和四个角点,在opengl里面只需要:
glBegin( GL_TRIANGLE_FAN );
SetTextureCoord(x1,x2);
glVertex3i(v1,v2,v3);
//类似省略
glEnd();
而在d3d中,就必须这么做(“填充结构、设定stream源、绘制顶点”全部完成):
m_pVertexBuffer->Lock(0, sizeof(cvVertices), (BYTE**)&pVertices, 0);
memcpy(pVertices, cvVertices, sizeof(cvVertices)); //假设cvVertices已经填充好顶点信息了
m_pVertexBuffer->Unlock();
m_pD3DDevice->SetStreamSource(0, m_pVertexBuffer, sizeof(CUSTOMVERTEX));
m_pD3DDevice->SetVertexShader(D3DFVF_CUSTOMVERTEX);
m_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLEFAN , fc , fd);
关键是调用DrawPrimitive的话,d3d就开始执行绘图了,这样在lod中要是递归调用DrawPrimitive很多次,肯定效率特别低。
注意:由于triangle-fan的中心是会变化的,因此如果想把所有的顶点都灌到一个IDirect3DVertexBuffer8结构中的话,又无法实现中心点会变化的triangle-fan。总不能够对应一个网格就做一个IDirect3DVertexBuffer8结构来存储吧?无论怎样,都特别消耗资源,不如opengl来的简单高效? |
|