OpenGL-ES 2如何组装原语?

有两件事我很困惑。

1)OpenGL ES 2.0在调用顶点着色器之前创建图元。 那为什么不自动提供顶点着色器的顶点位置呢?

2)OpenGL ES 2.0支持glDrawElements() ,但不支持glEnableClientState()GL_VERTEX_ARRAY ,那么这个调用怎么可能用来构造原语呢?

注意:这是OpenGL ES 2.0,不是正常的OpenGL!

谢谢!

parsing度:

我认为我的困惑是源于内置的variablesgl_Vertex,即某些版本的GLSL支持(根据一些消息来源,我在http://www.opengl.org/sdk/docs/manglsl官方文档中找不到这个) / ),它给你提供给绘图命令的向量的位置。 这在GL ES中不存在。 此外,我的代码没有工作,因为GLSL可能很难debugging,我不知道发生了什么:)

在这种情况下,使用顶点属性并传递顶点的模型空间位置,我的变换matrix允许我正确地变换顶点。

1:在调用顶点着色器之前,基元不是“创建”的。 原始程序集是顶点着色器执行后的管道的一部分。 使用传递给glDraw *的参数,由顶点着色器输出的顶点数据组被用于创建基元,然后被剪切,剔除和栅格化。

没有“顶点的位置”属性。 这是因为顶点着色器是任意代码 。 他们采取任何你想要他们的属性,这些属性有你的代码希望他们有什么意思。 如果你想要一个位置值作为属性,在你的着色器中命名它的position

顶点着色器需要在剪辑空间中输出位置,但顶点着色器如何创建数据由着色器决定。 它可以对属性做一些matrix变换,这是典型的方法。 但它也可以做更多武断的事情。 根据您在ES 2.0实现中可用的扩展名,它可以从纹理中获取数据来计算位置。 它可以使用Perlin噪声函数来生成高度图的高度。 等等。

2:你正在寻找的function是glEnableVertexAttribArraysglDisableVertexAttribArrays

这是OpenGL ES 2.0,不是普通的OpenGL!

这可能是,因为你所问的在桌面GL和GL-ES 2.0之间是不一样的。

2)你必须使用glVertexAttribPointer()提供顶点。 您可以将顶点存储在系统内存或VBO中。