Всегда ли сэмплеры OpenGL GLSL возвращают значения с плавающей запятой от 0,0 до 1,0?

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

6
задан Ted Middleton 23 February 2012 в 07:15
поделиться