在OpenGL ES 2.0中管理颜色数据

3

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

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)?
1个回答

2

有几个选项可供选择。最明显的是,您可以使用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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接