今天把一个使用OpenGL绘图的状态机搞定了。主要就是合并相同属性的图形,减少glDrawArrays的调用次数,以达到提高运行速度的目的。调试时,注意从简单到复杂。最简单的情形即是不合并图形,与原算法一致,如果这样都不正确,就先要查这个层次的问题。逐渐增加算法的复杂度,这样可以缩小每步中解决问题的难度。
使用glTexSubImage可以只更新一部分纹理数据,减少调用glTexImage2D所产生的创建纹理和更新全部纹理数据的开销。如果每次都只是更新一少部分纹理(包括第一次都不想提交所有数据),可以如下操作:
glBindTexture(GL_TEXTURE_2D, curTexID);
if (used > 0)
{
glTexSubImage2D(GL_TEXTURE_2D, 0, xoff, yoff,
subw, subh,
GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT,
(void*)subbuf);
}
else
{
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
w, h, 0,
GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT,
(void*)(NULL));
glTexSubImage2D(GL_TEXTURE_2D, 0, xoff, yoff,
subw, subh,
GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT,
(void*)subbuf);
used++;
}
有个疑问:glTexSubImage中,data是一块连续的数据,不知OpenGL可否用一块矩形区域的缓存来更新纹理?即指定目标区域起始坐标和宽高的同时,在源数据中也可以指定起始坐标和宽高?