GLSL实现HDR Rendering 【转】

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 【转】

时间: 2024-10-09 23:09:47

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

第4章:缓冲区、着色器、GLSL

原文链接: http://www.rastertek.com/gl40tut04.html Tutorial 4: Buffers, Shaders, and GLSL This tutorial will be the introduction to writing vertex and pixel shaders in OpenGL 4.0. It will also be the introduction to using vertex and index buffers in OpenG

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 in the range 0..1, where 0 represents zero intensity and 1 represents the maximum intensity for the display device. While this is straightforward to

Linear Rendering

Linear Rendering Overview Linear rendering refers to the process of rendering a scene with all inputs being linear. Normally textures exist with gamma correction pre-applied to them, which means that when the textures are sampled in a material the va

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

文章开始先放两组效果,文章结尾再放两组效果 本文测试场景资源来自浅墨大神,shader效果为本文效果 HDR 人们有限的视觉系统,只支持16.7百万的颜色,超出这个范围的颜色就不能显示了 bmp或jprg每个像素就是16,24或32位 每个像素都由红绿蓝构成,如果储存为24位,每个值的范围就在0,255之间, 只能表现出256:1的差别,unity的shader中是0到1 然而在自然中太阳光下的对比度是50000:1 HDR(High Dynamic Range)使图像能表现出更大范围的对比,普

Ogre参考手册(四)3.1.4-3.1.14 声明顶点、几何、片段程序(Ogre着色器脚本)

3.1.4 声明顶点.几何.片段程序 使用着色程序前需要先对其定义,一个程序定义可以用于多个材质,这仅需要在所使用的材质定义之前定义该程序. 程序定义可以内嵌在.material脚本中(需要放在所有引用的材质之前),或者希望可以在多个.material中使用,可以在外部.program脚本中定义.在.material和.program中的定义完全相同,区别仅在于.program文件会在所有.material之前解析,因此可以确保程序定义会先于任何使用它的材质定义. 程序可以是底层的(依据具体规范

Snowman

A simple demo using deferred shading and hdr rendering. I make the scene myself using 3ds max. Here is the github link: https://github.com/league1991/Snowman Here are the results: 来自为知笔记(Wiz)

A Quick Overview of MSAA

A Quick Overview of MSAA 原文地址:https://mynameismjp.wordpress.com/2012/10/24/msaa-overview/ Previous article in the series: Applying Sampling Theory to Real-Time Graphics MSAA can be a bit complicated, due to the fact that it affects nearly the entire

Unity3d中的属性(Attributes)整理

Attributes属性属于U3D的RunTimeClass,所以加上以下的命名空间是必须的了.其它倒没什么需要注意的.本文将所有运行属性过一遍罢了. 想看更详细的点这里 using UnityEngine; using System.Collections; 1. [AddComponentMenu] 添加组件菜单 这函数只是起方便用,原本的脚本(组建)都会在"Component/Script"菜单下,在类之前声明一下这个,它便可以出现在"Componet"菜单下

UNREAL ENGINE 4.12 正式发布!下载地址

UNREAL ENGINE 4.12 正式发布! 下载地址:https://www.unrealengine.com/ Alexander Paschall 在 June 1, 2016 |功能新闻社区 Share on Facebook Share on Twitter Share on Google+ Share on LinkedIn 此版本内含虚幻引擎 4 的数百个更新,以及 GitHub 虚幻引擎开发者社区提交的 106 项改良!特此对虚幻引擎 4.12 版本的贡献者们表达诚挚谢意: