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. VM虚拟机快照还原效果实现方式

    ===================================================默认"快照删除"行为:============================ ...

  2. Thread .join 的用法一例

    在使用身份证读卡器时,要求 1. 身份证读到身份证 就 停止线程. 2. 关闭界面时会 自动停止调用读身份证的线程.这时候就需要用到 Thead.join 例子如下: Thread thread; p ...

  3. CSS框架分析与网站的CSS架构

    框架(framework)是一个基本概念上的结构,用于去解决或者处理复杂的问题,是一种可复用的构架. 我们对CSS框架这个词比较陌生,但对于JavaScript框架就比较熟悉了,比如jQuery 但为 ...

  4. 将垃圾送入无底洞,顺便整理dev知识

    相信用过Linux的童鞋们都用过crontab来做定时任务,不需要额外的安装程序和配置,一条简单的语句搞定定时任务,但是小伙伴们发现了没,如果你的定时任务执行频率很高而且会产生大量的输出的话,你的老爷 ...

  5. Java 分割文件 注意事项

    public static void main(String args[]) throws Exception { if (args.length < 1) { System.exit(0); ...

  6. I-frame、B-frame、P-frame及DTS、PTS的关系(转)

    基本概念: I frame :帧内编码帧 又称intra picture,I 帧通常是每个 GOP(MPEG 所使用的一种视频压缩技术)的第一个帧,经过适度地压缩,做为随机访问的参考点,可以当成图象. ...

  7. HDU ACM 1134 Game of Connections / 1130 How Many Trees?(卡特兰数)

    [题目链接]http://acm.hdu.edu.cn/showproblem.php?pid=1134 [解题背景]这题不会做,自己推公式推了一段时间,将n=3和n=4的情况列出来了,只发现第n项与 ...

  8. ZOJ-3349 Special Subsequence 线段树优化DP

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3349 题意:给定一个数列,序列A是一个满足|Ai-Ai-1| & ...

  9. InterfaceConnect

    GUID aguid; _di_IInterface a, c; Calld::TEventSink* FEventSink; Server_tlb::_di_IServerWithEvents FS ...

  10. AnnotationSessionFactoryBean用法介绍

    http://blog.csdn.net/flyingfalcon/article/details/8273618 —————————————————————————————————————————— ...