我正在努力为我的几何体应用颜色。当我在顶点着色器中直接指定它时(" varColor = vec4(1.0,0.5,0.4,1.0);" ) - 一切正常。但是,如果我使用" vColor "中的颜色值。 attribue - 一切都搞砸了。
(添加了一些截图以显示我的意思)
有人可以帮助我弄清楚我做错了什么,或者指出我的方向是正确的吗?感谢。
使用" 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);
答案 0 :(得分:2)
您需要在链接着色器程序之前进行glBindAttribLocation()
来电。
如果链接程序时未在着色器代码中使用glBindAttribLocation()
或layout
限定符指定属性的位置,则在着色器程序链接时将自动分配属性位置。如果您在链接程序后致电glBindAttribLocation()
,则只有再次链接着色器程序时,新位置才会生效。