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. 仿照FFmpeg在GLSL中处理HDR.ToneMapping(下)

    FFmpeg 命令行 HDR 转 SDR ffmpeg -i planet_hdr.MP4 -vf zscale=t=linear:npl=100,format=gbrpf32le,zscale=p= ...

  2. HDR (automatic exposure control + Tonemapping + Bloom)

    <div class="markdown_views"><!-- flowchart 箭头图标 勿删 --><svg xmlns="http ...

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

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

  4. learnopengl——HDR——完结

    原文网址:https://learnopengl.com/Advanced-Lighting/HDR HDR brightness and color values by default are cl ...

  5. 【HDR学习】苹果EDR技术洞察(二)

    综述 苹果用 EDR 这个词是为了跟 HDR 区分开,因为 HDR 在不同的场景可能对应着不同的理解: HDR 显示:更生动的显示亮色和暗色 HDR 格式:HDR10.Dolby Vision HDR ...

  6. 第四章:缓冲区、着色器、GLSL

    原文链接: http://www.rastertek.com/gl40tut04.html Tutorial 4: Buffers, Shaders, and GLSL 第四章:缓冲区.着色器.GLS ...

  7. unity的HDR效果

    http://blog.csdn.net/wolf96/article/details/44057915 文章开始先放两组效果,文章结尾再放两组效果 本文测试场景资源来自浅墨大神,shader效果为本 ...

  8. Arm Mali GPU最佳实践(Arm Mali GPU Best Practices)

    (部分收录) 简介 本文设计为快速查询指南,所以假设读者熟悉了底层API的使用:我们将在其它文章中更详细地去讨论特定的主题,并花更多时间向仍在学习API的开发人员解释相关的概念. 注意:这些建议是为M ...

  9. Unity3D脚本属性

    Unity3D的脚本属性用法: // JavaScript@script AddComponentMenu ("Transform/Follow Transform") // CS ...

最新文章

  1. 多摄像头实时目标跟踪和计数,使用YOLOv4,Deep SORT和Flask
  2. opencv学习(十六)之颜色空间转换cvtColor()
  3. 使用Filezilla Server配置FTP服务器
  4. springboot实现简单的文件上传与回显
  5. 傅立叶变换、拉普拉斯变换、Z变换的联系?为什么要进行这些变换。研究的都是什么?
  6. C++编程语言中创建类的对象(类的初始化)的方法
  7. 从棋盘左上角到右下角共有多少种走法
  8. 文华财经期货买卖点指标源码,期货超短线指标公式源码
  9. 如何生成SSH key以及免密设置
  10. mysql修改表的内容_sql怎么修改表内容
  11. Arcmap特殊注记
  12. 让IE浏览器打开JSON文件直接显示
  13. ubuntu U盘只读的修复办法
  14. (二十六)Fama-French三因素模型及应用
  15. 任天堂官网在哪里修改服务器,任天堂服务器设置
  16. ansible批量免密
  17. 常用API部分测试题
  18. 这次终于理解了PCA主成分分析(附代码)
  19. mysql中模型的作用是什么_BIM模型包括什么信息功能?BIM模型有哪些功能应用
  20. matlab打开mat文件,MAT文件打开方法汇总及其他操作

热门文章

  1. DCMTK:测试DcmSCPPool类,包括DcmSCP和DcmSCU交互
  2. VTK:相互作用之CallData
  3. VTK:图片之DrawShapes
  4. OpenCV非真实感渲染模块的实例(附完整代码)
  5. Qt Linguist 开发人员 programmers
  6. Qt Creator将UI项目转换为应用程序
  7. OpenGL实现Amiga Boing
  8. c++Interpolation search插值搜索的实现算法之二(附完整源码)
  9. C++实现对链表的选择排序算法(附完整源码)
  10. C++绝不在构造和析构过程中调用virtual函数