I created a couple of RGBA floating point textures ...
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);
and then double visualize the visualization / sample in them in the shader program
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; }
Note that the sample.r check exceeds 1.1. It never happens. It seems that either calling texture2D or the output of the fragment shader clamps the value of sample.rgb to [0.0..1.0]. And yet, I understand that the textures themselves have full floating point types in them.
Is there any way to avoid this clamp?
UPDATE:
Following the instructions below, I fixed my glTexImage2D() call to use GL_RGBA32F_ARB, but I'm still not getting a value greater than 1.0 from the sampler.
UPDATE 2:
I just tried initializing textures with values ββin excess of 1.0, and it works! texture2d() returns initial values> 1.0. Perhaps this means that the problem is in the fragment shader, writing the texture?
UPDATE 3:
I tried changing the shaders and this works:
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; }
Why is using custom muting work, but using the built-in mutable gl_FrontColor / gl_Color does not work?