1

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

我正在尝试将像素图数据提交到片段着色器。我将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 应该根据 sample.a 的值将像素绘制成浅红色和深红色,但是 sample.a 似乎总是 1.0 - 我得到的是纯红色#ff0000。我认为问题出在 glTexImage2D 中,不是吗?

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

4

2 回答 2

4

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

" GL_RED:每个元素都是一个红色分量。GL 将其转换为浮点数并将其组装成一个 RGBA 元素,方法是为绿色和蓝色附加 0,为 alpha 附加 1。然后每个分量乘以带符号的比例因子 GL_c_SCALE,添加到有符号偏差 GL_c_BIAS,并钳制在 [0,1] 范围内。”

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

希望这可以帮助!

于 2012-06-22T14:53:25.907 回答
1

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

如果您使用sampler2DRect. 我假设您将顶点着色器中的传入纹理坐标复制到您的varying_texcoord.

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

vec2 coords = varying_texcoord * imageSize(image); 

然后传递坐标:

vec4 sample= texture(image, coords);
于 2015-04-30T14:55:54.387 回答