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,一经查实,立即删除!

相关文章

[react] react中什么是非控组件?

[react] react中什么是非控组件? 表单元素的value/checked值、onChange事件没有和组件的state存在绑定关联关系,如果需要获取表单元素的值,需要使用ref获取DOM,然后得到元素的值.demo如下: import React from react;…

[spring-framework]Spring定时器的配置和使用

开发中我们常常会做一些定时任务&#xff0c;这些任务有开始时间&#xff0c;并会按一定的周期或规则执行。如此我们在Java程序开发中使用定时器来处理定时任务。 <!-- MessageRequestTask类中包含了msgRequest方法&#xff0c;用于执行定时任务 --> <bean id"ms…

安装Microsoft Windows SDK 7.1时出现的错误(附解决办法)

From: http://blog.sina.com.cn/s/blog_617c05b001015baw.html 错误回放一: A problem occurred while installing selected Windows SDKcomponents. Installation of the "Microsoft Windows SDK for Windows 7Compilers for x86" product has reported the follow…

上载数据

*&---------------------------------------------------------------------**& 包括 ZHENGZJ_TEST001_FORM*&---------------------------------------------------------------------**&--------------------------------------------------…

[react] react中的setState执行机制是什么呢?

[react] react中的setState执行机制是什么呢&#xff1f; 1.将setState传入的partialState参数存储在当前组件实例的state暂存队列中。 2.判断当前React是否处于批量更新状态&#xff0c;如果是&#xff0c;将当前组件加入待更新的组件队列中。 3.如果未处于批量更新状态&…

Linux 的帐号与群组:有效与初始群组、groups, newgrp

关于群组&#xff1a; 有效与初始群组、groups, newgrp认识了帐号相关的两个档案 /etc/passwd 与 /etc/shadow 之后&#xff0c;您或许还是会觉得奇怪&#xff0c; 那么群组的设定档在哪里&#xff1f;还有&#xff0c;在 /etc/passwd 的第四栏不是所谓的 GID 吗&#xff1f;那…

提示缺少Qedit.h问题

From&#xff1a; http://blog.csdn.net/jsmiler/article/details/6495763 DirectX 9.0 SDK 开发包以及扩展包下载(February 2005) http://dev.csdn.net/article/62/62941.shtm。直接到微软官网下的话&#xff0c;需要validation确认。 http://download.microsoft.com/downlo…

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

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

[react] 同时引用这三个库react.js、react-dom.js和babel.js它们都有什么作用?

[react] 同时引用这三个库react.js、react-dom.js和babel.js它们都有什么作用&#xff1f; React.js: React中的组件(Component)、Context、hooks等核心Api&#xff0c;还有虚拟DOM的比较、Fiber的算法实现等React-dom.js 与web浏览器DOM相关的API&#xff0c;比如虚拟DOM的挂…

计算程序执行时间

time命令用于计量运行时间。real从启动到终止&#xff0c;user用户空间时间&#xff0c;sys内核空间时间。转载于:https://www.cnblogs.com/embedded-linux/p/5046726.html

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

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

Oracle Row cache lock图解

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

[react] create-react-app创建新运用怎么解决卡的问题?

[react] create-react-app创建新运用怎么解决卡的问题&#xff1f; (这个问题应该描述的是使用cra脚手架创建项目慢的问题) 这是因为cra默认使用的国外的npm源&#xff0c;替换为国内的npm源即&#xff0c;如淘宝源npm config set registry https://registry.npm.taobao.org 个…

C语言基础知识汇总

c语言执行步骤&#xff1a; 一.编辑程序 1.编写c语言的代码&#xff0c;保存在扩展名.c的文件中&#xff0c;源文件。 2.编写代码有三种方式&#xff1a; a.vi命令方式系统自带 b.ultraedit网络下载 c.xcode网络下载 二.编译(gcc 文件名.c) 将c语言转换成计算机识别的代码 三.…

PHP中的逆波兰式应用

定义  逆波兰式&#xff08;Reverse Polish notation&#xff0c;RPN&#xff0c;或逆波兰记法&#xff09;&#xff0c;也叫后缀表达式(将运算符写在操作数之后) 如&#xff1a;我们平时写ab&#xff0c;这是中缀表达式&#xff0c;写成后缀表达式就是&#xff1a;ab (ab)*c…

执行dos命令,不出现黑色的dos窗口

先准备一个.vbs文件&#xff0c;写好内容&#xff1a; Set ws CreateObject("Wscript.Shell") ws.run "cmd /c a.bat", vbhide再准备相应的.bat文件&#xff1a; dir /s /b * > a.logok, 运行.vbs文件吧

[react] 展示组件和容器组件有什么区别?

[react] 展示组件和容器组件有什么区别&#xff1f; 展示组件&#xff08;Presentational Component&#xff09; 关注页面的展示效果&#xff08;外观&#xff09; 内部可以包含展示组件和容器组件&#xff0c;通常会包含一些自己的DOM标记和样式(style) 通常允许通过this.pr…

Java学习----方法的重载

一个类中有多个同名的参数不一样的方法。 作用&#xff1a;可以根据不同的条件调用不同的方法。 注意&#xff1a;java不会因为方法的返回类型或者权限的不同而判断为不同的两个方法。 public class Student {public Student() {System.out.println("Student构造方法1&quo…

[react] react的书写规范有哪些

[react] react的书写规范有哪些 React元素必须使用大驼峰命名的方式组件尽量命名&#xff0c;方便进行调试JSX尽量用小括号包起来&#xff0c;更加直观&#xff0c;防止换行时出错 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持…

LAMP源代码编译整理

在我们编译安装Apache 之前&#xff0c;要考虑的是让Apache 在什么样的模式下运行&#xff0c;因为从Apache 2.0 就加入了MPM&#xff08;Multi-Processing Modules&#xff0c;多道处理模块&#xff09;。Apache 2.0 在性能上的改善最吸引人。在支持POSIX 线程的Unix 系统上&a…