2012-02-11 94 views
2

我目前正在为Android构建一个应用程序,但遇到了一些拒绝渲染的着色器的问题。GLSL着色器不会渲染统一变量的颜色

考虑以下片段着色器:

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

此着色器工作正常在纯色绘制对象(在这种情况下的白色)。统一矢量color已被优化,并且无法使用glGetUniformLocation()(返回-1)找到。

试图从统一的可变颜色可以做到像这样:

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

然而,当我用这个,没什么渲染。着色器已成功创建,并且glGetUniformLocation()为颜色返回有效值(0)。但屏幕上没有显示,甚至没有显示黑色。唯一的改变是用color代替vec4(1.0)。 这段代码有相同的结果:

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

+0

“但屏幕上没有显示,甚至没有显示黑色。”这表明某处存在错误。你检查错误吗? – 2012-02-11 16:07:49

+0

@NicolBolas:我的想法是,我在创建着色器时没有遇到任何明确的错误,并且因为我可以为颜色统一获得一个值,所以它在过程中稍后会出错。不幸的是我不知道如何调试。 'glGetError()'可能对代码有帮助吗? – Jave 2012-02-11 17:06:29

+0

'glGetError'就是你应该使用的。 – 2012-02-11 17:07:45

回答

1

好的,所以我终于在经过一系列测试后才发现它。
在我的代码,我用多个着色器,但我不得不小心只得到了mvpMatrix均匀的一个着色器,并使用一个为每个着色器,其中有趣的是工作了的所有着色器我创建这个有过一个(它为所有较早的着色器获得了0)。
但是,使用这个着色器,我的新vec4似乎有id 0,导致代码错误地将我的矢量数据分配给mvp矩阵。为每个着色器获取新的ID可以使程序起作用。

-4

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

+0

它以哪种方式单元化? – 2012-02-11 16:20:34

+0

如果colorIndex持有它,它不是未初始化的。但是,我没有这样解释渲染代码,这可能是错误的。我仍然会尝试在着色器中初始化颜色矢量以查看是否有任何效果。 – Tobias 2012-02-11 16:41:51

+0

colorindex为变量保存一个有效值,因此它被正确初始化。 – Jave 2012-02-11 17:07:35