GLSL实现HDR Rendering 【转】
http://blog.csdn.net/a3070173/archive/2008/11/29/3408573.aspx
- HDR - 全称High dynamic rang,是目前流行的3D特效技术.其基本原理是:虽然在计算机图形中可以使用完全的浮点型来表
- 示颜色,但之前由于一直受到硬件的限制,从外部载入的纹理格式大多只能以每种颜色成分用一个字节来表示,也就是0-255,
- 当这个低范围的颜色值转换为浮点型之后就会导致一定量的颜色间隔,而HDR技术通过采用浮点型的外部纹理格式弥补了原来
- 整型纹理格式所导致的颜色间隔,从而增强了计算机图形的颜色表现能力.当然这只是笼统的说法,而且每个人对同一个概念
- 的理解也不尽相同,所以我在本文的最后列出了一些个人认为比较有用的参考资料,这里只简单描述一下我的HDR - OpenGL实
- 现,其实HDR的理念理解了之后就会比较简单,但真要编码实现的话还是有很多东西需要琢磨.
- 下面列出的是主要渲染流程:
- 备注(FBO代表Frame Buffer Object)
- 1.渲染整个场景到FBO1
- 2.下采样FBO1到尺寸为原来1/4的FBO2中
- 3.下采样FBO2到尺寸为原来1/8的FBO3中
- DownSample片元着色器:
- uniform sampler2D g_SceneTexture;
- void main()
- {
- gl_FragColor = texture2D(g_SceneTexture, gl_TexCoord[0].st);
- }
- 4.对经过两次下采样并保存在FBO3中的内容进行高斯过滤,并将处理过后的图像
- 保存在FBO4中(备注:高斯过滤分为横向过滤和纵向过滤两个通道,所以需要一个FBO5进行过渡)
- 高斯过滤片元着色器:
- const int g_iWeightNumber = 17;
- uniform sampler2D g_DecalTexture;
- uniform bool g_bFilterModel;
- uniform float g_aryWeight[g_iWeightNumber]; // Blur权重数组
- uniform vec2 g_aryVerticalOffset[g_iWeightNumber]; // 横向Blur偏移数组
- uniform vec2 g_aryHorizontalOffset[g_iWeightNumber]; // 纵向Blur偏移数组
- void main()
- {
- vec4 vec4Sum = vec4(0.0);
- if (g_bFilterModel)
- {
- // 横向过滤
- for(int i = 0; i < g_iWeightNumber; ++i)
- {
- vec4Sum += texture2D(g_DecalTexture, gl_TexCoord[0].st + g_aryVerticalOffset[i])*g_aryWeight[i];
- }
- }
- else
- {
- // 纵向过滤
- for(int i = 0; i < g_iWeightNumber; ++i)
- {
- vec4Sum += texture2D(g_DecalTexture, gl_TexCoord[0].st + g_aryHorizontalOffset[i])*g_aryWeight[i];
- }
- }
- gl_FragColor = vec4Sum;
- }
- 5.FBO4中的内容与FBO1中的内容进行特效处理和ToneMapping以将高动态范围的颜色值映射对低动态范围以便于显示.
- ToneMapping片元着色器:
- const float g_fGamma = 1.0/2.0;
- uniform float g_fBlurAmount; // 模糊量
- uniform float g_fRadialEffectAmount; // 放射式效果量
- uniform float g_fExposure; // 暴光量
- uniform sampler2D g_SceneTexture;
- uniform sampler2D g_BlurTexture;
- // 计算放射式效果
- vec4 CaculateRadial(vec2 p_vec2TexCoord,int p_iSampleNumber,
- float p_fStartScale = 1.0, float p_fScaleMul = 0.9)
- {
- // 临时变量
- vec4 vec4TempColor = vec4(0.0);
- float fCurrentScale = p_fStartScale;
- vec2 vec2TempTexCoord = vec2(0.0);
- // 遍历采样
- for(int i = 0; i < p_iSampleNumber; ++i)
- {
- vec2TempTexCoord = (p_vec2TexCoord - 0.5)*fCurrentScale + 0.5; // 采样方式
- vec4TempColor += texture2D(g_BlurTexture, vec2TempTexCoord);
- fCurrentScale *= p_fScaleMul;
- }
- vec4TempColor /= float(p_iSampleNumber);
- return vec4TempColor;
- }
- // 计算小插图效果
- float CaculateVignette(vec2 p_vec2Position, float p_fInner, float p_fOuter)
- {
- float L = length(p_vec2Position);
- return ( 1.0 - smoothstep(p_fInner, p_fOuter, L) );
- }
- void main()
- {
- vec4 vec4SceneColor = texture2D(g_SceneTexture, gl_TexCoord[0].st); // 计算原始场景颜色
- vec4 vec4BlurColor = texture2D(g_BlurTexture, gl_TexCoord[0].st); // 计算经Blur后的场景颜色
- vec4 vec4RadialEffectColor = CaculateRadial(gl_TexCoord[0].st, 30, 1.0, 0.95); // 计算放射效果的颜色
- // 混合场景与Blur
- vec4 vec4Temp = lerp(vec4SceneColor, vec4BlurColor, g_fBlurAmount);
- // 添加放射性效果
- vec4Temp += vec4RadialEffectColor*g_fRadialEffectAmount;
- // 进行暴光
- vec4Temp *= g_fExposure;
- // 添加圆形扩散小插图效果使得中间部分较亮而四个边角逐渐变暗
- vec4Temp *= CaculateVignette(gl_TexCoord[0].st*2.0 - 1.0, 0.7, 1.5);
- // 使用Gamma校正规范会低范围光照
- vec4Temp.rgb = pow(vec4Temp.rgb, vec3(g_fGamma));
- // 最终颜色
- gl_FragColor = vec4Temp;
- }
- Demo效果截图:
- exe文件:http://www.fileupyours.com/view/219112/GLSL/HDR%20Rendering.rar
- VC9运行库:http://www.fileupyours.com/view/219112/GLSL/VC9RunningLib.rar
- 参考资料:1.DirectX SDK Sample - HDRLighting(备注:这个可以从DirectX SDK中获得)
- 2.Nvidia SDK 10.5 - HDR(备注:Nvidia SDK可以在Nvidia的网站上免费下载)
GLSL实现HDR Rendering 【转】的更多相关文章
- paper 72 :高动态范围(HDR)图像 HDR (High Dynamic Range)
In standard rendering, the red, green and blue values for a pixel are each represented by a fraction ...
- Unity3d HDR和Bloom效果(高动态范围图像和泛光)
文章开始先放两组效果,文章结尾再放两组效果本文测试场景资源来自浅墨大神,shader效果为本文效果 HDR 人们有限的视觉系统,只支持16.7百万的颜色,超出这个范围的颜色就不能显示了bmp或jprg ...
- Deferred shading rendering path翻译
Overview 概述 When using deferred shading, there is no limit on the number of lights that can affect a ...
- 由浅入深学习PBR的原理和实现
目录 一. 前言 1.1 本文动机 1.2 PBR知识体系 1.3 本文内容及特点 二. 初阶:PBR基本认知和应用 2.1 PBR的基本介绍 2.1.1 PBR概念 2.1.2 与物理渲染的差别 2 ...
- iOS 10.0 更新点(开发者视角)
html, body {overflow-x: initial !important;}html { font-size: 14px; } body { margin: 0px; padding: 0 ...
- NV SDK 9.5, 10 and 11
NVIDIA SDK 10 Overview This all-new collection of DirectX 10 and OpenGL code samples teaches devel ...
- (转)Unity3d中的属性(Attributes)整理
Attributes属性属于U3D的RunTimeClass,所以加上以下的命名空间是必须的了.其它倒没什么需要注意的.本文将所有运行属性过一遍罢了. using UnityEngine; using ...
- Unity3d该物业(Attributes)整理
http://blog.sina.com.cn/s/blog_5b6cb9500101857b.html Attributes属性属于U3D的RunTimeClass,所以加上下面的命名空间是必须的了 ...
- Unity3d中的属性(Attributes)整理
Attributes属性属于U3D的RunTimeClass,所以加上以下的命名空间是必须的了.其它倒没什么需要注意的.本文将所有运行属性过一遍罢了. using UnityEngine; using ...
随机推荐
- UML系列图------用例图介绍
UML-Unified Model Language 统一建模语言,又称标准建模语言.是用来对软件密集系统进行可视化建模的一种语言. 在UML系统开发中有三个主要的模型: 功能模型: 从用户的角度展示 ...
- echo输出空行
rem 以下方法都可以输出空行,这十种方法分为三组,每组的效率依次递减 echo= echo, echo; echo+ echo/ echo[ echo] echo: echo. echo\
- 闲谈Future模式-订蛋糕
一. Future模式简介 Future有道翻译:n. 未来:前途:期货:将来时.我觉得用期货来解释比较合适.举个实际生活中例子来说吧,今天我女朋友过生日,我去蛋糕店准备给女朋友定个大蛋糕,超级大的那 ...
- sql统计重复数据
sql代码如下: 统计重复的数据 select MingCheng from tabShouFeiGongShi group by MingCheng having count(MingCheng) ...
- ios8 下请求读取通讯录权限 (网上众多资料漏下得一个坑)
读取通讯录权限网上都有,不再叙述. 当第一次授权时用户假如拒绝授权, 第二次就无法再次弹出提示框授权. 刚开始时完全按照网上例子写的,第一次拒绝授权后,在设置里面无法找到对应的更改读取权限的选项. 后 ...
- cordova,phonegap 重力感应
3.0版本后,cordova通过插件模式实现设备API,使用CLI的plugin命令可以添加或者移除插件: $ cordova plugin add org.apache.cordova.device ...
- 第二百一十三天 how can I 坚持
今天去爬山了,百望山,山好矮,绕来绕去也挺远的,山上有座庙,佘太君庙,还有个望京楼,还看到了个写书法的,不懂,但很崇拜. 今天玩LOL全输了,咋搞的呢. 还有买了点排骨,都没吃完. 下周去爬凤凰岭. ...
- KextWizard 的使用方法;以及Kext安装的几种工具下载
a.将你需要安装的Kext拖到非中文的路径中: b.运行该软件,将Kext拖入下图对应的方框里,然后选择位置安装: c.选择修复权限和重建缓存(一个是修复Extra文件夹,一个是修复SLE) Kext ...
- socket发送和接收数据
1)sendBuf(),sendText(),sendStream() 几乎所有的通信控件都会提供上面的3个方法.首先看看SendBuf(). function TCustomWinSocket.Se ...
- JQuery点击收起,点击展开以及部分非空小验证
<tr> <td nowrap align="right" width="18%"> 解决方案: </td> <td ...