在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组件?
答案 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,则指定所有组件。