当尺寸不匹配时,OpenGL ES属性转移默认行为

时间:2015-07-09 13:32:54

标签: opengl-es

运行一个非常简单的OpenGL ES示例我已经看到顶点着色器中的position属性的尺寸和用于将属性数据传输到GPU的尺寸不同,但示例运行正确。

这是顶点着色器中的属性声明:

attribute vec4 a_v4Position;

这就是属性值的转移方式:

const float triangleVertices[] =
{
     0.0f,  0.5f, 0.0f,
    -0.5f, -0.5f, 0.0f,
     0.5f, -0.5f, 0.0f,
};

positionAttribLocation = glGetAttribLocation(GLProgram, "a_v4Position"); //GLProgram is the linked program
glEnableVertexAttribArray(positionAttribLocation);
glVertexAttribPointer(positionAttribLocation, 3, GL_FLOAT, GL_FALSE, 0, TriangleVertices);

那么,为什么这个工作正常,哪个是" w"此过程产生的默认值?

1 个答案:

答案 0 :(得分:1)

在这种情况下,w的值将为1.0。这是完全合法且定义明确的。只要指定的属性具有的值小于4,就会使用(0.0,0.0,0.0,1.0)中的值填充缺失值。当然,如果顶点着色器中的属性向量较短,则不会使用所有这些值。

相关规范语言位于ES 2.0规范的第21页,在#34;传输数组元素"

  

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