texturing using texelFetch()

glsl, opengl, shader, textures

Solution

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`.

Problem

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.

Original source