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



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

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,它将重复最后一行/列的texel到无穷大。不同的包装模式在open.gl上得到了很好的解释

1(采样很可能不在像素中心发生,如本答案所述

最新更新