c++ - OpenGL HDR 值被限制

标签 c++ opengl hdr

我正在尝试在 OpenGL 中实现 HDR。

这是我制作 HDR 帧缓冲区的方式:

glGenFramebuffers(1, &framebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);

glGenTextures(1, &fboTex);
glBindTexture(GL_TEXTURE_2D, fboTex);
glTexImage2D( GL_TEXTURE_2D, 0,GL_RGBA16F,screen->w, screen->h,0,GL_RGBA,GL_FLOAT,NULL);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fboTex, 0);

glGenRenderbuffers(1, &depthBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, depthBuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, screen->w, screen->h);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, depthBuffer);


GLenum DrawBuffers[] = { GL_COLOR_ATTACHMENT0 };
glDrawBuffers(1, DrawBuffers);

if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
{
    std::cout<<"Error loading the Framebuffer"<<std::endl;
    return;
}



第一步,我使用这个像素着色器来渲染我的场景并测试 HDR 帧缓冲区:

void main (void)
{

 gl_FragColor = vec4(1.1,1.1,1.1,0.0);//1.1 just for test

}



我终于用这个像素着色器渲染到屏幕上:

uniform sampler2D tex;

void main(void) 
{

 float color = texture2D(tex, gl_TexCoord[0].st).x;

 if(color<1.1)gl_FragColor = vec4(1.0,0.0,0.0,0.0); //bad

 else gl_FragColor = vec4(0.0,1.0,0.0,0.0);//yes what we want

}



根据我的第二个着色器,如果 HDR 有效,我应该获得绿色全屏。但似乎我的值(value)观在第一步中被限制了,我得到了一个红色屏幕( if(color<1.1)gl_FragColor = vec4(1.0,0.0,0.0,0.0); )

最佳答案

您的代码是有限浮点精度的牺牲品。许多可以在十进制系统中精确表示的值,例如您示例中的 1.1,不能在 CPU/GPU 使用的基于二进制的浮点格式中精确表示。

这意味着当您将 1.1 写入输出时,实际值会略多或略少。然后,当您在第二遍中将该值与 1.1 进行比较时,结果将或多或少是任意的,具体取决于该值的舍入方式。

如果您将值存储为 R32F,这可能会奏效,因为存储格式的精度与比较期间使用的算术精度相同。但即使在那种情况下我也会紧张。几乎用浮点值做任何事情,并希望最终结果与预期值相同,这是很危险的,除非您确切地理解对值做了什么。

在这种情况下,由于该值存储为 R16F(半 float ),然后与 32 位浮点精度的原始值进行比较,几乎可以肯定它是不一样的。

关于c++ - OpenGL HDR 值被限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27539319/

相关文章:

swift - SceneKit Swift - 使用文件中的 HDR 环境光照贴图

c++ - 寻找单图像 HDR 算法

c++ - 警告 : taking address of temporary - C++

c++ - const 限定符是否会增加临时复合文字的生命周期?

c++ - 使用 vsync (OpenGL) 时 CPU 利用率为 100%

opengl - 为什么我可以在opengl 3环​​境中使用opengl 4功能

c++ - C++中随机访问归档的奇怪问题

c++ - 图像旋转 OpenCV 错误

opengl - <高兴/高兴.h> : No such file or directory