比如绘制一个rect,通常方法
vertexbuffer->lock();
fillRectVertex();
vertexbuffer->unlock();
setTexture();
drawprimitive();
绘制多个2d元素时效率很低。其原因是lock/unlock多次调用
改进方法:
2d元素绘制
使用一个统一的内存buffer和命令记录。
绘制时先把顶点数据填充到buffer,填充命令记录,包含当前元素的shader,vertex idx/size,primitive type.
真正绘制时,copy buffer到顶点缓冲,然后执行命令记录(设置shader,drawprimitive(idx,size)),这里可以合并相邻的同类命令(shader和primitive type相同的连续命令,比如drawtext)
这里的shader包含类型有 texture,texture blend(无ps的话),ps/vs,以及ps/vs相关的 变化脚本(比如做一个游戏图标,由2层纹理混合,其中一层不停旋转)
如果有必要,还可以使用z坐标标注命令顺序。执行前先对命令进行排序 (半透明元素最后绘制).减少render state切换.
绘制2d元素的3种方法。
先绘制所有3d元素,然后绘制2d前可以clear z,然后就可以用z缓冲了
1. 使用POTION_T的顶点格式,跳过world/view变化,顶点坐标为像素坐标。
2. 使用identity的world/view 矩阵,关闭光照, 顶点坐标为 x[-1,1],y[-1,1],上方和右方为正,原点在屏幕/窗口中心。这个方法的好处是绘制图形是按百分比来计算的,和分辨率无关。
3. 使用vs,跳过world/view变化,和2类似效果,另外还可以增加一些简单的动画。
比如一个旋转的风车,直接变化texture的u/v