【opengl】HDR与Bloomw(未)

本文介绍了在OpenGL中实现HDR(高动态范围)和Bloom(泛光)的技术。首先,通过创建浮点帧缓冲和纹理来存储超出常规亮度范围的数据。接着,详细讲解了Reinhard色调映射的实现,以及如何进行亮度提取和高斯模糊以产生Bloom效果。文章还提到了使用多渲染目标(MRT)来提取亮色,并在后续步骤中进行混合,以达到柔和的光线变化效果。
摘要由CSDN通过智能技术生成

HDR

HDR(Hight Dynamic Range,高动态范围):
一般来讲,在我们的屏幕上显示的一个帧(Frame),在OPENGL中是以**帧缓冲(Framebuffer)**的形式存储的,默认情况下它的画面的亮度和颜色的值是被限制在0.0到1.0之间的一个值。
这导致倘若我们在着色器的使用过程中有超过的了1.0的亮度范围,(比如:我们正常使用的点光源亮度为1.0,若有多个点光源叠加照射在物体上,就有可能超过1.0,就会导致一部分片段的光照强度会被约束在1.0,造成画面失真。)
未使用HDR

而我们需要做的就是代替系统,将当前的亮度合理的分配至0.0-1.0的屏幕亮度范围,即可使画面恢复正常的显示。

这个亮度分配通常会在片段着色器内进行。但是由于目前我们的渲染过程中,使用了很多个着色器。

如果我们只修改了一个着色器内的亮度分配,其他的着色器却没有更改,就会导致只有一部分的画面显示正常。

所以最懒的方式是将整个画面作为一个纹理导入一个专用的着色器中进行处理,再将画面输出。

那么如何将画面导出为一个纹理呢?
其实很简单,我们的屏幕的每一帧的画面的存储方式就是一个纹理,只不过它处理完成后直接被输出到屏幕上了。

那么我们只需要创建一个帧,这个帧拥有一个可以存储更大颜色范围的纹理,让最初的绘制不再绘制在屏幕上,而是绘制在这个帧的纹理上。

要进行画面亮度的重分配,首先我们需要将原本会显示在 默认帧(屏幕) 上的画面,用一个新的帧作为中间人存储,这个帧应该含有一个颜色范围更大的纹理。
随后将这个纹理,作为默认帧的输入,在绘制过程中调节纹理的亮度,并绘制在默认帧(屏幕) 上即可。
由于我们最后在默认帧上绘制时,只需要绘制一个整幅的经过亮度调节的图像,所以绘制一个带有该纹理的屏幕大小的四边形就可以。

我们预计将会得到如下的结果。

浮点帧缓冲

创建帧缓冲

我们之前一直都是在默认帧渲染,它的默认光照强度是0-1.0。

	glBindFramebuffer(GL_FRAMEBUFFER, 0);

我们需要创建一个新的帧,它的纹理应该可以存储那些大于1.0的浮点数据,也就是我们需要它的数据类型可以更大。

像其他创建opengl顶点数组或纹理一样,我们首先需要向系统获取一个可用的该类型的索引,这类索引通常为一个GLuint类型的值,所以我们新建一个GLuint类型的变量fbo(frame buffer object) 来存储。

	//创建一个新的帧
	GLuint fbo;
	//注意传的是地址
	glGenFramebuffers(1, &fbo);

随后由于我们要为这个帧进行一些操作,所以需要告诉系统,当前的帧要切换为我们新建的fbo先生。

这个过程我们称为绑定,在OPENGL中大部分的类型的操作都需要在绑定后进行操作,比如顶点数组(vao),顶点缓冲(vbo),纹理,还有接下来将会介绍的渲染缓冲(Render buffer)

虽然我们可以在对它进行操作的时候再去绑定。但是,我们接下来肯定要对它进行操作的,所以先绑上也没什么坏处,对吧?

//绑定当前的帧缓冲为索引号fbo的帧缓冲
glBindFramebuffer(GL_FRAMEBUFFER, fbo);

