所谓HDR就是高动态范围的意思。在普通的显示器和位图里,每通道都是8-bit,也就是说RGB分量的范围都是0-255,这用来表示现实中的颜色显然是远远不够的。现实中的图像的动态范围远远大的多,那么如何在现有的显示设备里尽可能的保持更大的动态范围,而且让它能更符合人眼的习惯就成了图形学研究的一个热点。通常真正的HDR的做法都是采用浮点纹理,把渲染运算的过程中,我们使用16bit的动态范围来保存运算结果,然后对运算结果进行分析,求出这个图像的中间灰度值,然后对图像进行调整映射到LDR的设备中。但是这样的算法有两个非常耗资源的过程,其中一个是浮点纹理,另外一个就是求图像中间灰度(通常情况是把图像不停的渲染到RenderTarget,每渲染一次,图像大小缩小一半,直到缩小到1x1大,一个1024 x1024的图像需要渲染10次!)。因此虽然HDR的效果非常漂亮,但是目前还是只有为数不多的产品采用了这样的算法,大部分都是采用的伪HDR+blow效果。

伪HDR效果通常是重新调整图像的亮度曲线,让亮的更亮,暗的更暗一些,而Blow效果则是图像的亮度扩散开来,产生柔和的效果。

在这里采用一个二次曲线来重新调整图像的亮度,这个曲线的方程是

x [ (2-4k) x + 4k-1 ).

K的取值范围为0.5 – 2.0

经过这个公式调整以后,图像上亮的区域将更加的亮,并且整体亮度会提高。那么接下来,如何使图像的亮度扩散开来呢?一种可行的方法就是对场景图像做一次downsample。把它变成原来的1/4次大小,那样就等于亮度往外扩散了4x4个象素的区域。

技术方案已经基本有了。接下来将要在RenderMonkey里实现它,和前面的例子不同,这里需要使用RenderMonkey的多pass渲染:

第一个pass我们先对图像进行downsample操作。首先在原来的pass前增加一个新的pass,并命名为downsample pass。然后建立一个render to texture的纹理节点,设定它的大小(原图像大小的1/4),并在新建立的pass里建立一个render target的节点指向它。这样,这个pass的渲染结果就会保存到这个render to texture中。这个pass的pixel shader只要使用前面模糊效果的shader就可以了。

接下来,将另外一个pass命名为render pass,并增加一个新的纹理对象。并把纹理对象指向刚才增加的render to texture,以便能在该pass中使用这个downsample过的图像。然后增加一个float类型的变量,用来表示上面公式中提到的k值;最终工作区的结构如下图:

接下来编辑render pass的pixel shader。代码如下:

下面是原图像和经过处理后图像的对比:

点击查看大图
原图


k = 1.1


k = 1.6

图:经过伪HDR+Blow处理过的图像和原图的对比

转载于:https://www.cnblogs.com/lancidie/archive/2012/01/19/2326840.html

