http://blog.csdn.net/a3070173/archive/2008/11/29/3408573.aspx

  1. HDR - 全称High dynamic rang,是目前流行的3D特效技术.其基本原理是:虽然在计算机图形中可以使用完全的浮点型来表
  2. 示颜色,但之前由于一直受到硬件的限制,从外部载入的纹理格式大多只能以每种颜色成分用一个字节来表示,也就是0-255,
  3. 当这个低范围的颜色值转换为浮点型之后就会导致一定量的颜色间隔,而HDR技术通过采用浮点型的外部纹理格式弥补了原来
  4. 整型纹理格式所导致的颜色间隔,从而增强了计算机图形的颜色表现能力.当然这只是笼统的说法,而且每个人对同一个概念
  5. 的理解也不尽相同,所以我在本文的最后列出了一些个人认为比较有用的参考资料,这里只简单描述一下我的HDR - OpenGL实
  6. 现,其实HDR的理念理解了之后就会比较简单,但真要编码实现的话还是有很多东西需要琢磨.
  7. 下面列出的是主要渲染流程:
  8. 备注(FBO代表Frame Buffer Object)
  9. 1.渲染整个场景到FBO1
  10. 2.下采样FBO1到尺寸为原来1/4的FBO2中
  11. 3.下采样FBO2到尺寸为原来1/8的FBO3中
  12. DownSample片元着色器:
  13. uniform sampler2D g_SceneTexture;
  14. void main()
  15. {
  16. gl_FragColor = texture2D(g_SceneTexture, gl_TexCoord[0].st);
  17. }
  18. 4.对经过两次下采样并保存在FBO3中的内容进行高斯过滤,并将处理过后的图像
  19. 保存在FBO4中(备注:高斯过滤分为横向过滤和纵向过滤两个通道,所以需要一个FBO5进行过渡)
  20. 高斯过滤片元着色器:
  21. const int g_iWeightNumber = 17;
  22. uniform sampler2D g_DecalTexture;
  23. uniform bool g_bFilterModel;
  24. uniform float g_aryWeight[g_iWeightNumber]; // Blur权重数组
  25. uniform vec2 g_aryVerticalOffset[g_iWeightNumber];  // 横向Blur偏移数组
  26. uniform vec2 g_aryHorizontalOffset[g_iWeightNumber];    // 纵向Blur偏移数组
  27. void main()
  28. {
  29. vec4 vec4Sum = vec4(0.0);
  30. if (g_bFilterModel)
  31. {
  32. // 横向过滤
  33. for(int i = 0; i < g_iWeightNumber; ++i)
  34. {
  35. vec4Sum += texture2D(g_DecalTexture, gl_TexCoord[0].st + g_aryVerticalOffset[i])*g_aryWeight[i];
  36. }
  37. }
  38. else
  39. {
  40. // 纵向过滤
  41. for(int i = 0; i < g_iWeightNumber; ++i)
  42. {
  43. vec4Sum += texture2D(g_DecalTexture, gl_TexCoord[0].st + g_aryHorizontalOffset[i])*g_aryWeight[i];
  44. }
  45. }
  46. gl_FragColor = vec4Sum;
  47. }
  48. 5.FBO4中的内容与FBO1中的内容进行特效处理和ToneMapping以将高动态范围的颜色值映射对低动态范围以便于显示.
  49. ToneMapping片元着色器:
  50. const float g_fGamma = 1.0/2.0;
  51. uniform float g_fBlurAmount;    // 模糊量
  52. uniform float g_fRadialEffectAmount;    // 放射式效果量
  53. uniform float g_fExposure;  // 暴光量
  54. uniform sampler2D g_SceneTexture;
  55. uniform sampler2D g_BlurTexture;
  56. // 计算放射式效果
  57. vec4 CaculateRadial(vec2 p_vec2TexCoord,int p_iSampleNumber,
  58. float p_fStartScale = 1.0, float p_fScaleMul = 0.9)
  59. {
  60. // 临时变量
  61. vec4 vec4TempColor = vec4(0.0);
  62. float fCurrentScale = p_fStartScale;
  63. vec2 vec2TempTexCoord = vec2(0.0);
  64. // 遍历采样
  65. for(int i = 0; i < p_iSampleNumber; ++i)
  66. {
  67. vec2TempTexCoord = (p_vec2TexCoord - 0.5)*fCurrentScale + 0.5;  // 采样方式
  68. vec4TempColor += texture2D(g_BlurTexture, vec2TempTexCoord);
  69. fCurrentScale *= p_fScaleMul;
  70. }
  71. vec4TempColor /= float(p_iSampleNumber);
  72. return vec4TempColor;
  73. }
  74. // 计算小插图效果
  75. float CaculateVignette(vec2 p_vec2Position, float p_fInner, float p_fOuter)
  76. {
  77. float L = length(p_vec2Position);
  78. return ( 1.0 - smoothstep(p_fInner, p_fOuter, L) );
  79. }
  80. void main()
  81. {
  82. vec4 vec4SceneColor = texture2D(g_SceneTexture, gl_TexCoord[0].st);     // 计算原始场景颜色
  83. vec4 vec4BlurColor = texture2D(g_BlurTexture, gl_TexCoord[0].st);       // 计算经Blur后的场景颜色
  84. vec4 vec4RadialEffectColor = CaculateRadial(gl_TexCoord[0].st, 30, 1.0, 0.95);  // 计算放射效果的颜色
  85. // 混合场景与Blur
  86. vec4 vec4Temp = lerp(vec4SceneColor, vec4BlurColor, g_fBlurAmount);
  87. // 添加放射性效果
  88. vec4Temp += vec4RadialEffectColor*g_fRadialEffectAmount;
  89. // 进行暴光
  90. vec4Temp *= g_fExposure;
  91. // 添加圆形扩散小插图效果使得中间部分较亮而四个边角逐渐变暗
  92. vec4Temp *= CaculateVignette(gl_TexCoord[0].st*2.0 - 1.0, 0.7, 1.5);
  93. // 使用Gamma校正规范会低范围光照
  94. vec4Temp.rgb = pow(vec4Temp.rgb, vec3(g_fGamma));
  95. // 最终颜色
  96. gl_FragColor = vec4Temp;
  97. }
  98. Demo效果截图:
  99. exe文件:http://www.fileupyours.com/view/219112/GLSL/HDR%20Rendering.rar
  100. VC9运行库:http://www.fileupyours.com/view/219112/GLSL/VC9RunningLib.rar
  101. 参考资料:1.DirectX SDK Sample - HDRLighting(备注:这个可以从DirectX SDK中获得)
  102. 2.Nvidia SDK 10.5 - HDR(备注:Nvidia SDK可以在Nvidia的网站上免费下载)

