有两件事我很困惑。
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是glEnableVertexAttribArrays
和glDisableVertexAttribArrays
。
这是OpenGL ES 2.0,不是普通的OpenGL!
这可能是,因为你所问的在桌面GL和GL-ES 2.0之间是不一样的。
2)你必须使用glVertexAttribPointer()提供顶点。 您可以将顶点存储在系统内存或VBO中。