创建纹理时编写的着色器纹理数值与实际不同

4
我创建了一个纹理,并用数字1填充它:
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个回答

4
问题来自于使用了 GL_LINEARGL_CLAMP_TO_BORDER 的组合:
  • Clamp to border 意味着每个超出范围 [0, 1] 的纹理坐标都将返回边界颜色。可以使用 glTexParameterf(..., GL_TEXTURE_BORDER_COLOR, ...) 来设置该颜色,默认为黑色。

  • 线性过滤将考虑采样位置附近的像素(除非采样恰好发生在纹理元素中心1),因此也会读取边界颜色纹理元素(这里是黑色)。

如果不想要这种行为,最简单的解决方法是改用 GL_CLAMP_TO_EDGE,它将重复最后一行/列的纹理元素到无限远处。这些不同的包装模式在open.gl网站中有很好的解释。

1) 采样可能不会发生在像素中心,详见这个答案中的解释


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接