繁体   English   中英

着色器纹理值与创建纹理时写入的不同

[英]Shader texture values not the same as written when creating the texture

我创建了一个纹理并用它填充:

size_t size = width * height * 4;
float *pixels = new float[size];
for (size_t i = 0; i < size; ++i) {
    pixels[i] = 1.0f;
}

glTextureStorage2D(texture_id, 1, GL_RGBA16F, width,
                   height);
glTextureSubImage2D(texture_id, 0, 0, 0, width, height, GL_RGBA,
                    GL_FLOAT, pixels);

我使用线性过滤( GL_LINEAR )和夹到边框。

但是当我画出图像时:

color = texture(atlas, uv);

最后一行看起来它的alpha值小于1.如果在着色器中我将alpha设置为1:

color.a = 1.0f;

它正确地绘制它。 这可能是什么原因?

问题来自GL_LINEARGL_CLAMP_TO_BORDER的组合:

  • 夹到边框意味着[0,1]之外的每个纹理坐标都将返回边框颜色。 此颜色可以使用glTexParameterf(..., GL_TEXTURE_BORDER_COLOR, ...) ,默认为黑色。

  • 线性滤波器将考虑与采样位置相邻的像素(除非采样恰好在纹素中心1处发生),因此还将读取边框颜色纹理像素(这里是黑色)。

如果您不想要这种行为,最简单的解决方案是使用GL_CLAMP_TO_EDGE ,它将重复最后一行/列的纹素到无穷大。 open.gl解释了不同的包装模式。

1) 如本答案所述,采样很可能不是在像素中心。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM