我在教程中读到,顶点着色器需要的最低限度定义如下:
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,则它可能不适用于您的情况。另请注意,您可以同时使用这两种方法。例如。即使您显式定义布局,它也不会限制您稍后查询它们。
关于c++ - OpenglES 2.0 顶点着色器属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30531729/