|
|
以前一直用OpenGL的,很少用D3D,现在D3D10大有一统江湖之势,所以想把自己做的一个OpenGL的3DRPG游戏改成D3D的,我本来认为问题不大,但发现最大的难度恰恰在最基本的绘制图元的函数上。
我发现D3D的渲染图元函数灵活性好象不大好,要绘制一组图元(primitive)之前,必须要把所有顶点的信息提前定义到一个顶点缓冲区中,然后才是DrawPrimitive()绘制图元。如果要绘制的图形是简单一些的图形还好,比如常看到的D3D教学用的画立方体等。
但困惑的难题就是,在渲染过程中,如果顶点的位置是不断变化的怎么办?比如Doom3的md5骨骼动画,顶点是经过每一帧骨骼转动后计算出来的,每一次顶点都不固定。难道不断的在渲染时调用Lock()和UnLock()拷贝顶点到顶点缓冲,然后再渲染出来,加锁和解锁是需要相当的时间的,这样动画岂不是停顿的很厉害?
第二个例子:纹理坐标也是必须提前拷贝到顶点缓冲的,但是比如一个天空的纹理,要想用纹理坐标值改变的方法绘制天空上浮动的云,是不是要不断的变换顶点缓冲区中的顶点坐标数值?
OpenGL中有顶点数组,就类似于D3D的顶点缓冲。但是OpenGL中有最简单基础的绘图函数
glBegan(GL_TRIANGLESTRIP)
glVertex3f(float x , float y ,float z)
glVertex3f(float x , float y ,float z)
glVertex3f(float x , float y ,float z)
glVertex3f(float x , float y ,float z)
glEnd()
只要输入四个顶点的坐标就能绘制出一个三角形带来,这样遇到不断变化的顶点时更改里面的顶点坐标值就可以了,不用先拷贝一个数组中的数据到顶点缓冲区,还要加锁解锁的。
不知道D3D有没有类似于glVertex这样直接用顶点数值绘图的函数?
难道在D3D中渲染图形必须要遵循
1 定义数组 2. 将数组中的数据加锁后拷贝到顶点缓冲,然后解锁 3.用DrawPrimitive或是索引缓冲绘制
请高人指教,小弟改造好后会把代码和大家共享的。
|
|