GLSL实现HDR Rendering 【转】的更多相关文章

  1. 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 ...

  2. Unity3d HDR和Bloom效果(高动态范围图像和泛光)

    文章开始先放两组效果,文章结尾再放两组效果本文测试场景资源来自浅墨大神,shader效果为本文效果 HDR 人们有限的视觉系统,只支持16.7百万的颜色,超出这个范围的颜色就不能显示了bmp或jprg ...

  3. Deferred shading rendering path翻译

    Overview 概述 When using deferred shading, there is no limit on the number of lights that can affect a ...

  4. 由浅入深学习PBR的原理和实现

    目录 一. 前言 1.1 本文动机 1.2 PBR知识体系 1.3 本文内容及特点 二. 初阶:PBR基本认知和应用 2.1 PBR的基本介绍 2.1.1 PBR概念 2.1.2 与物理渲染的差别 2 ...

  5. iOS 10.0 更新点(开发者视角)

    html, body {overflow-x: initial !important;}html { font-size: 14px; } body { margin: 0px; padding: 0 ...

  6. NV SDK 9.5, 10 and 11

    NVIDIA SDK 10   Overview This all-new collection of DirectX 10 and OpenGL code samples teaches devel ...

  7. (转)Unity3d中的属性(Attributes)整理

    Attributes属性属于U3D的RunTimeClass,所以加上以下的命名空间是必须的了.其它倒没什么需要注意的.本文将所有运行属性过一遍罢了. using UnityEngine; using ...

  8. Unity3d该物业(Attributes)整理

    http://blog.sina.com.cn/s/blog_5b6cb9500101857b.html Attributes属性属于U3D的RunTimeClass,所以加上下面的命名空间是必须的了 ...

  9. Unity3d中的属性(Attributes)整理

    Attributes属性属于U3D的RunTimeClass,所以加上以下的命名空间是必须的了.其它倒没什么需要注意的.本文将所有运行属性过一遍罢了. using UnityEngine; using ...

随机推荐

  1. 将war包布署在本地tomcat上

    1.把war包解压到..webapps目录下 2. 修改server.xml文件,在host节点中添加 <Context docBase="C:\Users\bai\Desktop\s ...

  2. CMDB属性及分类问题思考

    定义的烦恼 在某一次系统监控的讨论会议上,我随便提出了个问题:“如何定义一个系统?”,结果答案就五花八门起来了,会议也跑题了. 为什么问这个问题,是因为某些同事觉得某个系统比较大,就往下分为子系统.组 ...

  3. iOS学习笔记之回调(一)

    什么是回调 看了好多关于回调的解释的资料,一开始总觉得这个概念理解起来有点困难,可能是因为自己很少遇到这种类型的调用吧.探索良久之后,才算有点启发,下面是自己的一点理解. 我们知道,在OSI网络七层模 ...

  4. 1005acm罚时

    ACM国际大学生程序设计竞赛是由国际计算机学会主办的,一项旨在展示大学生创新能力.团队精神和在压力下编写程序.分析和解决问题能力的年度竞赛.参赛队伍最多由三名参赛队员组成,竞赛中一般命题10-13题, ...

  5. 在使用EF开发时候,遇到 using 语句中使用的类型必须可隐式转换为“System.IDisposable“ 这个问题。

    原因就是 这个程序集中没有引用EntityFramework.可以使用Nuget 安装EntityFramewok.

  6. sysctl.conf

    linux系统接口 允许改变正在运作linux系统接口Tcp/IP堆栈和虚拟内存系统的高级选项 用来控制Linux网络配置/proc/sys/net/core/ TCP/IP参数修改添加到/etc/s ...

  7. JavaScript 继承方式详解

    js继承的概念 js里常用的如下两种继承方式: 原型链继承(对象间的继承)类式继承(构造函数间的继承) 由于js不像java那样是真正面向对象的语言,js是基于对象的,它没有类的概念.所以,要想实现继 ...

  8. 2013年度Python Git工具

    Pycoders周刊根据读者对周刊文章的点击数据,评选出了2013年最受关注的和Git相关的Python工具. git-workflow (github.com) 可视化你的 git 工作流程的工具, ...

  9. JAVA插入数据到MySql少了8小时

    这个问题,真的是找了很久. 之前以为是mysql的timezone有问题.根据网上的方法,把timezone改了,还是不起作用. 然后以为是java的问题,但试来试去java也不存在timezone不 ...

  10. iOS多线程总结

    1.不要同时开太多的线程(1~3条线程即可,不要超过5条) 2.线程概念 1> 主线程 : UI线程,显示.刷新UI界面,处理UI控件的事件 2> 子线程 : 后台线程,异步线程 3.不要 ...