いくつかの浮動小数点 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.r
1.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 を使用すると機能しないのはなぜですか?