如何在片段着色器中使用纯色绘制三角形而不进行插值?

时间:2014-02-11 10:57:24

标签: android opengl-es-2.0

这应该是一项简单的任务,但我失败了。首先是坦白:我对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);

如果您需要我发布更多代码,请告诉我。

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);