我目前在构建一个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
。
glGetError()
会有所帮助吗? - JaveglGetError
。 - Nicol BolasglUseProgram
吗?因为所有的glUniform
函数都会修改当前正在使用的程序。 - Nicol BolasglUseProgram()
(在我的上面的帖子中添加了那行代码)。 - Jave