我在教程中读到顶点着色器需要的最小值是在下面定义:
attribute vec3 v3_variable;
attribute vec3 v3Pos;
void main()
{
gl_Position = v3Pos;
}
OpenglES将着色器顶点数据传递给v3Pos
,但此变量的名称实际上可以是任何内容,其他教程将其命名为a_Position
,a_Pos
,无论〜。
所以我的问题是,OpenglES如何知道当我致电glVertexAttribPointer()
时,它知道应该将这些数据放入v3Pos
而不是v3_variable
?
答案 0 :(得分:1)
好的,所以在应用方面你会看到一个看起来像
的电话glBindAttribLocation(MyShader, 0, "v3Pos");
(在链接着色器之前)或
vertexLoc = glGetAttribLocation(MyShader, "v3Pos");
链接程序后。
然后glVertexAttribPointer调用的第一个元素将是0或vertexLoc。
glVertexAttribPointer(vertexLoc, 3, GL_FLOAT, GL_FALSE, sizeof(MyVertex), BUFFER_OFFSET(0));
简而言之,gl链接器要么将v3Pos分配给它自己在内存中的位置,要么取消你所说的内容。无论哪种方式,您都必须与着色器执行一些交互才能与属性进行交互。
希望有所帮助
答案 1 :(得分:1)
有两种方法可以识别着色器中的哪些属性与您提供给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,它可能不适用于您的情况。另请注意,您可以同时使用这两种方法。例如。即使您明确定义了布局,也不会限制您以后查询它们。