无法在Fragment Shader OpenGL中访问Vec4的rgb属性

时间:2017-11-09 19:29:56

标签: android opengl-es fragment-shader

我有一个简单的片段着色器,其中我传递两个纹理。我测试了输出两种纹理并且它们是正确的(即,我输入的是什么)

HOWEVER ,当我尝试访问纹理的rgb属性(转换为vec4)时,程序会出现glerror错误1282(无效操作)

以下着色器崩溃:

    #extension GL_OES_EGL_image_external : require
    precision mediump float;

    varying vec2 v_TexCoord;
    uniform sampler2D sTexture2;
    uniform samplerExternalOES sTexture;

    void main() {
        vec4 originalrgb = vec4((texture2D(sTexture, v_TexCoord).rgb), 1.0);
        vec4 floodfillimage = vec4((texture2D(sTexture2, v_TexCoord).rgb), 1.0);

        vec4 c = vec4(0.0, 1.0, 1.0, 1); /*Blue Tint Colour*/
        vec4 inputColor = vec4((texture2D(sTexture, v_TexCoord).rgb), 1.0);
        float average = (inputColor.r + inputColor.g + inputColor.b) / 3.0;
        vec4 grayscale = vec4(average, average, average, 1.0);
        vec4 colorizedOutput = grayscale * c;

        vec4 test;
        if(floodfillimage.r > 0.9){ /*This is what makes it crash, cant seem to access the rgb properties of this*/
            test = colorizedOutput.rgba;
        }else{
            test = originalrgb.rgba;
        }

        gl_FragColor = test;
    }

这个没有崩溃

    #extension GL_OES_EGL_image_external : require
    precision mediump float;
    /*
    * Original Camera Frame Image
    */
    varying vec2 v_TexCoord;
    uniform sampler2D sTexture2;
    uniform samplerExternalOES sTexture;
    void main() {
        vec4 originalrgb = vec4((texture2D(sTexture, v_TexCoord).rgb), 1.0);
        vec4 floodfillimage = vec4((texture2D(sTexture2, v_TexCoord).rgb), 1.0);

        vec4 c = vec4(0.0, 1.0, 1.0, 1); /*Blue Tint Colour*/
        vec4 inputColor = vec4((texture2D(sTexture, v_TexCoord).rgb), 1.0);
        float average = (inputColor.r + inputColor.g + inputColor.b) / 3.0;
        vec4 grayscale = vec4(average, average, average, 1.0);
        vec4 colorizedOutput = grayscale * c;

        gl_FragColor = floodfillimage;
    }

这个也不会崩溃。

    #extension GL_OES_EGL_image_external : require
    precision mediump float;
    /*
    * Original Camera Frame Image
    */
    varying vec2 v_TexCoord;
    uniform sampler2D sTexture2;
    uniform samplerExternalOES sTexture;
    void main() {
        vec4 originalrgb = vec4((texture2D(sTexture, v_TexCoord).rgb), 1.0);
        vec4 floodfillimage = vec4((texture2D(sTexture2, v_TexCoord).rgb), 1.0);

        vec4 c = vec4(0.0, 1.0, 1.0, 1); /*Blue Tint Colour*/
        vec4 inputColor = vec4((texture2D(sTexture, v_TexCoord).rgb), 1.0);
        float average = (inputColor.r + inputColor.g + inputColor.b) / 3.0;
        vec4 grayscale = vec4(average, average, average, 1.0);
        vec4 colorizedOutput = grayscale * c;

        gl_FragColor = originalrgb;
    }

这个也不会崩溃。

    #extension GL_OES_EGL_image_external : require
    precision mediump float;
    /*
    * Original Camera Frame Image
    */
    varying vec2 v_TexCoord;
    uniform sampler2D sTexture2;
    uniform samplerExternalOES sTexture;
    void main() {
        vec4 originalrgb = vec4((texture2D(sTexture, v_TexCoord).rgb), 1.0);
        vec4 floodfillimage = vec4((texture2D(sTexture2, v_TexCoord).rgb), 1.0);

        vec4 c = vec4(0.0, 1.0, 1.0, 1); /*Blue Tint Colour*/
        vec4 inputColor = vec4((texture2D(sTexture, v_TexCoord).rgb), 1.0);
        float average = (inputColor.r + inputColor.g + inputColor.b) / 3.0;
        vec4 grayscale = vec4(average, average, average, 1.0);
        vec4 colorizedOutput = grayscale * c;

        gl_FragColor = colorizedOutput;
    }

当我想访问纹理的'r','g'或'b'属性时,为什么会崩溃?

非常感谢任何帮助!

修改 访问属性并将其直接分配给gl_Fragcolor。即,以下工作:

gl_FragColor.r = floodfillimage.r;
gl_FragColor.g = floodfillimage.g;
gl_FragColor.b = floodfillimage.b;
gl_FragColor.a = floodfillimage.a;

0 个答案:

没有答案