用OpenGL ES结合大量纹理图谱绘制调用
我有一个很大的纹理地图集,我从屏幕上绘制了很多纹理。 目前,地图集中的每个纹理都是用这样的代码分别绘制的:
GLfloat coordinates[] = { bla, bla, bla, bla, bla, bla, bla, bla }; GLfloat vertices[] = { bla, bla, bla, bla, bla, bla bla, bla, bla bla, bla bla }; glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, name); glVertexPointer(3, GL_FLOAT, 0, vertices); glTexCoordPointer(2, GL_FLOAT, 0, coordinates); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
所以我们用三角形条做这个。
现在,我试图通过保存坐标/顶点来缓存这些类型的调用,并在一次调用中将它们全部绘制出来。 但是OpenGL ES没有四边形,所以试图使用三角形条意味着该操作将它们合并在一起,并且您从前一点获得整个屏幕上的纹理变形。
我尝试过使用glDrawArrays和glDrawElements,但没有取得任何成功。 这甚至有可能吗?
你可以将每个四边形绘制为两个三角形(GL_TRIANGLES)吗? 当然,你的数组中会有重复的顶点和坐标。
你可以使用退化条。
在这种情况下,它几乎是没有意义的,因为每条只能保存两个顶点,但如果你获得更长的带子和更少的停止位置,在武器库中放置这种武器是很好的。
退化条是基于这样的事实,即硬件跳过面积为零的三角形,对于具有两个相同顶点的三角形,这是正确的。
(可怕的编码器ascii艺术来拯救。)
A--D
| /|
|/ |
B--C
E--H
| /|
|/ |
F--G
三角形
ABD DBC EFH HFG -> 12
Va = f(Q)= 6×Q
Trianglestrips
ABD C C E E F H G -> 10
ABD (BD)C (DC)C (CC)E (CE)E (EE)F (EF)H (FH)G
CCW CW CCW CW CCW CW CCW CW
NOR NOR DEG DEG DEG DEG NOR NOR
Vb = f(Q)= 4+(4 + 2)(Q-1)
Q | Va | Vb
1 | 6 | 4
2 | 12 | 10
3 | 18 | 16
10 | 60 | 58
从OpenGL 3.1开始,你可以简单地使用“Primitive Restart” ,这会让你的生活更轻松。
更改
glVertexPointer(3, GL_FLOAT, 0, vertices);
至
glVertexPointer(2, GL_FLOAT, 0, vertices);
并且它应该可以工作,假设你消除的三角形条纹是正确的。
链接地址: http://www.djcxy.com/p/33889.html上一篇: Combine lots of texture atlas draw calls with OpenGL ES