一个可用的帧,必须包含一个用于输出的纹理缓冲区,用来存放渲染生成的图像。我们之前使用的默认帧(默认索引为:0) 的纹理缓冲区就是我们的屏幕。
屏幕上印刷的每一帧实际上就是一张2D的图片。
而一个帧还可以包含,深度缓冲模板缓冲用于相应的需求。
在HDR中我们只需对图片的亮度进行处理,所以只要在新建的帧上挂载纹理缓冲即可。

创建纹理

同样,我们第一步要获取一个可用的纹理索引,随后绑定纹理。


                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1 课程简介:本课程详细讲解了OpenGL从入门到精通的理论+实践知识,对于每一个知识点都会带领学员通过代码来实现功能。其中涵盖了基础图元绘制,基础光照,高级过程,高级光照等内容;当前图形引擎的应用已经越来越广泛,春晚以及各大综艺节目已经开始使用XR作为主流的内容制作技术,房地产漫游及Web渲染技术已经开始茁壮发展,VR也即将突破硬件瓶颈;普遍的游戏引擎在独特的领域已经无法完全实用,且我们国家要发展自主科技技术,图形引擎以及CAD等卡脖子技术一定会蓬勃发展,所以同学们要抓住机会,趁势而上,熟悉底层,博取更大发展,学习OpenGL底层接口的应用以及图形学算法,将是您向纵深发展的第一步!2 课程解决优势:很多同学学习OpenGL最难的是找到路径,并且其中牵扯到的理论知识点无法完全理解透彻(比如VAO与VBO的区别,MVP矩阵变换的推导及原理,光照系统的设计及算法推导,帧缓存的灵活应用等),我们的课程可以带领大家从原理+实践的角度进行学习,每一个知识点都会:a 推导基础公式及原理 b 一行一行进行代码实践从而能够保证每位同学都学有所得,能够看得懂,学得会,用得上,并且能够培养自主研究的能力。学习课程所得:学习本课程完毕之后,学员可以全方位的完全了解OpenGL当中的必要接口,并且可以对图形学的基础知识融会贯通,可以制作中级的特效。并且对于UnrealEngine以及Unity3D的学习更加轻松,对于各类商业引擎当中的算法以及内容制作手法更加深刻理解把控。学员也可以自行进行图形引擎的设计以及研究,并且将本课程的知识点进行代码模块化编写;能够自主推导图形学管线以及应用当中的各类公式,并且理解其几何含义。 代码与PPT资源,已随课程附赠,请同学们对应课程下载 
OpenGL HDR(高动态光照渲染)是一种提高场景照明效果的技术,通过模拟真实世界中光线的强度和能量分布,增强场景的真实感。 一个实例是在一个室内场景中使用HDR渲染技术。在这个场景中,我们有一个房间,里面有家具和窗户。首先,我们需要确定场景的光源,可以选择一个室外阳光作为主要光源。然后,通过设置光源的强度和颜色,将其调整为适合HDR渲染的范围。 接下来,我们需要将场景的材质和纹理设置为合适的HDR材质。良好的HDR效果需要逼真的光反射和折射效果,因此我们需要使用具有高光反射的材质,并为纹理添加高光和阴影细节。在调整纹理的亮度和对比度时,需要确保它们仍然在HDR范围内。 然后,我们可以使用OpenGL在屏幕上绘制场景。在渲染管线中,我们需要使用合适的HDR渲染器和tone mapping算法来处理高动态范围的像素。渲染器将计算出每个像素的亮度值,并根据主要光源的强度和材质属性来计算出最终的颜色。tone mapping算法将调整像素的亮度,并限制其在屏幕上的显示范围,以保持场景的可视性和真实感。 最后,我们可以在屏幕上看到使用HDR渲染的结果。场景中的光源将产生逼真的光照效果,材质和纹理的高光和阴影细节将更加真实,整个场景将呈现出更好的视觉效果。 总结起来,通过合适的光照和材质设置,以及HDR渲染和tone mapping技术,我们可以在OpenGL中实现高动态范围的光照渲染。这种技术可以提供更加真实和令人愉悦的视觉效果,为虚拟场景增添细节和逼真度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值