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