着色器纹理值与创建纹理时写入的值不同
Shader texture values not the same as written when creating the texture
我创建了一个纹理并填充了纹理:
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] 之外的每个纹理坐标
将 return 边框颜色。这种颜色可以设置为
glTexParameterf(..., GL_TEXTURE_BORDER_COLOR, ...)
是黑色的
默认。
线性滤镜会考虑相邻的像素
采样位置(除非采样恰好发生在纹素中心1),
因此也将读取边框颜色纹素(此处为黑色)。
如果您不希望出现这种情况,最简单的解决方案是使用 GL_CLAMP_TO_EDGE
代替,这会将最后一个 row/column 纹素重复到无穷大。 open.gl.
中对不同的包装模式进行了很好的解释
1) 采样很可能不在像素中心 as explained in this answer.
我创建了一个纹理并填充了纹理:
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] 之外的每个纹理坐标 将 return 边框颜色。这种颜色可以设置为
glTexParameterf(..., GL_TEXTURE_BORDER_COLOR, ...)
是黑色的 默认。线性滤镜会考虑相邻的像素 采样位置(除非采样恰好发生在纹素中心1), 因此也将读取边框颜色纹素(此处为黑色)。
如果您不希望出现这种情况,最简单的解决方案是使用 GL_CLAMP_TO_EDGE
代替,这会将最后一个 row/column 纹素重复到无穷大。 open.gl.
1) 采样很可能不在像素中心 as explained in this answer.