在opengl 20中将两个着色器属性组合成一个着色器?

时间:2013-09-11 10:44:40

标签: android opengl-es opengl-es-2.0

我有这两个着色器,我希望这两个着色器结合一个着色器完美地绘制纹理和其他绘制颜色的线条完美?

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

当我使用第一个时它将完美地绘制线条颜色但是当我使用第二个时,线条颜色将是纹理颜色,我该如何控制它? 如果我使用第二个着色器结果是这样的 enter image description here

线是黑色但实际上我通过句柄

设置这样的线条颜色
texHandle = GLES20.glGetUniformLocation(sProgram, "uTex0");
GLES20.glUniform4fv(texHandle, 1, LineColor, 0); 

它应该像这样绘制

enter image description here

1 个答案:

答案 0 :(得分:2)

你混淆了两个概念。

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

设置统一值
lineColorHandle = GLES20.glGetUniformLocation(sProgram, "lineColor");
GLES20.glUniform4fv(lineColorHandle, 1, LineColor, 0);

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

texHandle = GLES20.glGetUniformLocation(sProgram, "uTex0");
GLES20.glUniform1i(texHandle, 0); // 0 is default texture unit.