GLSL sampler2DRect和单通道(GL_RED)数据

时间:2012-06-22 13:02:18

标签: opengl glsl opengl-3

我有像素图数据1通道,8位。 我有像素图宽度和高度。

我正在尝试将pixmap数据提交给片段着色器。 我在VAO和VBO中使用 ogl3

我的设置:

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

片段着色器:

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应根据sample.a值绘制像素浅红色和深红色,但似乎 sample.a始终为1.0 - 我得到纯红色#ff0000。 我认为问题出在glTexImage2D上,不是吗?

请假设程序和数据有效。

2 个答案:

答案 0 :(得分:4)

我相信您正在寻找的答案位于glTexImage2D的文档中。它说

“的 GL_RED : 每个元素都是一个红色组件.GL将其转换为浮点数并将其组合成RGBA元素,将绿色和蓝色附加0,将alpha附加1。然后将每个分量乘以带符号的比例因子GL_c_SCALE,加到带符号偏差GL_c_BIAS,并钳位到[0,1]范围。“

你要求.a组件,它总是1.你需要使用纹理实际包含数据的组件 - 这是.r

希望这有帮助!

答案 1 :(得分:1)

问题很严重,但答案可以帮助其他人。

如果使用sampler2DRect,则需要使用真实的像素坐标。 我假设您将顶点着色器中的传入纹理坐标复制到varying_texcoord

如果这样做,则需要计算坐标:

vec2 coords = varying_texcoord * imageSize(image); 

然后传递坐标:

vec4 sample= texture(image, coords);