我有像素图数据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上,不是吗?
请假设程序和数据有效。
答案 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);