运行一个非常简单的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"此过程产生的默认值?
答案 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,则指定所有组件。