OpenglES 2.0顶点着色器属性

时间:2015-05-29 14:07:24

标签: c++ opengl-es shader vertex

我在教程中读到顶点着色器需要的最小值是在下面定义:

attribute vec3 v3_variable;
attribute vec3 v3Pos;

void main()
{
    gl_Position = v3Pos;
}

OpenglES将着色器顶点数据传递给v3Pos,但此变量的名称实际上可以是任何内容,其他教程将其命名为a_Positiona_Pos,无论〜。

所以我的问题是,OpenglES如何知道当我致电glVertexAttribPointer()时,它知道应该将这些数据放入v3Pos而不是v3_variable

2 个答案:

答案 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,它可能不适用于您的情况。另请注意,您可以同时使用这两种方法。例如。即使您明确定义了布局,也不会限制您以后查询它们。