OpenGL ES 2.0指定位置属性vec3或vec4

时间:2011-12-18 13:10:36

标签: android iphone opengl-es-2.0 shader

在OpenGL ES 2.0简介中,可在此处找到:http://www.webreference.com/programming/opengl_es/2.html 定义了一个顶点着色器:

GLbyte vShaderStr[] =
   "attribute vec4 vPosition;   \n"
   "void main()                 \n"
   "{                           \n"
   "   gl_Position = vPosition; \n"
   "};                          \n";

vPosition属性是一个四分量向量。

稍后在文本中,应用程序将与片段着色器一起编译顶点着色器。 使用glBindAttribLocation建立一个句柄,将应用程序顶点数据传递给着色器:

// Bind vPosition to attribute 0
glBindAttribLocation(programObject, 0, "vPosition");

现在链接了2个着色器,程序已准备好使用。

用例是这样的:

GLfloat vVertices[] = {0.0f, 0.5f, 0.0f,
                        -0.5f, -0.5f, 0.0f,
                        0.5f, -0.5f, 0.0f};
...
// Load the vertex data
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, vVertices);
glEnableVertexAttribArray(0);
glDrawArrays(GL_TRIANGLES, 0, 3);

这意味着:

  • glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, vVertices): 将顶点数据传递给程序,使用位置0,每个顶点有3个组件,类型为float,不使用规范化。

  • glEnableVertexAttribArray(0): 着色器将使用传递的数据。

  • glDrawArrays(GL_TRIANGLES, 0, 3);: 着色器将使用在指定数组中找到的第一个(也是唯一的)三个顶点执行代码以绘制单个三角形。

我的问题是:

  • 顶点着色器期望四个组件的顶点位置(x,y,z,w),程序只传递三个组件(x,y,z)数据 为什么会这样?

  • 着色器需要一个vec4,w组件必须为1才能按预期工作。 哪个步骤负责正确添加w组件?

1 个答案:

答案 0 :(得分:18)

请参阅此答案:Can you use glVertexAttribPointer to assign a smaller vector to a larger one?

如该帖所述,它出现在gles规范中:http://www.khronos.org/registry/gles/specs/2.0/es_full_spec_2.0.24.pdf
在本文件的第2.8节中,它说:

  

当数组元素i被DrawArrays传递给GL时   DrawElements命令,每个通用属性扩展为四个   组件。如果size是1,那么属性的x分量是   由数组指定;隐式设置y,z和w分量   分别为零,零和一。如果大小是2那么x和y   属性的组件由数组指定; z和w   组件分别隐式设置为零和一。如果大小   是三,然后指定x,y和z,并将w隐式设置为   一。如果size为4,则指定所有组件。