1

我有这两个着色器,我希望这两个将一个着色器完美地绘制纹理,而另一个着色器完美地绘制线条颜色?

private final String fragmentShaderCode =
        "precision lowp float;              \n"
                +"uniform vec4 uTex0;       \n"
                +"void main(){              \n"
                +" gl_FragColor = uTex0;    \n"
                +"}                         \n";

另一个

private final String fCode =
        "precision mediump float;                                    \n"
                +"uniform sampler2D uTex0;                           \n"
                +"uniform vec4 uTex1;                                \n"
                +"varying vec2 v_TexCoordinate;                      \n"
                +"void main(){                                       \n"
                +" gl_FragColor = texture2D(uTex0, v_TexCoordinate); \n"
                +"}                                                  \n";

当我使用第一个时,它会完美地绘制线条颜色,但是当我使用第二个时,线条颜色将是纹理颜色,我该如何控制呢?如果我使用第二个着色器结果是这样的 在此处输入图像描述

线条是黑色的,但实际上我正在通过句柄设置这样的线条颜色

texHandle = GLES20.glGetUniformLocation(sProgram, "uTex0");
GLES20.glUniform4fv(texHandle, 1, LineColor, 0); 

它应该像这样画

在此处输入图像描述

4

1 回答 1

2

你混淆了两个概念。

将线条颜色设置为统一 vec4:您的第一个着色器将线条颜色读取为 4 元素向量。这是完全有效的,但您应该使用更好的变量名。例如uniform vec4 lineColor;. 然后在您的 Java 代码中设置统一值

lineColorHandle = GLES20.glGetUniformLocation(sProgram, "lineColor");
GLES20.glUniform4fv(lineColorHandle, 1, LineColor, 0);

将纹理单元设置为 uniform sampler2D:您的第二个着色器已uTex0声明为uniform sampler2D uTex0;. 在这种情况下,uTex0 不是 4 元素向量。它是一个整数索引,告诉着色器 uTex0 绑定到哪个纹理单元。你应该像这样设置制服:

texHandle = GLES20.glGetUniformLocation(sProgram, "uTex0");
GLES20.glUniform1i(texHandle, 0); // 0 is default texture unit.
于 2013-09-11T10:59:28.390 回答