【问题标题】:OpenGL ES 2.0 Failing to correctly assign the color attributeOpenGL ES 2.0 无法正确分配颜色属性
【发布时间】:2014-05-25 19:00:42
【问题描述】:

我在为几何图形应用颜色时有些吃力。当我直接在顶点着色器中指定它时 ("varColor = vec4(1.0, 0.5, 0.4, 1.0);") - 一切正常。但是,如果我使用“vColor”属性中的颜色值 - 一切都会搞砸。

添加了一些截图来说明我的意思

有人可以帮我找出我做错了什么,或者指出我正确的方向吗?谢谢。

使用“varColor = vec4(1.0, 0.5, 0.4, 1.0);”

使用“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);

【问题讨论】:

  • 如果我正确理解你的截图,你的纹理坐标有问题,而不是(或除了)顶点颜色有问题。实际上使用着色器中的顶点属性会使其激活,并会改变自动分配的位置。

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


【解决方案1】:

您需要链接着色器程序之前进行glBindAttribLocation() 调用。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多