【发布时间】: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