下面和大家介绍的是一个学习shader着色器的系列,想使用好shader的开发人员可以学习下。下面介绍第三篇关于DOF(景深)。

DOF(景深)最简单的现象就是当你用眼睛聚焦到前景的地方,后面就会变模糊, 当用眼睛聚焦到远景的地方,前就会变模糊,相机也会有同样的情况,通过调节光圈和焦距就很容易出现景深的效果。如果要说景深形成的原理的话,可以用小孔成像来说一天,但是在图形学里面,要做的就一件事 Faking it!镜头前的东西被模糊,远离镜头的东西比较清晰

Box filter 过于简单,高斯模糊需要两个pass,这里用一个稍微复杂的filter,一次pass就搞定,滤波器是这样的

具体的pixel shader里面是这样的

floatfInverseViewportWidth;

floatfInverseViewportHeight;

sampler Texture0;

constfloat4 samples[9] =

{

-1.0, -1.0, 0, 1.0/16.0,

-1.0, 1.0, 0, 1.0/16.0,

1.0, -1.0, 0, 1.0/16.0,

1.0, 1.0, 0, 1.0/16.0,

-1.0, 0.0, 0, 2.0/16.0,

1.0, 0.0, 0, 2.0/16.0,

0.0, -1.0, 0, 2.0/16.0,

0.0, 1.0, 0, 2.0/16.0,

0.0, 0.0, 0, 4.0/16.0

};

float4 ps_main(float2 texCoord: TEXCOORD0) : COLOR

{

float4 col = float4(0,0,0,0);

// Sample and output the averaged colors

for(inti=0;i<9;i )

col  = samples[i].w*tex2D(Texture0,texCoord

float2(samples[i].x*fInverseViewportWidth,

samples[i].y*fInverseViewportHeight));

returncol;

}

基于Depth Impostor的DOF基本的原理就是首先渲染一个模糊的RT,这个模糊的RT可能会用到很多种pass,比如之前的高斯模糊,还有上面所说的filter,进行多次叠加。然后根据之前rt里的alpha通道的值进行blend。在RenderMonkey中具体的做法首先添加一个下面几个变量

相机的几个参数

在绘制模型的时候,要把对应的深度存储到alpha中

VS

float4x4 view_proj_matrix;

floatfar_clip;

structVS_OUTPUT

{

float4 Pos:     POSITION;

float2 Txr1:    TEXCOORD0;

float1 Depth:   TEXCOORD1;

};

VS_OUTPUT vs_main(

float4 inPos: POSITION,

float2 Txr1: TEXCOORD0

)

{

VS_OUTPUT Out;

float4 OutPos;

float4 offset;

offset.x = 200;

offset.y = 0;

offset.z = 0;

offset.w = 0;

// Compute the position of the vertex

Out.Pos = OutPos = mul(view_proj_matrix, inPos   offset);

Out.Txr1 = Txr1;

// Send the depth to the pixel shader for encoding

Out.Depth = OutPos.w/far_clip;

returnOut;

}pixel shader

floatNear_Range;

floatFar_Range;

floatNear_Dist;

floatFar_Dist;

sampler Texture0;

float4 ps_main(

float4 inDiffuse: COLOR0,

float2 inTxr1: TEXCOORD0,

float1 Depth: TEXCOORD1

) : COLOR0

{

// Compute blur factor based on   near and far focus planes

floatBlur = max(clamp(0,1, 1 - (Depth-Near_Dist)/Near_Range),

clamp(0,1, (Depth-(Far_Dist-Far_Range))/Far_Range));

//  Output constant color:

returnfloat4(tex2D(Texture0,inTxr1).rgb,Blur);

}注意,Shader中所有的运算都是行主序!注意,Shader中所有的运算都是行主序!注意,Shader中所有的运算都是行主序!

具体来看下这个运算流程,

在VS中

Out.Pos = OutPos = mul(view_proj_matrix, inPos   offset);经过这一步的计算,Out.Pos的w取值范围就是(0, far_clip)

Out.Depth = OutPos.w/far_clip;

这一步将深度映射到0到1.

再看ps

floatBlur = max(clamp(0,1, 1 - (Depth-Near_Dist)/Near_Range), clamp(0,1,(Depth-(Far_Dist-Far_Range))/Far_Range));

这里是计算Blur值,也是后面进行blend的参数。Blend的取值范围如下

在nearRange之前和FarDist之后,取值都是1,中间部分是0,其余的部分是在0到1之前线性变化。根据NearRange,NearDis,FarRange,FarDist这几个值,就可以获得不同的景深效果。

模糊的rt处理这里就不说了,最好叠加个两三次。

最后在present的时候,只需要根据alpha值进行两张rt的Blend就可以了

看一下深度的Texture

取Blur值

returnfloat4(tex2D(Texture0,inTxr1).rgb,tex1D(Texture1,Depth).a);这样就省去了每次都去计算一遍算式的成本,特别是当blur的计算特别复杂的时候。

