2012-10-11 37 views
7

Cuando paso valores no máximos en el búfer de texturas, mientras renderizo dibuja geometría con colores en valores máximos. Encontré este problema al usar glTexBuffer() API.texturizado usando texelFetch()

E.g. Supongamos que mis datos de textura son GLubyte, cuando paso cualquier valor inferior a 255, el color es el mismo que el dibujado con 255, en lugar de la mezcla de negro y ese color.
Probé con la tarjeta AMD y NVIDIA, pero los resultados son los mismos. ¿Puede decirme dónde podría estar yendo mal?

estoy copiando el código aquí:

Vert shader:

in vec2 a_position; 
uniform float offset_x; 
void main() 
{ 
    gl_Position = vec4(a_position.x + offset_x, a_position.y, 1.0, 1.0); 
} 

Frag shader:

out vec4 Color; 
uniform isamplerBuffer sampler; 
uniform int index; 
void main() 
{ 
    Color=texelFetch(sampler,index); 

} 

Código:

GLubyte arr[]={128,5,250}; 
glGenBuffers(1,&bufferid); 

glBindBuffer(GL_TEXTURE_BUFFER,bufferid); 

glBufferData(GL_TEXTURE_BUFFER,sizeof(arr),arr,GL_STATIC_DRAW); 
glBindBuffer(GL_TEXTURE_BUFFER,0); 

glGenTextures(1, &buffer_texture); 

glBindTexture(GL_TEXTURE_BUFFER, buffer_texture); 
glTexBuffer(GL_TEXTURE_BUFFER, GL_R8, bufferid); 


glUniform1f(glGetUniformLocation(shader_data.psId,"offset_x"),0.0f); 
glUniform1i(glGetUniformLocation(shader_data.psId,"sampler"),0); 
glUniform1i(glGetUniformLocation(shader_data.psId,"index"),0); 

glGenBuffers(1,&bufferid1); 

glBindBuffer(GL_ARRAY_BUFFER,bufferid1); 
glBufferData(GL_ARRAY_BUFFER,sizeof(vertices4),vertices4,GL_STATIC_DRAW); 

attr_vertex = glGetAttribLocation(shader_data.psId, "a_position"); 

glVertexAttribPointer(attr_vertex, 2 , GL_FLOAT, GL_FALSE ,0, 0); 

glEnableVertexAttribArray(attr_vertex); 

glDrawArrays(GL_TRIANGLE_FAN,0,4); 

glUniform1i(glGetUniformLocation(shader_data.psId,"index"),1); 

glVertexAttribPointer(attr_vertex, 2 , GL_FLOAT, GL_FALSE ,0,(void *)(32)); 

glDrawArrays(GL_TRIANGLE_FAN,0,4); 

glUniform1i(glGetUniformLocation(shader_data.psId,"index"),2); 

glVertexAttribPointer(attr_vertex, 2 , GL_FLOAT, GL_FALSE ,0,(void *)(64)); 

glDrawArrays(GL_TRIANGLE_FAN,0,4); 

En este caso se atrae a todos los 3 cuadrados con col de color rojo oscuro o.

Respuesta

2
uniform isamplerBuffer sampler; 
glTexBuffer(GL_TEXTURE_BUFFER, GL_R8, bufferid); 

Existe su problema: no coinciden.

Ha creado el almacenamiento de la textura como enteros de 8 bits sin signo, que se normalizan en flotantes al leer. Pero le dijo al sombreador que le estaba dando con enteros de 8 bits que se leerán como enteros, no flotantes.

Ha confundido OpenGL por ser inconsistente. Los tipos de muestreador no coincidentes con formatos de textura producen un comportamiento indefinido.

que debe ser una samplerBuffer, no un isamplerBuffer.

+0

Muchas gracias ... !! Ahora, el problema es que cuando reemplace isamplerBuffer por samplerBuffer, da salida correcta para GL_R8, GL_R16, GL_R16F, GL_R32F pero para otros formatos internos dados en http://www.opengl.org/sdk/docs/man3/xhtml /glTexBuffer.xml. ¿me puede decir cómo puede lograr el o/p correcto para todos los formatos internos ...? En realidad, no tengo mucho conocimiento sobre glsl .. Por favor, ayúdenme con eso ... – debonair

+0

@ user1737197: Stack Overflow no es un foro web. Aquí, si tiene una nueva pregunta, use el botón "Preguntar" para formularla. O simplemente podría [ir al Wiki de OpenGL y leer sobre él allí] (http://www.opengl.org/wiki/GLSL_Sampler). –

+0

disculpa por eso, he creado una nueva pregunta. – debonair

Cuestiones relacionadas