¿Los muestreadores OpenGL GLSL siempre devuelven flotantes de 0.0 a 1.0?
pyopengl (1)
Creé un par de texturas RGBA de punto flotante ...
No, no lo hiciste.
glTexImage2D(GL_TEXTURE_2D, 0, 4, width, height, 0, GL_RGBA, GL_FLOAT, data);
Esta declaración no crea una textura de coma flotante. Bueno, quizás sí lo haga si está utilizando OpenGL ES, pero ciertamente no lo hace en el escritorio GL. Aunque estoy bastante seguro de que OpenGL ES no te permite usar "4" como formato interno.
En el escritorio GL, el tercer parámetro para glTexImage2D
define el formato de la imagen . Es este parámetro el que le dice a OpenGL si los datos son de coma flotante, entero o lo que sea. Cuando usa "4" (que nunca debe hacer, porque es una forma terrible de especificar el formato interno. Siempre use un formato interno real), le está diciendo a OpenGL que desea 4 componentes enteros normalizados sin firmar.
Los últimos tres parámetros especifican la ubicación, el formato y el tipo de datos de los datos de píxeles que desea cargar en la textura . En el escritorio GL, esto no tiene ningún efecto sobre cómo se almacenan los datos. Le está diciendo a OpenGL a qué se parecen sus píxeles de entrada. La especificación de OpenGL ES cambia imprudentemente esto. Los últimos tres parámetros tienen algún efecto sobre el formato interno de los datos.
En cualquier caso, si desea flotadores de 32 bits, debe solicitarlos:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, width, height, 0, GL_RGBA, GL_FLOAT, data);
¿Por qué el uso de un trabajo variado personalizado, pero utilizando el incorporado gl_FrontColor / gl_Color variable no funciona?
Porque está incorporado. No he usado elementos incorporados de GLSL en años, así que nunca me di cuenta.
La especificación de compatibilidad 3.3 tiene una función glClampColor
que define el comportamiento de sujeción de color de vértice (y fragmento). Solo afecta a los built-in. ¿Personalmente? Lo evitaría y no usaría nada incorporado.
Creé un par de texturas RGBA de punto flotante ...
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);
y luego doble-buffer render / sample en ellos alternativamente en un programa de sombreado
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;
}
Observe que la comprobación de sample.r
es mayor que 1.1. Esto nunca sucede Parece que la llamada a texture2D
o la salida del shader de fragmento sujeta el valor de sample.rgb a [0.0..1.0]. Y, sin embargo, tengo entendido que las texturas en sí tienen un tipo completo de coma flotante.
¿Hay alguna forma de evitar este pinzamiento?
ACTUALIZAR:
De acuerdo con las instrucciones a continuación, he arreglado mi llamada a glTexImage2D()
para usar GL_RGBA32F_ARB, pero todavía no obtengo un valor mayor a 1.0 de la muestra.
ACTUALIZACIÓN 2:
Intenté inicializar las texturas con valores mayores a 1.0, ¡y funciona! texture2d()
devuelve los valores iniciales,> 1.0. Entonces, ¿quizás esto significa que el problema está en el sombreador de fragmentos, escribiendo en la textura?
ACTUALIZACIÓN 3:
Intenté cambiar los sombreadores, y esto funciona:
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;
}
¿Por qué el uso de un trabajo variado personalizado, pero utilizando el incorporado gl_FrontColor / gl_Color variable no funciona?