在 OpenGL ES 2.0 中管理颜色数据

Managing Color Data in OpenGL ES 2.0

与其为每个顶点一遍又一遍地重复相同的颜色数据,不如如何将颜色应用到每个顶点?我将顶点位置和纹理坐标全部存储在一个缓冲区中,因为它们各不相同,但我希望颜色相同。
下面是我如何定义一个顶点:

vertexData[++vOffset] = position.x;
vertexData[++vOffset] = position.y;
vertexData[++vOffset] = position.z;
vertexData[++vOffset] = texture.x;
vertexData[++vOffset] = texture.y;
vertexData[++vOffset] = r;
vertexData[++vOffset] = g;
vertexData[++vOffset] = b;
vertexData[++vOffset] = a;

我尝试将 RGBA 存储在一个浮点缓冲区中并像这样应用它:

vertexBuffer.position(0);
GLES20.glEnableVertexAttribArray(GLShader.mPositionHandle);
GLES20.glVertexAttribPointer(GLShader.mPositionHandle, 3, GLES20.GL_FLOAT, false, 36, vertexBuffer);

vertexBuffer.position(3);
GLES20.glEnableVertexAttribArray(GLShader.mTexCoordLoc);
GLES20.glVertexAttribPointer(GLShader.mTexCoordLoc, 2, GLES20.GL_FLOAT, false, 36, vertexBuffer);

colorBuffer.position(0);
GLES20.glEnableVertexAttribArray(GLShader.mColorHandle);
GLES20.glVertexAttribPointer(GLShader.mColorHandle, 4, GLES20.GL_FLOAT, false, 0, colorBuffer);

此外,如何设置着色器,以便在没有颜色输入时默认为 (1,1,1,1)?

有几个选项。最明显的一个是您使用 uniform 而不是 attribute 颜色值。片段着色器代码中的声明可能如下所示:

uniform vec4 Color;

然后使用 glUniform*() 调用之一设置颜色,例如:

// One time, after shader has been linked.
int colorLoc = GLES20.glGetUniformLocation(progId, "Color");

// Every time you want to change color.
GLES20.glUniform4fv(colorLoc, colorR, colorG, colorB);

但是,您也可以继续使用某个属性,并使用以下方法将其设置为常量值:

GLES20.glVertexAttrib4f(GLShader.mColorHandle, colorR, colorG, colorB);

要使用它,必须禁用相应的顶点数组。因此,如果您之前启用了它,则需要将其禁用:

GLES20.glDisableVertexAttribArray(GLShader.mColorHandle);