gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:50:00 27 4
gpt4 key购买 nike

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

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 的组合:

  • Clamp to border 意味着 [0, 1] 之外的每个纹理坐标将返回边框颜色。这种颜色可以设置为glTexParameterf(..., GL_TEXTURE_BORDER_COLOR, ...) 并且是黑色的默认。

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

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

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

关于c++ - 着色器纹理值与创建纹理时写入的值不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53042200/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com