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

Gis*_*ela 7 iphone shader android opengl-es-2.0

在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";
Run Code Online (Sandbox Code Playgroud)

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

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

// Bind vPosition to attribute 0
glBindAttribLocation(programObject, 0, "vPosition");
Run Code Online (Sandbox Code Playgroud)

现在链接了两个着色器,程序已准备就绪.

用例是这样的:

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);
Run Code Online (Sandbox Code Playgroud)

意思是:

  • 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组件?

Jav*_*ave 18

看到这个答案:你能使用glVertexAttribPointer将较小的向量分配给较大的向量吗?

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

当通过DrawArrays或DrawElements命令将数组元素i传送到GL时,每个通用属性将扩展为四个组件.如果size为1,则属性的x分量由数组指定; y,z和w分量分别隐式设置为零,零和一.如果size为2,则属性的x和y分量由数组指定; z和w组件分别隐式设置为零和一.如果size为3,则指定x,y和z,并将w隐式设置为1.如果size为4,则指定所有组件.