我目前正在为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
。
答案 0 :(得分:2)
好的,所以我在经过大量测试后终于弄清楚了 在我的代码中,我使用的是多个着色器,但我偶然只为一个着色器获得了mvpMatrix-uniform,并且每个着色器都使用了这个着色器,这非常有趣对于我创建这个着色器之前的所有着色器(它为所有早期着色器得到了id) 然而,使用这个着色器,似乎我的新vec4得到id 0,这导致代码错误地将我的矢量数据分配给mvp-matrix。为每个着色器获取新的ID使程序正常工作。
答案 1 :(得分:-4)
颜色未初始化,很可能是着色器中止。