OpenGL ES 2.0无法正确分配颜色属性

时间:2014-05-25 19:00:43

标签: android opengl-es glsl opengl-es-2.0

我正在努力为我的几何体应用颜色。当我在顶点着色器中直接指定它时(" varColor = vec4(1.0,0.5,0.4,1.0);" ) - 一切正常。但是,如果我使用" vColor "中的颜色值。 attribue - 一切都搞砸了。

添加了一些截图以显示我的意思

有人可以帮助我弄清楚我做错了什么,或者指出我的方向是正确的吗?感谢。

使用" varColor = vec4(1.0,0.5,0.4,1.0);" Using "varColor = vec4(1.0, 0.5, 0.4, 1.0);"

使用" varColor = vColor" Using "varColor = vColor"

顶点着色器:

precision mediump float;

uniform mat4 modelViewProjectionMatrix;

attribute vec4 vPosition;
attribute vec2 vTexCoord;
attribute vec4 vColor;

varying lowp vec4 varColor;
varying mediump vec2 varTexCoord;

void main()
{
    gl_Position = modelViewProjectionMatrix * vPosition;
    varTexCoord = vTexCoord;
//  varColor    = vColor;
    varColor    = vec4(1.0, 0.5, 0.4, 1.0);
}

片段着色器:

precision mediump float;

uniform sampler2D Texture0;

varying vec4 varColor;
varying vec2 varTexCoord;

void main() 
{
    gl_FragColor = texture2D(Texture0, varTexCoord) * varColor;
}

关联着色器后,我会像这样绑定我的属性:

mMatrixMVP = glGetUniformLocation(mProgramId, "modelViewProjectionMatrix");

glBindAttribLocation(mProgramId, 0, "vPosition");
glBindAttribLocation(mProgramId, 1, "vTexCoord");
glBindAttribLocation(mProgramId, 2, "vColor");

mTexture = glGetUniformLocation(mProgramId, "Texture0");
glUniform1i(mTexture, 0);

保存顶点信息的结构:

struct Vertex
{
   float         xyz[3];
   float         st[2];
   unsigned char color[4]; // All assigned to value of 255
};

渲染时,在绑定顶点缓冲区后,我设置顶点属性如下:

glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*) offsetof(Vertex, xyz));

glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*) offsetof(Vertex, st));

glEnableVertexAttribArray(2);
glVertexAttribPointer(2, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(Vertex), (GLvoid*) offsetof(Vertex, color));

glActiveTexture(GL_TEXTURE0);
pTexture->Bind(); // Just a "glBindTexture(GL_TEXTURE_2D, mTextureId);"
glUniform1i(mpCurrentShader->GetTexture(), 0);

在此之后,我将绑定索引缓冲区并调用" glDrawElements"。

然后,调用glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);并使用" glDisableVertexAttribArray"禁用所有属性最后 - 调用glBindBuffer(GL_ARRAY_BUFFER, 0);

1 个答案:

答案 0 :(得分:2)

您需要在链接着色器程序之前进行glBindAttribLocation()来电

如果链接程序时未在着色器代码中使用glBindAttribLocation()layout限定符指定属性的位置,则在着色器程序链接时将自动分配属性位置。如果您在链接程序后致电glBindAttribLocation(),则只有再次链接着色器程序时,新位置才会生效。