GLubyte / GLushort使用问题

时间:2012-12-04 08:11:21

标签: objective-c ios opengl-es byte opengl-es-2.0

我是OpenGl ES的新手。我正在尝试建立一个不使用任何手册,tutrials的球体......

我已经成功实现了我的目标。我可以使用TRIANGLE_STRIP画一个球体。在绘图之前我指定的经线/水平线的数量。

当我有少于256个顶点索引时,一切正常。我尝试使用GLushort而不是GLubyte但是图片发生了很大变化。

GLubyte *Indices;
...
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLubyte) * (meridians * (horizontals * 2 + 2)), Indices, GL_STATIC_DRAW);
...
Indices = malloc(sizeof(GLubyte) * (meridians * (horizontals * 2 + 2)));

这就是我把字节改为短的地方。

Current project on GitHub

我该怎么办?

以下是我将字节更改为短

的图片

GLushort GLubyte

1 个答案:

答案 0 :(得分:4)

您似乎忘记更改以下行:

glDrawElements(GL_TRIANGLE_STRIP, (meridians * (horizontals * 2 + 2)), GL_UNSIGNED_BYTE, 0);

这表明有多个索引需要渲染,每个索引都是无符号字节的大小(最可能是8位,但实际数字是特定于平台的...非常非常非常不是8比特虽然)。但是,你已经填充了一些索引数组,这些索引的大小是无符号短路(大概是16位),所以最终会发生的是你的每个数字都将被读取两次。一次使用“第一个”8位,一次使用“第二个”(结束将确定高位或低位是否先出现)。由于很多索引(大多数?)都不到255,所以会有很多顶点变成“0”,因为高8位都是0.最重要的是,你只会渲染一半你的指数。

所以,你需要向OpenGL表明它需要将这些索引绘制为unsigned short而不是将上面的行更改为:

glDrawElements(GL_TRIANGLE_STRIP, (meridians * (horizontals * 2 + 2)), GL_UNSIGNED_SHORT, 0);