我已经阅读了教程,下面定义了顶点着色器的最低要求:
attribute vec3 v3_variable;
attribute vec3 v3Pos;
void main()
{
gl_Position = v3Pos;
}
OpenglES将着色器顶点数据传递到v3Pos
,但此变量的名称实际上可以是任何东西,其他教程将其命名为a_Position
,a_Pos
,无论如何〜。
所以我的问题是,OpenglES如何知道当我调用glVertexAttribPointer()
时它知道应该将数据放入v3Pos
而不是v3_variable
?
有两种方法可以识别着色器中的哪些属性与提供给glVertexAttribPointer
的数据“配对”。您通过glVertexAttribPointer
获得的唯一标识符是index
(第一个参数),因此必须以某种方式通过索引来完成。
在第一种方法中,使用glGetAttribLocation编译并链接了着色器后,从着色器中获取属性的索引,并将其用作第一个参数,例如。>
GLint program = ...; GLint v3PosAttributeIndex = glGetAttribLocation(program, "v3Pos"); GLint v3varAttributeIndex = glGetAttribLocation(program, "v3_variable"); glVertexAttribPointer(v3PosAttributeIndex, ...); glVertexAttribPointer(v3varAttributeIndex, ...);
您还可以在编写着色器时显式设置属性的布局(如@ j-p的注释所示,因此您可以像这样修改着色器:
layout(location = 1) in vec3 v3_variable; layout(location = 0) in vec3 v3Pos;
然后在代码中,您将对其进行显式设置:
glVertexAttribPointer(0, ...); // v3Pos data glVertexAttribPointer(1, ...); // v3_variable data
此第二种方法仅在GLES 3.0+(和OpenGL 3.0+)中有效,因此,如果仅使用GLES 2.0,则可能不适用于您的情况。另外,请注意,您可以同时使用这两种方法。例如。即使您明确定义布局,也不会限制您以后查询它们。
好的,因此在应用程序端,您会看到一个看起来像任何一个的电话
关于OpenGL ES 2.0:在将它们在片段/几何着色器中引用之前,是否必须将所有属性(顶点/颜色/法线/ texcoords)都放在顶点着色器中,否则您无法列出其中一些顶点着色器中的属性(即颜色/ texcoords)并在以后引用它们(例如在片段着色器中)?