GLSL着色器不会从均匀变量渲染颜色

时间:2012-02-11 12:40:52

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

我目前正在为Android构建应用程序,但是在使用拒绝渲染的着色器时遇到了一些问题。

考虑以下片段着色器:

uniform vec4 color;
void main(){
    gl_FragColor = vec4(1.0);
}

此着色器适用于以纯色绘制对象(在本例中为白色)。统一向量color已经过优化,无法找到glGetUniformLocation()(返回-1)。

尝试从均匀变量中获取颜色可以这样做:

uniform vec4 color;
void main(){
    gl_FragColor = color;
}

然而,当我使用它时,没有任何渲染。着色器已成功创建,glGetUniformLocation()返回颜色的有效值(0)。但屏幕上没有任何显示,甚至没有黑色。唯一的更改是将vec4(1.0)替换为color。 此代码具有相同的结果:

uniform vec4 color;
void main(){
    gl_FragColor = vec4(1.0)+color;
}

奇怪的是,当我在另一个项目中尝试使用着色器时,它应该正常工作,因此问题必须是我在代码中的其他地方所做的事情。
这是我的绘图方法(请记住,当颜色变量不在着色器中时,它可以工作):

GLES20.glUseProgram(colorshader);
GLES20.glUniform4f(colorIndex, 1, 1, 1, 1); //colorIndex is the result of glGetUniformLocation() called with the correct shader index and variable name.

Matrix.multiplyMM(mvpMatrix, 0, vpMatrix, 0, matrix, 0);
GLES20.glUniformMatrix4fv(matrixindex, 1, false, mvpMatrix, 0);

GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vertices);
GLES20Fix.glVertexAttribPointer(Shader.ATTRIBUTE_VERTEX, 3, GLES20.GL_FLOAT, false, 12, 0);

GLES20.glLineWidth(width);
GLES20.GL_UNSIGNED_SHORT, 0);
GLES20.glDrawArrays(GLES20.GL_LINES, 0, count);

我完全不知道造成这种奇怪行为的原因,如果有人有任何想法或可能的解决方案,请帮助我。

更新
似乎使用任何不是采样器的统一变量会在此(并且只有此)着色器中导致此行为。

更新2 使用glGetError()返回错误代码502: GL_INVALID_OPERATION

2 个答案:

答案 0 :(得分:2)

好的,所以我在经过大量测试后终于弄清楚了 在我的代码中,我使用的是多个着色器,但我偶然只为一个着色器获得了mvpMatrix-uniform,并且每个着色器都使用了这个着色器,这非常有趣对于我创建这个着色器之前的所有着色器(它为所有早期着色器得到了id) 然而,使用这个着色器,似乎我的新vec4得到id 0,这导致代码错误地将我的矢量数据分配给mvp-matrix。为每个着色器获取新的ID使程序正常工作。

答案 1 :(得分:-4)

颜色未初始化,很可能是着色器中止。