dof景深matlab,Shader学习(三):DOF(景深)相关推荐

  1. Unity Shader学习三:坐标空间的变换

    (注意,由于格式问题,文中如p-c.c-p.c.p这类的为矢量的下标,-1.T为矩阵的上标) 假设现在有一个父坐标空间以及一个子坐标空间,已知父级坐标空间中子级坐标空间的原点位置以及3个单位坐标轴,此 ...

  2. Shader学习笔记(三)学习Shader所需的数学基础

    感受高数 一.笛卡尔坐标系 1.二维笛卡尔坐标系 2.三维笛卡尔坐标系 二.点和矢量 1.矢量和标量的乘法/除法 2.矢量的加法和减法 3.矢量的模 4.单位矢量 5.矢量的点积 6.矢量的叉积(cr ...

  3. matlab强化学习DDPG算法改编/菜鸟理解2——航天器三轴姿态稳定器学习算例

    目录 写在前面 matlab强化学习库简介 航天器三轴姿态稳定器介绍 算法流程 代码/simulink 结果展示与分析 一些心得 写在最后 写在前面 %写在前面: 本人大四狗一名,不是计算机专业,所以 ...

  4. 深度学习三十年创新路

    深度学习三十年创新路 编者注:深度学习火了,从任何意义上,大家谈论它的热衷程度,都超乎想象.但是,似乎很少有人提出不同的声音,说深度学习的火热,有可能是过度的繁荣,乃至不理性的盲从.而这次,有不同的想 ...

  5. Unity Shader 学习记录(3) —— CG语言和Shader文件

    1 什么是语义 赋给shader的输入输出的字符串,表达了参数的含义.语义告诉shader从哪里获取数据,又把数据输出到哪里. 2 Shader的三种debug方法 1 假色彩图像 2 VStudio ...

  6. 深度学习三巨头之Yann LeCun(杨立昆)简介

    在人工智能研究领域,Yann LeCun.Geoffrey Hinton 和 Yoshua Bengio一直被公认为深度学习三巨头. Yann LeCun,自称中文名"杨立昆",计 ...

  7. MATLAB强化学习-appdesigner使用

    MATLAB强化学习-appdesigner使用 好像是MATLAB2017a之后都可以使用appdesigner,来代替老的MATLAB的guide. 首先在命令窗口输入:appdesigner打开 ...

  8. MATLAB深度学习(1) --- 想要做好深度学习?数据集是第一步

    MATLAB深度学习(1) --- 想要做好深度学习?数据集是第一步 创作目的 项目简介 本期重点---数据集构建 本文所使用数据集简介 用table来搭建训练集 总结 创作目的 大家好,这里是微信公 ...

  9. Matlab绘图(三)散点图—四维数据、五维数据、六维数据、七维数据散点图可视化绘制

    Matlab绘图(三)散点图-四维数据.五维数据.六维数据.七维数据可视化分析 一.前言 二.散点图特征分析 (1)原理分析: (2)方案分析: 四维数据进行可视化方案 五维数据进行可视化方案 六维数 ...

  10. (转)Matlab深度学习工具试玩手册一:基本操作与迁移学习

    原贴博客:https://blog.csdn.net/zfrycw/article/details/80633979 目录 前言 一.利用现成网络进行分类 二.构建简单的分类网络 三.迁移学习 前言 ...

最新文章

  1. Eclipse插件安装
  2. 此博客作废,请访问http://www.cnblogs.com/default
  3. skia库的3D变换研究
  4. BugKuCTF WEB 输入密码查看flag
  5. 织梦数据库改mysql前缀_织梦快速批量修改MYSQL数据库表前缀与表名实例操作
  6. java 解析时间字符串_Java8解析给定字符串的日期或日期时间格式
  7. 「Luogu」[JSOI2007]字符加密 解题报告
  8. android打开文件管理获取文件名,如何从android中的文件路径获取文件名
  9. 计算机培训营,计算机学院举办科创训练营第三期培训
  10. Kompose: Docker-compose 到 Kubernetes 的迁移工具
  11. idea 新建的java项目没发run_IntelliJ IDEA 如何创建一个普通的java项目,及创建java文件并运行...
  12. docker wordpress Error establishing a database connection 方法之一
  13. java面试题系列10
  14. 基于MATLABCPLEX 的机组最优组合,成功求解表格化,图示化的机组组合结果(学习参考)
  15. Kitty-Cloud服务搭建过程剖析
  16. crm自动编号(第二天再次001从开始)
  17. eclipse快捷键(Mac版)整理
  18. JetBrains开发者日见闻(一)之Kotlin/Native 尝鲜篇
  19. PHP:for循环输出表情阵列
  20. 旧手机利用 第二弹 ——网络摄像头

热门文章

  1. python 身高预测
  2. Django 对指定数据进行批量替换和删除
  3. errors and 0 warnings potentially fixable with the `--fix` option
  4. 小智机器人型号_小智类人型机器人
  5. 808通讯协议技术规范消息ID:0x0704数据分析,后附go代码
  6. 《鹰猎长空》讲述戏曲与电影的渊源
  7. php theexcerpt,the_excerpt()函数
  8. win7系统调整屏幕刷新率方法
  9. 数据中心安全域的设计和划分
  10. 初学Mean Shift 聚类算法