8

いくつかの浮動小数点 RGBA テクスチャを作成しました...

glBindTexture( GL_TEXTURE_2D, texid[k] );
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
glTexImage2D(GL_TEXTURE_2D, 0, 4, width, height, 0, GL_RGBA,
             GL_FLOAT, data);

次に、シェーダー プログラムでレンダリング/サンプルを交互にダブル バッファーします。

    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, 
                       GL_TEXTURE_2D, texid[i], 0)

...

    state_tex_loc = glGetUniformLocation( program, "state_tex" )
    glUniform1i( state_tex_loc, 0 )
    glActiveTexture( GL_TEXTURE0 )
    glBindTexture( GL_TEXTURE_2D, texid[1-i] )

...

    void main( void )
    {
        gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
        vec2 sample_pos = gl_Vertex.xy / vec2( xscale, yscale );
        vec4 sample = texture2D( state_tex, sample_pos.xy );
        sample.rgb = sample.rgb + vec3( 0.5, 0.5, 0.5 );
        if ( sample.r > 1.1 )
            sample.rgb = vec3( 0.0, 0.0, 0.0 );
        gl_FrontColor = sample;
    }

...

    void main( void )
    {
        gl_FragColor = gl_Color;
    }

sample.r1.1 より大きいかどうかのチェックに注意してください。これは決して起こりません。フラグメント シェーダーの呼び出しtexture2Dまたは出力によって、sample.rgb の値が [0.0..1.0] にクランプされているようです。それでも、私の理解では、テクスチャ自体には完全な浮動小数点型が含まれています。

このクランプを回避する方法はありますか?

アップデート:

以下の手順に従って、glTexImage2D()GL_RGBA32F_ARB を使用するように呼び出しを修正しましたが、サンプラーから 1.0 より大きい値を取得できません。

更新 2:

テクスチャを 1.0 より大きい値に初期化しようとしたところ、うまくいきました! texture2d()初期値 > 1.0 を返します。これはおそらく、問題がフラグメント シェーダーにあり、テクスチャに書き込んでいるということでしょうか?

更新 3:

シェーダーを変更してみましたが、これは機能します:

    varying vec4 out_color;
    void main( void )
    {
        gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
        vec2 sample_pos = gl_Vertex.xy / vec2( xscale, yscale );
        vec4 sample = texture2D( state_tex, sample_pos.xy );
        sample.rgb = sample.rgb + vec3( 0.5, 0.5, 0.5 );
        if ( sample.r > 1.1 )
            sample.rgb = vec3( 0.0, 0.0, 0.0 );
        out_color = sample;
    }

...

    varying vec4 out_color;
    void main( void )
    {
        gl_FragColor = out_color;
    }

カスタムの変化を使用すると機能するのに、組み込みの変化する gl_FrontColor/gl_Color を使用すると機能しないのはなぜですか?

4

1 に答える 1

7

いくつかの浮動小数点 RGBA テクスチャを作成しました...

いいえ、あなたはしませんでした。

glTexImage2D(GL_TEXTURE_2D, 0, 4, width, height, 0, GL_RGBA, GL_FLOAT, data);

このステートメントは、浮動小数点テクスチャを作成しません。OpenGL ES を使用している場合はそうかもしれませんが、デスクトップ GL ではそうではありません。ただし、OpenGL ES では内部形式として「4」を使用できないと確信しています。

デスクトップ GL では、画像フォーマットglTexImage2Dを定義する3 番目のパラメータです。データが浮動小数点、整数、またはその他のいずれであるかを OpenGL に通知するのは、このパラメーターです"4" を使用する場合 (これは、内部形式を指定するひどい方法であるため、決して行うべきではありません。常に実際の内部形式を使用してください)、4 つの符号なし正規化整数コンポーネントが必要であることを OpenGL に伝えています。

最後の 3 つのパラメーターは、テクスチャにアップロードするピクセル データの場所、形式、およびデータ型を指定します。デスクトップ GL では、これはデータの保存方法には影響しません。入力ピクセルがどのように見えるかをOpenGLに伝えているだけです。OpenGL ES 仕様は、賢明にもこれを変更しています。最後の 3 つのパラメーターは、データの内部形式に何らかの影響を与えます。

いずれにせよ、32 ビット浮動小数点数が必要な場合は、それらを要求する必要があります。

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, width, height, 0, GL_RGBA, GL_FLOAT, data);

カスタムの変化を使用すると機能するのに、組み込みの変化する gl_FrontColor/gl_Color を使用すると機能しないのはなぜですか?

ビルトインなので。私は組み込みの GLSL を何年も使用していないので、そのことにさえ気づきませんでした。

3.3 互換仕様には、glClampColor頂点 (およびフラグメント) のカラー クランプ動作を定義する関数があります。ビルトインにのみ影響します。個人的に?私はそれを避け、組み込みのものをまったく使用しません。

于 2012-02-22T16:53:53.577 に答える