Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

texturing using texelFetch()

When I pass non max values into texture buffer, while rendering it draws geometry with colors at max values. I found this issue while using glTexBuffer() API.

E.g. Let’s assume my texture data is GLubyte, when I pass any value less than 255, then the color is same as that of drawn with 255, instead of mixture of black and that color.
I tried on AMD and nvidia card, but the results are same. Can you tell me where could be going wrong?

I am copying my code here:

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);

}

Code:

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);

In this case it draws all the 3 squares with dark red color.

like image 379
debonair Avatar asked Oct 11 '12 07:10

debonair


1 Answers

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

There's your problem: they don't match.

You created the texture's storage as unsigned 8-bit integers, which are normalized to floats upon reading. But you told the shader that you were giving it signed 8-bit integers which will be read as integers, not floats.

You confused OpenGL by being inconsistent. Mismatching sampler types with texture formats yields undefined behavior.

That should be a samplerBuffer, not an isamplerBuffer.

like image 173
Nicol Bolas Avatar answered Sep 28 '22 06:09

Nicol Bolas