第一张图像在天空盒着色器上进行了伽玛校正,看起来是正确的,较低版本在后期处理中执行此操作,并且在云的边缘附近有可怕的伪影,但是两个版本都以通常的方式执行此操作:
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();
}
#1 楼
简短的答案,将图像的精度设置为较高的值。较长的答案,
查看伽玛校正曲线时,可以看到较低的值会发生变化更重要的是,这意味着较低的值之间的差异将变得更大,从而导致这种效果。颜色通道的值数量有限,这意味着当将数字四舍五入到8位值时,它将使某些相邻像素具有相同的颜色。您不会在正常图像中注意到这一点,但是经过伽玛校正后,这种效果就会显现出来,因为您失去了一点点的颜色变化,之后颜色上的差别可能会更大。
要解决此问题,您只需给伽玛校正提供更高的精度,以同时获得较小的颜色变化,否则该变化将被四舍五入。
因此,在制作帧缓冲区时,可以使用例如GL_RGBA16F或GL_RGBA32F。
我希望这可以帮助您解决问题,祝您好运,并度过美好的一天!
评论
$ \ begingroup $
我对精度问题感到怀疑,只是我一直在考虑压缩问题,直到不知所措。非常感谢,这帮助我解决了问题。
$ \ endgroup $
– V.M.
17年2月12日在20:46
评论
实际上,我在更一般的SO问题上发布了相关答案。 stackoverflow.com/questions/12524623/…