我在教程中已经读到,顶点着色器所需的最低要求定义如下:
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, ...);
您还可以在创作着色器时显式设置属性的布局(如@jp的注释所示),因此您可以像这样修改着色器:
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,则可能不适用于您的情况。另外,请注意,您可以同时使用这两种方法。例如。即使您明确定义布局,也不会限制您以后查询它们。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句