进行后期伽马校正后会显示纹理伪像,这是一个在天空盒上的小例子:



第一张图像在天空盒着色器上进行了伽玛校正,看起来是正确的,较低版本在后期处理中执行此操作,并且在云的边缘附近有可怕的伪影,但是两个版本都以通常的方式执行此操作:

Color.rgb = pow(Color.rgb, vec3(1.0/2.2));
Color.a = 1.0;


让我相信创建和使用帧缓冲区的方式有问题,这是我的工作方式:

// Generate FirstFBO, specify this as the color attachment
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, FramebufferSize.x, FramebufferSize.y, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr); 

// ...

while (true) {
    glBindFramebuffer(GL_FRAMEBUFFER, FirstFBO.ID);
    DrawStuff();

    glBindFramebuffer(GL_FRAMEBUFFER, 0);
    glBindTexture(GL_TEXTURE_2D, FirstFBO.ColorTexture);
    DrawFullscreenQuad();
}


评论

实际上,我在更一般的SO问题上发布了相关答案。 stackoverflow.com/questions/12524623/…

#1 楼

简短的答案,将图像的精度设置为较高的值。

较长的答案,

查看伽玛校正曲线时,可以看到较低的值会发生变化更重要的是,这意味着较低的值之间的差异将变得更大,从而导致这种效果。颜色通道的值数量有限,这意味着当将数字四舍五入到8位值时,它将使某些相邻像素具有相同的颜色。您不会在正常图像中注意到这一点,但是经过伽玛校正后,这种效果就会显现出来,因为您失去了一点点的颜色变化,之后颜色上的差别可能会更大。

要解决此问题,您只需给伽玛校正提供更高的精度,以同时获得较小的颜色变化,否则该变化将被四舍五入。

因此,在制作帧缓冲区时,可以使用例如GL_RGBA16F或GL_RGBA32F。

我希望这可以帮助您解决问题,祝您好运,并度过美好的一天!

评论


$ \ begingroup $
我对精度问题感到怀疑,只是我一直在考虑压缩问题,直到不知所措。非常感谢,这帮助我解决了问题。
$ \ endgroup $
– V.M.
17年2月12日在20:46