質問

スカラー値を0から1に範囲の色にマッピングする必要があります(0から1まで)、テクスチャ調整を使用した線形補間(0から1の範囲)

私はOpenGLとGLSLに新しい、これまで私は

で色値を書く必要があることを考え出しました
gl_FragColor
.

寸法4のベクトルである4.0から1.0の範囲の1つのスカラー値だけgl_fragColorのR、G、Bチャンネルを計算できる方法はわかりません(緑から赤、0.5までそれは白くなるでしょう)

役に立ちましたか?

解決

#version 120

...

float remap( float minval, float maxval, float curval )
{
    return ( curval - minval ) / ( maxval - minval );
} 

...

const vec4 GREEN = vec4( 0.0, 1.0, 0.0, 1.0 );
const vec4 WHITE = vec4( 1.0, 1.0, 1.0, 1.0 );
const vec4 RED   = vec4( 1.0, 0.0, 0.0, 1.0 );

float u = <whatever, grabbed from a uniform?>;
u = clamp( u, 0.0, 1.0 );
if( u < 0.5 )
    gl_FragColor = mix( GREEN, WHITE, remap( 0.0, 0.5, u ) );
else
    gl_FragColor = mix( WHITE, RED, remap( 0.5, 1.0, u ) );
.

または3ピクセルの1Dテクスチャをサンプリングすることができます。

他のヒント

範囲0から1の値がvalの名前の場合:

if (val < 0.5)
{
    gl_FragColor = vec4(2.0 * val, 1.0, 2.0 * val, 1.0);
}
else
{
    gl_FragColor = vec4(1.0, 2.0 * (1.0 - val), 2.0 * (1.0 - val), 1.0);
}
.

または分岐文を避けたい場合:

gl_FragColor = vec4(min(2.0 * val, 1.0),
                    min(2.0 * (1.0 - val), 1.0), 
                    2.0 * min(val, 1.0 - val),
                    1.0);
.

これが実際に速くなるかどうかわからない。@jessyによって指摘されているように、カラーバッファが正規化されたフォーマットが正規化されている場合、出力色が自動的に[0,1]範囲にクランプされている場合、minが不要になるため、次のように呼び出すことができます。P>

gl_FragColor = vec4(2.0 * val,
                    2.0 * (1.0 - val), 
                    2.0 * min(val, 1.0 - val),
                    1.0);
.

GL_FRAGCOLORが0~1の間にクランプされているため、手動クランプを心配する必要はありません。

float red = 2. * texel;
float green = 2. - red;
gl_FragColor = vec4(red, green, min(red, green), 1.);
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top