Direct3D提高篇:HLSL编程实现PhotoShop滤镜效果 - 伪 HDR/Blow相关推荐

  1. Direct3D提高篇:HLSL编程实现PhotoShop滤镜效果(1)

    现在学习Direct3d/HLSL的人非常多,教程也非常多.因为硬件的水平在进步,所以可编程管道的处理能力也在不断的提高.从Direct3D 8开始,Direct3D中引入了可编程管道(Program ...

  2. Direct3D提高篇:HLSL编程实现PhotoShop滤镜效果 - 锐化模糊

    以上两个效果相对比较简单,姑且称之为入门效果, 它并没有用到太多数字图像处理或者信号处理方面的知识.接下来我们要介绍稍微复杂一点的效果,第一个就是图像的模糊和锐化. 图像的模糊又成为图像的平滑(smo ...

  3. [推荐]HLSL编程实现PhotoShop滤镜效果

    本文原创版权归 潘李亮所有,如有转载,请按如下方式于明显位置标明原创作者及出处,以示尊重!! ===================================================== ...

  4. HLSL编程实现PhotoShop滤镜效果

    文章为it168稿件.地址为 http://tech.it168.com/n/2007-03-29/200703291522292.shtml Direct3D提高篇之:HLSL编程实现PhotoSh ...

  5. ROS Learning-032 (提高篇-010 Launch)Launch 深入研究 --- (启动文件编程)ROS 的 XML语法简介...

    ROS 提高篇 之 Launch 深入研究 - 01 - 启动文件的编程 - ROS 的 XML语法简介 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubu ...

  6. 杨洋python课程提高篇_杨洋老师:全民一起玩Python 基础篇+提高篇,老师幽默严谨不枯燥的学习编程...

    课程介绍 本套课程出自杨洋老师的全民一起玩Python 基础篇+提高篇官网售价299元,程保持了杨洋博士老师幽默严谨不枯燥的学习编程,清晰全面的授课风格,配有丰富的教学演示和插图.动画,是初学者学习P ...

  7. 全民一起玩Python提高篇第十四课:函数式编程初步(上)

    函数与数字.字符串.列表等一样,本质上都是某种存放在内存中的数据类型,都可以用一个名字(变量名.函数名 -- )指向它 一个函数与一个数字.字符串等一样,都可以赋值给一个变量.比如,如果 f 是一个函 ...

  8. java编程提高篇_【Java入门提高篇】Day1 抽象类

    基础部分内容差不多讲解完了,今天开始进入Java提高篇部分,这部分内容会比之前的内容复杂很多,希望大家做好心理准备,看不懂的部分可以多看两遍,仍不理解的部分那一定是我讲的不够生动,记得留言提醒我. 好 ...

  9. Matlab编程实现图像滤镜效果(浮雕、怀旧色、连环画、羽化、素描、强光等)

    Matlab编程实现图像滤镜效果 实验的目的是按照PhotoShop中实现滤镜效果的步骤进行matlab程序编码,最后实现相应的滤镜效果.主要包含的滤镜效果有:浮雕效果.怀旧色风格.连环画效果.交叉冲 ...

最新文章

  1. [C++] stack和queue的常用函数
  2. mysql ndb 测试_.部署MYSQL集群 --测试
  3. redis同步效率秒_redis过期策略、内存淘汰策略、持久化方式、主从复制
  4. Java输入光标在printf前面_C++ 设置控制台(命令行)窗口 光标位置,及前背景颜色
  5. CentOS --kickstart服务器搭建(一)
  6. 《软件项目管理(第二版)》期末考试试题总结/复习资料
  7. Java Map接口详解
  8. 浅谈ARMv7-A协处理器CP15
  9. c++判断奇偶_第十一届(今年)蓝桥杯省模拟赛 试题+源码 C/C++详解
  10. 无限循环python代码_python - 代码遇到意外的无限循环? - SO中文参考 - www.soinside.com...
  11. 解决自己电脑VMware打开虚拟机黑屏问题
  12. NUC980开源项目9-官方Kernel编译
  13. 计算机系统基础学习报告(一)
  14. 二叉树之自底向上递归
  15. 商务与经济统计阅读笔记2
  16. java写安卓脚本,一文全懂
  17. html看汉字选拼音小游戏
  18. matlab2015的marker,matlab中markersize什么意思
  19. 国庆节,一天开发一个小程序+Web系统。2.5K到手。【分享开发经验】【收藏起来】
  20. java 数字补零_java数字位数不足在前后补0

热门文章

  1. 392. 判断子序列 golang 关于布尔类型返回值判断的思考
  2. C++中的lambda表达式和线程库
  3. 二叉树题目----6 二叉树的最近公共祖先 AND 二叉树搜索树转换成排序双向链表
  4. 【汇编语言】汇编实验IDE(集成开发环境):RadASM的安装和使用说明
  5. 【数字逻辑】第四章 组合逻辑电路:端口设计 端口拓展的方法
  6. java小程序查看器,成功拿到offer
  7. JMETER从JSON响应中提取数据
  8. 分库分表的几种常见形式以及可能遇到的难题
  9. Java 多线程 笔记 转自http://www.cnblogs.com/lwbqqyumidi/p/3804883.html
  10. ES6入门之Generator函数