Opengl GLSL采样器2直接和单通道(GL_红色)数据
我有像素地图数据1通道,8位。 我有像素贴图的宽度和高度 我正在尝试将pixmap数据提交到片段着色器。 我将ogl3与VAO和VBO一起使用 我的设置: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
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);