【问题标题】:Shader texture values not the same as written when creating the texture着色器纹理值与创建纹理时写入的不同
【发布时间】:2018-10-29 09:16:33
【问题描述】:

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

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;

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

【问题讨论】:

    标签: c++ opengl textures shader


    【解决方案1】:

    问题来自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

    【讨论】:

      猜你喜欢
      • 2015-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-06
      • 2012-02-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多