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

所谓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值;最终工作区的结构如下图:

Direct3D提高篇:HLSL编程实现PhotoShop滤镜效果(1)(图二十九)

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

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

Direct3D提高篇:HLSL编程实现PhotoShop滤镜效果(1)(图三十一)

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

Direct3D提高篇:HLSL编程实现PhotoShop滤镜效果(1)(图三十二)

点击查看大图

原图

 

Direct3D提高篇:HLSL编程实现PhotoShop滤镜效果(1)(图三十三)
k = 1.1

Direct3D提高篇:HLSL编程实现PhotoShop滤镜效果(1)(图三十四)
k = 1.6

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/404498.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle Buffer Cache的keep、recycle、default pool概念图解

Oracle Buffer Cache的keep、recycle、default pool概念图解 转载于:https://blog.51cto.com/maclean/1278284

程序中调用命令行命令,不显示那个黑黑的DOS窗口

From: http://hi.baidu.com/yanqiuge/item/5da466c3d3f18453ad00ef1d 在程序中使用命令行时,会有黑黑的DOS窗口,很不爽,在网上查了一下,写一个有点实用价值的小程序: /****************************** 文件名&#…

Oracle Row cache lock图解

Oracle Row cache lock(dictionary cache)图解 转载于:https://blog.51cto.com/maclean/1278273

windows平台编译vlc

From: http://blog.csdn.net/guanshangming/article/details/5581270 转自:http://jeremiah.blog.51cto.com/539865/114190Jeremiah刚刚工作几个月,参与的第一个项目是与视频监控有关,分配给我的任务就是用开源的vlc做一个自己的播放器。对于开源项目来…

Appium--环境搭建

Appium介绍 Appium是一个移动端的自动化框架,可以做H5、Web测试、可以做功能测试(Android、IOS)、可以做跨进程测试,且是跨平台的。Appium做测试的时候支持的语言有很多种,包括java、Python、ruby、PHP、C#等。由于我熟…

Windows 系统下Git安装图解

From: http://blog.csdn.net/jiguanghoverli/article/details/7902791 Windows 系统下Git安装图解 简单来说Git是一个免费的、开源的版本控制软件,从功能上讲,跟我们比较熟悉的Subversion(SVN)这类版本控制软件没什么两样。由于工作的需求,需…

【fedora12】vlc-2.0.0编译

From: http://www.zhouwenyi.com/node/1348 1. 官网下载 VLC 源码 (vlc- 2.0.0.tar.xz) 下载地址为: http://download.videolan.org/pub/videolan/vlc/2.0.0/vlc-2.0.0.tar.xz 2. 解压VLC源码: xz -dvlc-2.0.0.tar.xz tar -xvfvlc-2.0.0.tar 3. cdvlc-2.0.0 …

Android实现3D旋转效果

下面的示例是在Android中实现图片3D旋转的效果。实现3D效果一般使用OpenGL,但在Android平台下可以不直接使用OpenGL,而是使用Camera实现,Camera中原理最终还是使用OpenGL,不过使用Camera比较方便。 Camera类似一个摄像机&#xff…

搭建hadoop开发环境--基于xp+cygwin

2019独角兽企业重金招聘Python工程师标准>>> 1.安装cygwin 参考博文:http://hi.baidu.com/%BD%AB%D6%AE%B7%E7_%BE%B2%D6%AE%D4%A8/blog/item/8832551c7598551f314e15c2.html Q1.实际安装中在第9步 “打开cygwin进行配置,首先输入&#xff…

random---伪随机数生成器

python3.5 作用:实现了多种类型的伪随机数生成器 random模块基于Mersenne Twister 算法提供了一个快速伪随机数生成器。原先开发这个生成器是为了向蒙特卡洛模拟生成输入,Mersenne Twister算法会生成有一个大周期的近均匀分布的数,以适用于各…

新浪微博iOS版SDK“宝玉XP”框架学习笔记

本文为论坛会员3h2om分享,对新浪微博iOS版SDK-“宝玉XP”框架进行研究所写的学习笔记,非常详细和精彩。 本人刚入学iOS开发,在学习的过程中,对新浪微博iOS版SDK-“宝玉XP”框架进行了学习(下载地址:https:/…

Lync Server 2010所需媒体网络流量带宽详解和计算

如果在组织内部部署Lync Server 2010,那么最大的优势就是解决了组织内部的即时通讯需求,为什么这么说?因为纵观现在微软所推行的商业智能应用平台,可以非常直观的了解到实际上整个微软商业平台就是由Lync Server、Exchange Server…

Linux互斥锁的使用代码实现

From: http://blog.csdn.net/leo115/article/details/8037869 [cpp] view plaincopy#include <stdio.h> #include <pthread.h> #include <sched.h> #include <unistd.h> //对临界区的保护问题 void *fun1(void *arg); void *fun2(void *ar…

USB Camera摄像头(UVC 与 gspca)

From: http://www.cnblogs.com/leaven/archive/2010/08/19/1802934.html http://weijb0606.blog.163.com/blog/static/131286274201063145356429/ 我的摄像头终于出现图像了&#xff01; 李迟按&#xff1a;本文章不是教程&#xff0c;不是心得总结&#xff0c;而是记录我在…

随机存取存储器(RAM)

RAM&#xff08;random access memory&#xff09;随机存储器。存储单元的内容可按需随意取出或存入&#xff0c;且存取的速度与存储单元的位置无关的存储器。这种存储器在断电时将丢失其存储内容&#xff0c;故主要用于存储短时间使用的程序。 按照存储信息的不同&#xff0c;…

创建弹出窗口的图片展示

本帖最后由 oisweb 于 2009-11-24 14:11 编辑图片有点大了 显示不是很好 自己看着办吧 1 创建工程 设置页面属性 <mx:Application xmlns:mx"http://www.adobe.com/2006/mxml" layout"vertical" horizontalAlign"center" verticalAlign&…

移植gdb到DM368 IPNC中 linux arm gdb

From: http://blog.csdn.net/ghostyu/article/details/8081897 移植gdb到嵌入式的ipnc中&#xff0c;大多数人习惯使用printf调试&#xff0c;但是遇到像”segment fault“这的错误也是后就很难定位&#xff0c;这时候gdb的作用就体现出来了 在pc使用gdb调试应用程序前&…

Silverlight实用窍门系列:56.Silverlight中的Binding使用(一)【附带实例源码】

本文将详细讲述Silverlight中Binding&#xff0c;包括Binding的属性和用法&#xff0c;Binding的数据流向。 Binding:一个完整的Binding过程是让源对象中的某个属性值通过一定流向规则进行转换和验证之后绑定到目标对象的某个属性上面。这个源对象由ElementName指定&#xff0c…

jqGrid + JSON + WebService 完整示例

真没找到这样的例子&#xff0c;于是自已写了个&#xff0c;分享出来。 第一步&#xff0c;首先在WebService上&#xff0c;添加[System.Web.Script.Services.ScriptService]属性标签&#xff0c;让WebServer支持JSON. namespace jqGrid_JSON_WebService_Sample.Services{/// &…

交叉编译和交叉调试环境搭建及使用

From: http://blog.chinaunix.net/uid-25119314-id-226230.html 1. 交叉编译器 1.1 交叉编译器介绍 在一种计算机环境中运行的编译程序&#xff0c;能编译出在另外一种环境下运行的代码&#xff0c;我们就称这种编译器支持交叉编译。这个编译过程就叫交叉编译。简单地说&…