用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

下一篇: Change texture opacity in OpenGL