c++ - 着色器纹理值与创建纹理时写入的不同
问题描述
我创建了一个纹理并用它们填充:
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_LINEAR
组合GL_CLAMP_TO_BORDER
:
Clamp to border 意味着 [0, 1] 之外的每个纹理坐标都将返回边框颜色。此颜色可以设置,
glTexParameterf(..., GL_TEXTURE_BORDER_COLOR, ...)
默认为黑色。线性过滤器将考虑与采样位置相邻的像素(除非采样恰好发生在纹素中心1),因此还将读取边框颜色纹素(此处为黑色)。
如果您不想要这种行为,最简单的解决方案是使用GL_CLAMP_TO_EDGE
它将重复最后一行/列的纹素到无穷大。open.gl很好地解释了不同的包装模式。
1)采样很可能不在此答案中解释的像素中心发生。
推荐阅读
- c# - c#中如何在调用方法之外使用ref变量
- git - 在我 rebase 然后同步之后,历史记录在 PR 中翻倍并显示不相关的更改
- eclipse-hono - Eclipse Hono - 在终端中启动命令行客户端以发送命令时出现 ConnectTimeoutException
- html - Angular 材质 - 菜单 A 的菜单点击事件也被用于菜单 B
- python - 从python中的其他文件导入函数
- kubernetes - 是否有可能找出哪个用户上传了 kubernetes 机密?
- javascript - 不检查获取请求是否失败是一种不好的做法吗?
- javascript - React 中的香草 CSS?
- reactjs - 此 ReactJs 示例中如何使用此变量
- c# - 如何将值存储在列表或数组中并将所有值绑定到数据表然后gridview