1

openglのglslをopenglesのglslに変換しようとしています。

これが私が翻訳しようとしているglslコードです。

  • 頂点シェーダーの場合

    varying vec2 texcoord0;
    varying vec2 texcoord1;
    varying vec2 texcoord2;
    varying vec2 texcoord3;
    varying vec2 texcoord4;
    varying vec2 texdim0;
    
    varying vec2 texcoordLUT;
    
    uniform float sharpness;
    
    void main()
    {
        gl_Position = ftransform();
    
        texcoord0 = vec2(gl_TextureMatrix[0] * gl_MultiTexCoord0);
        texcoordLUT = vec2(gl_TextureMatrix[1] * gl_MultiTexCoord1);
        texdim0 = vec2 (abs(gl_TextureMatrix[0][0][0]),abs(gl_TextureMatrix[0][1][1]));
    
        texcoord1 = texcoord0 + vec2(-sharpness, -sharpness);
        texcoord2 = texcoord0 + vec2(+sharpness, -sharpness);
        texcoord3 = texcoord0 + vec2(+sharpness, +sharpness);
        texcoord4 = texcoord0 + vec2(-sharpness, +sharpness);
    
    }
    
  • フラグメントシェーダーの場合

    uniform float amount;
    uniform float vignette;
    
    uniform sampler4DRect tex0;
    uniform sampler1D tex1;
    
    varying vec2 texcoord0;
    varying vec2 texcoord1;
    varying vec2 texcoord2;
    varying vec2 texcoord3;
    varying vec2 texcoord4;
    
    varying vec2 texdim0;
    
    varying vec2 texcoordLUT;
    
    const vec4 one = vec4(1.0); 
    const vec4 two = vec4(2.0);
    const vec4 lumcoeff = vec4(0.299,0.587,0.114, 0.);
    
    vec4 vignetteFucntion(vec2 normalizedTexcoord)
    {
        normalizedTexcoord = 2.0 * normalizedTexcoord - 1.0;
        float r = length(normalizedTexcoord);
        return 1.0 - vec4(smoothstep(0.5,1.0,r)) + 0.5;
    }
    
    vec4 hardlight(vec4 a, vec4 b, float amount)
    {
        vec4 result;
        vec4 branch1;
        vec4 branch2;
        float luminance = dot(b,lumcoeff);
        float mixamount;
    
        mixamount = clamp((luminance - 0.45) * 10., 0., 1.);
        branch1 = two * a * b;
        branch2 = one - (two * (one - a) * (one - b));
    
        result =  mix(branch1,branch2, vec4(mixamount));
    
        return mix(a,result, amount);
    }
    
    void main (void) 
    {       
        vec2 normcoord = texcoord0/texdim0;
    
        vec4 vignetteResult = vignetteFucntion(normcoord);
    
        vec4 input0 = texture2DRect(tex0, texcoord0);
        vec4 input1 = texture2DRect(tex0, texcoord1);
        vec4 input2 = texture2DRect(tex0, texcoord2);
        vec4 input3 = texture2DRect(tex0, texcoord3);
        vec4 input4 = texture2DRect(tex0, texcoord4);
    
        vec4 sharpened = 5.0 * input0 - (input1 + input2 + input3 + input4);
    
        vec4 hardlighted = hardlight(sharpened,input0, .5);
    
        vec4 saturated = mix(vec4(dot(hardlighted,lumcoeff)), hardlighted, 0.75);
    
        vec4 result;
    
        result.r = texture1D(tex1, saturated.r).r;
        result.g = texture1D(tex1, saturated.g).g;
        result.b = texture1D(tex1, saturated.b).b;
        result.a = saturated.a;
    
        gl_FragColor = mix(input0, result *  (mix(vec4(1.0),vignetteResult, vignette)),amount);
    }
    

gl_TextureMatrix [0]、gl_TextureMatrix [1]、およびgl_TextureMatrix [0][0][0]をどのように変換できるか知りたいです。それらはどういう意味ですか?

4

1 に答える 1

2

gl_TextureMatrixは、テクスチャ座標を変換する変換行列です(たとえば、静的な形状でテクスチャを回転またはスケーリングする場合)。

これは、標準のOpenGLで非推奨の組み込み変数です。最新のOpenGL/OpenGLESでこれを処理する適切な方法は、組み込みを使用する代わりに独自の均一行列を宣言し、gl_TextureMatrixOpenGLへの回転/変換を実行する代わりにこれらの均一行列を更新することGL_TEXTURE_MATRIXです。

于 2012-09-28T19:30:03.450 に答える