http://blog.csdn.net/xoyojank/article/details/1883520
 
什么是景深效果?
景深效果,简称DOF,在人眼跟光学摄像设备上很常见.如下图:

简单地来说,就是近处跟远处的景物模糊,而焦点附近的物体则很清晰.至于为什么会产生这样的效果,我就懒得说了:p
 
那么怎么来实现这种效果呢?
看图:

从摄像机开始,按距离分成三部分:
近距离模糊,焦点范围(清晰),远距离模糊
渲染的时候按深度(即距离)进行判断,在焦点范围内则是清晰的,否则就进行模糊处理.
整个过程分三个Pass:
1.       将场景渲染到一个RenderTarget,做为清晰版.
2.       将上一步得到的RenderTarget进行模糊处理,得到BluredRT(模糊版).
3.       合成.跟据距离来判断是否应该模糊,如果不在焦点范围内则绘制BluredRT,否则就绘制RenderTarget.
 
那么,还有一个问题,深度值怎么计算呢?
公式: WDepth = Depth / Far_Z_Clip.
在这里我是把深度值存在Alpha通道中一块渲染到RenderTarget,这样在最后一步直接取color.a就可以进行深度判断了

(右图为Alpha通道,存储了深度值)
 
Shader与最终效果
sampler RenderTarget;
sampler BluredRT;
 
//焦点范围
float fNearDis;
float fFarDis;
 
float4 ps_main( float2 TexCoord : TEXCOORD0 ) : COLOR0
{  
   float4 color = tex2D( RenderTarget, TexCoord );
   if( color.a > fNearDis && color.a < fFarDis )
      return color;
   else
      return tex2D( BluredRT, TexCoord );
}
 

是不是看起来很不自然?
为什么呢?因为这样实现的DOF在清晰与模糊的交界处过渡太生硬了,所以就像分成了三部分一样-_-!
那我们增加两个过渡不就成了?
就像这样:

sampler RenderTarget;
sampler BluredRT;
 
//焦点范围
float fNearDis;
float fFarDis;
float fNearRange;
float fFarRange;
 
float4 ps_main( float2 TexCoord : TEXCOORD0 ) : COLOR0
{  
   float4 sharp = tex2D( RenderTarget, TexCoord );
   float4 blur = tex2D( BluredRT, TexCoord );
  
   float percent = max(saturate(1 - (sharp.a-fNearDis)/fNearRange),
                    saturate((sharp.a-(fFarDis-fFarRange))/fFarRange));
  
   return lerp( sharp, blur, percent );
}
 

[ZZ] 景深效果(Depth of Field) , Pass1 将场景渲染到一个RenderTarget,做为清晰版, Pass2: BluredRT , Pass3: WDepth = Depth / Far_Z_Clip的更多相关文章

  1. 基于光线追踪的渲染中景深(Depth of field)效果的实现

    图形学离线渲染中常用的透视摄像机模型时根据小孔成像的原理建立的,其实现通常是从向成像平面上发射ray,并把trace这条ray的结果作为成像平面上对应交点的采样结果.即: 图片来自<Fundam ...

  2. 景深(Depth of Field)

    http://www.cnblogs.com/cxrs/archive/2013/03/22/DepthOfFeild.html 景深(Depth of Field) 什么是景深? 所谓景深,就是当焦 ...

  3. Unity3D图像后处理特效——Depth of Field 3.4

    Depth of Field 3.4 is a common postprocessing effect that simulates the properties of a camera lens. ...

  4. Unity Shader 景深效果

    效果 原理: 开启摄像机的深度模式,将深度保存到一张名为_CameraDepthTexture(Unity5.0之后才有)内置的纹理中. 如果深度在焦点范围内就用原图,否则就用模糊图. Shader: ...

  5. yebis error ---depth of field

    前几天在墙外无法登陆cnblogs...导致很多blogs就没写了 有几篇比较值得记下来的,但是我已经不记得了,应该和sao有关scalable ambient obscurance 我似乎回忆起一点 ...

  6. Depth of field --Circle of confusion 推导

    https://en.wikipedia.org/wiki/Circle_of_confusion https://developer.download.nvidia.com/books/HTML/g ...

  7. 最近比较迷flash professional cc 做PPT,做一个flash做动态打字效果的教程

    想做一个flash打字效果.网上的方法要不是太繁琐,要不然就是各种遗漏.在这边做一个行之有效的flash做打字效果教程. 首先我用的是最新版本的flash professional cc .但是应该和 ...

  8. 一个JS效果竟然要研究一天,我是不是不适合做前端?

    前言 今天这篇文章的标题,显然是要搞事情.一个JS交互效果,居然花费了一天的宝贵时间才研究出来,我是不是不太适合做前端? 别急,搬好小板凳,正文从这开始- 本来今天下班回来感觉有点累,想着今天就别学了 ...

  9. kaggle 欺诈信用卡预测——不平衡训练样本的处理方法 综合结论就是:随机森林+过采样(直接复制或者smote后,黑白比例1:3 or 1:1)效果比较好!记得在smote前一定要先做标准化!!!其实随机森林对特征是否标准化无感,但是svm和LR就非常非常关键了

    先看数据: 特征如下: Time Number of seconds elapsed between each transaction (over two days) numeric V1 No de ...

随机推荐

  1. 基数排序(radix sort)

    #include<iostream> #include<ctime> #include <stdio.h> #include<cstring> #inc ...

  2. 全排列(next_permutation)

    next_permutation函数既可用于非重排列也可用于重排列: #include <bits/stdc++.h> #define MAXN 200000+10 #define ll ...

  3. ubuntu下简单的驱动编译

    转自:http://www.eefocus.com/jefby1990/blog/13-02/291628_c39b8.html 本文是参考了网上多篇帖子而写的算不上什么原创.唯一值得欣慰的只不过在本 ...

  4. PHP使用七牛云存储之图片的上传、下载、303重定向教程,CI框架实例

    网上关于七牛云存储的教程除了官网上的API文档,其他的资料太少了.研究了下API之后,现在已经能实现图片的上传和下载及上传之后的重定向. http://blog.csdn.net/cqcre/arti ...

  5. hdu 4004 二分 2011大连赛区网络赛D

    题意:一个长为L的河,中间有n个石子,小青蛙需要跳少于m次过河,判断小青蛙每次跳跃最大距离的最小值 最大值最小,用二分 Sample Input 6 1 2 2 25 3 3 11 2 18 Samp ...

  6. vijos p1002 dp ***

    链接:点我 一开始的方程式很好写的,但是数据太大,考虑到石子数目很小,我们对其进行离散化,若相邻两点距离超过ya的值,则后面所有点都往前移动,这里ya的值是可以调整的 #include <ios ...

  7. H264码流打包分析

    转自:http://www.360doc.com/content/13/0124/08/9008018_262076786.shtml   SODB 数据比特串-->最原始的编码数据 RBSP ...

  8. Android调用WebService(转)

    Android调用WebService WebService是一种基于SOAP协议的远程调用标准,通过 webservice可以将不同操作系统平台.不同语言.不同技术整合到一块.在Android SD ...

  9. hdu 1150 Machine Schedule 最少点覆盖转化为最大匹配

    Machine Schedule Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php? ...

  10. MATLAB信号与系统分析(三)——连续信号与系统的复频域分析及MATLAB实现

    一.系统的拉普拉斯变换和反变换 1.MATLAB函数 F=laplace(f) %求拉氏变换 f=ilaplace(F) %求拉氏反变换 2.例子 clear all;clc;close all f= ...