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

时间:2018-10-29 09:16:33

标签: c++ opengl textures shader

我创建了一个纹理并将其填充为纹理:

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;

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

1 个答案:

答案 0 :(得分:4)

问题来自GL_LINEARGL_CLAMP_TO_BORDER的组合:

  • 钳制到边界表示[0,1]以外的每个纹理坐标 将返回边框颜色。可以用 glTexParameterf(..., GL_TEXTURE_BORDER_COLOR, ...)并被黑 默认。

  • 线性滤镜将考虑与像素相邻的像素 采样位置(除非采样恰好在texel中心 1 进行), 因此也会读取边框颜色纹理元素(此处为黑色)。

如果您不希望出现这种情况,最简单的解决方案是使用GL_CLAMP_TO_EDGE来代替,它将重复像素的最后一行/列至无穷大。 open.gl很好地解释了不同的包装模式。

1)采样很可能不在像素中心as explained in this answer上发生。