Я создал пару текстур 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 не работает?