0

我是 OpenGL ES 的新手。我正在尝试构建一个不使用任何手册、教程的球体......

我成功地实现了我的目标。我可以使用 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)));

那就是我将字节更改为短的地方。

GitHub 上的当前项目

我应该怎么办?

这是我将字节更改为短的图片

格鲁短 格鲁字节

4

1 回答 1

4

看起来您忘记更改以下行:

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

这表明有许多索引要渲染,每个索引都是一个无符号字节的大小(很可能是 8 位,但实际数字是特定于平台的……虽然它不是 8 位的非常非常罕见) . 但是,您已经填充了一个无符号短裤大小的索引数组(可能是 16 位),因此最终会发生的是您的每个数字都将被读取两次。一次是“第一个”8 位,一次是“第二个”(字节序将确定是高位还是低位在前)。由于你的很多索引(大多数?)都低于 255,那么会有很多顶点变成“0”,因为高 8 位都是 0。最重要的是,你只会渲染一半你的指数。

因此,您需要向 OpenGL 表明它需要将这些索引绘制为无符号短裤,而不是将上述行更改为:

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

于 2012-12-04T08:35:01.417 回答