jacekmigacz
jacekmigacz

Reputation: 789

GLSL sampler2DRect and single channel (GL_RED) data

I have pixel map data 1 channel, 8 bit. I have pixel map width and height.

I'm trying to submit pixmap data to fragment shader. I'm using ogl3 with VAO and VBO.

My setup:

glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_RECTANGLE, texture);
glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_RECTANGLE, 0, GL_RED, width, height, 0, GL_RED, GL_UNSIGNED_BYTE, data);
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, ..., vertices, GL_STATIC_DRAW);
...create program...
glUseProgram(program);
glUniform1i(glGetUniformLocation(program, "image"), 0);
glDrawArrays(GL_TRIANGLE_FAN, 0, ...);

And fragment shader:

uniform sampler2DRect image;

varying vec2 varying_texcoord;

void main() {
    vec4 sample = texture2DRect(image, varying_texcoord);
    gl_FragColor = vec4(1.0, 0.0, 0.0, sample.a);
}

gl_FragColor should paint pixels light and dark red depending of sample.a value, however it seems that sample.a is always 1.0 - I'm getting pure red #ff0000. I think the problem is in glTexImage2D, isn't it?

Please assume program and data are valid.

Upvotes: 1

Views: 4578

Answers (2)

Johan van Breda
Johan van Breda

Reputation: 593

The question is very old but the answer could help others.

You need to use true pixel coordinates if you use sampler2DRect. I assume you copy the incoming texture coordinates in the vertex shader to your varying_texcoord.

If you do so, you need to compute the coordinates:

vec2 coords = varying_texcoord * imageSize(image); 

Then pass the coordinates:

vec4 sample= texture(image, coords);

Upvotes: 1

Ani
Ani

Reputation: 10896

I believe the answer you are looking for is in the documentation for glTexImage2D. It says

"GL_RED: Each element is a single red component.The GL converts it to floating point and assembles it into an RGBA elementby attaching 0 for green and blue, and 1 for alpha. Each component is then multiplied by the signed scale factor GL_c_SCALE, added to the signed bias GL_c_BIAS, and clamped to the range [0,1]."

You're asking for the .a component, which is always 1. You need to use the component the texture actually contains data in - which is .r

Hope this helps!

Upvotes: 4

Related Questions