Opengl GLSL采样器2直接和单通道(GL_红色)数据

Opengl GLSL采样器2直接和单通道(GL_红色)数据,opengl,glsl,opengl-3,Opengl,Glsl,Opengl 3,我有像素地图数据1通道,8位。 我有像素贴图的宽度和高度 我正在尝试将pixmap数据提交到片段着色器。 我将ogl3与VAO和VBO一起使用 我的设置: glGenTextures(1, &texture); glBindTexture(GL_TEXTURE_RECTANGLE, texture); glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL

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

我正在尝试将pixmap数据提交到片段着色器。 我将ogl3与VAO和VBO一起使用

我的设置:

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


请假定程序和数据是有效的。

我相信您要寻找的答案在的文档中。上面说

GL_RED: 每个元素都是一个红色分量。GL将其转换为浮点,并将其组合为RGBA元素,方法是将0表示绿色和蓝色,1表示alpha。然后,每个分量乘以有符号比例因子GL_c_scale,添加到有符号偏差GL_c_bias,并钳制到[0,1]范围。”

您要求的是.a组件,它始终为1。您需要使用纹理中实际包含数据的组件-即.r


希望这有帮助

我相信您想要的答案在的文档中。上面说

GL_RED: 每个元素都是一个红色分量。GL将其转换为浮点,并将其组合为RGBA元素,方法是将0表示绿色和蓝色,1表示alpha。然后,每个分量乘以有符号比例因子GL_c_scale,添加到有符号偏差GL_c_bias,并钳制到[0,1]范围。”

您要求的是.a组件,它始终为1。您需要使用纹理中实际包含数据的组件-即.r


希望这有帮助

这个问题很老了,但答案可以帮助其他人

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

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

vec2 coords = varying_texcoord * imageSize(image); 
然后传递坐标:

vec4 sample= texture(image, coords);

这个问题很古老,但答案可以帮助其他人

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

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

vec2 coords = varying_texcoord * imageSize(image); 
然后传递坐标:

vec4 sample= texture(image, coords);