GLSL着色器无法从统一变量中渲染颜色

3

我目前在构建一个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


但屏幕上什么也没有显示,甚至不是黑色。这表明某处出现了错误。你检查过错误了吗? - Nicol Bolas
@NicolBolas: 我也是这么想的,当我创建着色器时没有收到任何明确的错误提示,而且由于我可以获取颜色统一变量的值,所以肯定是在后面的过程中出了问题。不幸的是,我不知道如何调试这个问题。也许在代码中使用 glGetError() 会有所帮助吗? - Jave
你应该使用 glGetError - Nicol Bolas
另外,你确实使用了这个程序,对吧?在调用渲染函数之前,你调用了glUseProgram吗?因为所有的glUniform函数都会修改当前正在使用的程序。 - Nicol Bolas
@NicolBolas:好的,我会在进一步测试后发布更新。是的,在任何操作之前,我确实调用了glUseProgram()(在我的上面的帖子中添加了那行代码)。 - Jave
@NicolBolas:我进行了一些错误搜索,最终找到了解决方法(请参见我的更新和回答)。感谢你的帮助。我从昨天开始就一直在苦苦挣扎 :P - Jave
2个回答

2

好的,我经过大量测试终于弄清楚了。


在我的代码中,我使用了多个着色器,但是我意外地只为一个着色器获取了mvpMatrix-uniform,并将其用于每个着色器,有趣的是,在创建此着色器之前,它对于我之前拥有的所有着色器都有效(对于所有早期着色器,它得到id 0)。


然而,对于这个着色器,我的新vec4得到了id 0,这导致代码错误地将我的向量数据分配给了mvp矩阵。为每个着色器获取新id使程序正常工作。


-4

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


如果colorIndex保存了它,那么它就不是未初始化的。然而,我没有以那种方式解释渲染代码,这可能是错误的。我仍然会尝试在着色器中初始化颜色向量,看看是否有任何效果。 - Tobias
colorindex变量持有一个有效值,因此它已经被正确初始化。 - Jave
@Tobias他在代码注释中明确写道,colorIndex来自于glGetUniformLocation(就像他在问题中所说的那样,返回0),并在glUniform4f中使用它。因此,我无法看出它如何以任何方式未初始化。当然,他必须相信自己的陈述,但是嗯。很可能猜测它确实未初始化,但整体而言不足以作为答案。一个注释显然已经足够澄清这些不确定的地方了。 - Christian Rau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接