这应该是一项简单的任务,但我失败了。首先是坦白:我对OpenGL知之甚少,而且我学到的一些东西来自各种教程(其中一些可能已经过时和弃用)
我正在尝试使用运行时定义的单一颜色绘制四边形。四边形以正确的大小和位置绘制,但颜色错误。这是我的顶点和片段着色器:
public static final String VS_SOLIDCOLOR =
"uniform mat4 uMVPMatrix;" +
"attribute vec4 aPosition;" +
"attribute vec4 aColor;" +
"varying vec4 vColor;" +
"void main() {" +
" gl_Position = uMVPMatrix * aPosition;" +
" vColor = aColor;" +
"}";
public static final String FS_SOLIDCOLOR =
"precision mediump float;" +
"varying vec4 vColor;" +
"void main() {" +
" gl_FragColor = vColor;" +
"}";
颜色设置如下(我已经删除了gl错误检查并检查了colorHandle == -1):
float r = 1.0f;
float g = 0.0f;
float b = 0.0f;
float a = 1.0f;
final int colorHandle = GLES20.glGetAttribLocation(shaderProgramSolidColor, "aColor");
GLES20.glVertexAttrib4f(colorHandle, r, g, b, a);
我原本期望上面的代码会产生纯红色三角形,但最终会变成纯黄色。根据我的阅读,片段着色器将插入vColor向量,但我不想要(并且我不确定为什么它最终变为黄色)。如何在运行时设置颜色并在我的三角形上保持不变?
PS如果我在片段着色器中执行此操作,我将为整个四边形获得纯红色:
gl_FragColor = vec4(1,0,0,1);
如果您需要我发布更多代码,请告诉我。
答案 0 :(得分:1)
我发现我做错了什么。我的印象是我只能在运行时在顶点着色器中设置变量,但也可以操作片段着色器。我的着色器应该如下所示:
public static final String VS_SOLIDCOLOR =
"uniform mat4 uMVPMatrix;" +
"attribute vec4 aPosition;" +
"void main() {" +
" gl_Position = uMVPMatrix * aPosition;" +
"}";
public static final String FS_SOLIDCOLOR =
"precision mediump float;" +
"uniform vec4 uColor;" +
"void main() {" +
" gl_FragColor = uColor;" +
"}";
并设置如下:
final int colorHandle = GLES20.glGetUniformLocation(shaderProgramSolidColor, "uColor");
GLES20.glUniform4f(colorHandle, r, g, b, a);