Я создал пару текстур 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 из sampler.
ОБНОВЛЕНИЕ 2:
Я только что попытался инициализировать текстуры значениями больше 1.0, и он работает! texture2d ()
возвращает начальные значения> 1.0. Так что, возможно, это означает, что проблема во фра gment shader, запись в текстуру?
ОБНОВЛЕНИЕ 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 не работает?