Android 在OpenGL ES 2.0中管理颜色数据

Android 在OpenGL ES 2.0中管理颜色数据,android,opengl-es-2.0,shader,Android,Opengl Es 2.0,Shader,如何将颜色应用于每个顶点,而不是对每个顶点重复相同的颜色数据?我将顶点位置和纹理坐标都存储在一个缓冲区中,因为它们不同,但我希望颜色相同 下面是我如何定义一个顶点: vertexData[++vOffset] = position.x; vertexData[++vOffset] = position.y; vertexData[++vOffset] = position.z; vertexData[++vOffset] = texture.x; vertexData[++vOffset] =

如何将颜色应用于每个顶点,而不是对每个顶点重复相同的颜色数据?我将顶点位置和纹理坐标都存储在一个缓冲区中,因为它们不同,但我希望颜色相同
下面是我如何定义一个顶点:

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 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);