老早就想实现 Depth of field 的效果了,这几天终于有点时间来好好学习并加以实现。使用的是Render Monkey 1.71,
    Render Monkey的sample里的DOF的稍微有点复杂,不过效果很漂亮。我觉得只要知道了原理并实现了基本的效果就可以了
o(∩_∩)o...
    一共分为4个pass 

   前两个pass效果一样 在两个不同的位置渲染两个teapot到BackBuffer这张纹理,并保存下相对聚焦区域的深度值

  1. //渲染物体的VS代码
  2. struct VS_OUTPUT
  3. {
  4. float4 Pos    : POSITION;
  5. float2 Tex    : TEXCOORD0;
  6. float3 View   : TEXCOORD1;
  7. float  depth  : TEXCOORD2;
  8. };
  9. VS_OUTPUT vs_main (
  10. float4 inPos  : POSITION,
  11. float2 inTex  : TEXCOORD0 )
  12. {
  13. VS_OUTPUT Out = (VS_OUTPUT) 0;
  14. float4 offsetPos = inPos;
  15. offsetPos.xyz += 10.0 * teapotPos;  //沿Z轴偏移一段距离
  16. // Output transformed position:
  17. Out.Pos = mul( view_proj_matrix, offsetPos );
  18. // Compute position in view space:
  19. float3 Pview = mul( view_matrix, offsetPos );
  20. // Compute the view direction in view space:
  21. Out.View = - normalize( Pview );
  22. // Propagate texture coordinate for the object:
  23. Out.Tex = inTex;
  24. Out.depth = Pview.z;  //算出深度值
  25. return Out;
  26. }
  1. //渲染物体的PS代码
  2. float d_near;
  3. float d_focus;  //聚焦区域
  4. float d_far;
  5. sampler2D Texture0;
  6. float ComputeDepthBlur (float depth)
  7. {
  8. float f;
  9. f = (depth - d_focus)/d_focus;//算出当前像素点相对于d_focus的深度值
  10. f = clamp (f, -1.0, 1.0);  //控制在-1到1之间
  11. return f * 0.5f + 0.5f;   //控制在0到1之间
  12. }
  13. float4 ps_main(  float2 Tex    : TEXCOORD0,
  14. float  depth  : TEXCOORD2) : COLOR
  15. {
  16. float4 FinalColor = tex2D(Texture0, Tex);
  17. FinalColor.a = ComputeDepthBlur (depth);  //在纹理中保存深度值
  18. return FinalColor;
  19. }

第三个pass 模糊一下BackBuffer,并渲染到Blur这张纹理

第四个pass 混合BackBuffer和Blur这两张纹理,根据BackBuffer保存下的深度值,来确定当前像素点的模糊程度

  1. //关键的PS代码
  2. sampler2D TBlur;  //模糊的纹理
  3. sampler2D TBack;  //正常的纹理 , 保存有深度值
  4. float4 ps_main(float2 texCoord: TEXCOORD0) : COLOR {
  5. float4 sharp = tex2D(TBack,   texCoord);
  6. float4 blur  = tex2D(TBlur, texCoord);
  7. // 根据深度值来决定混合的程度,即模糊的程度
  8. return lerp(sharp, blur, sharp.w );
  9. }

以下是效果图和四个PASS分别的效果

Shader 学习笔记 ---Depth of Field 介绍相关推荐

  1. HTML/CSS学习笔记01【概念介绍、基本标签】

    w3cschool菜鸟教程.CHM(腾讯微云):https://share.weiyun.com/c1FaX6ZD HTML/CSS学习笔记01[概念介绍.基本标签.表单标签][day01] HTML ...

  2. C语言学习笔记---001C语言的介绍,编译过程原理,工具等

    C语言学习笔记---001C语言的介绍,编译过程原理,工具等 创梦技术交流平台:资源下载,技术交流,网络赚钱: 交流qq群:1群:248318056 2群:251572072 技术交流平台:cre.i ...

  3. Unity Shader 学习笔记(33) 全局光照(GI)、反射探针、线性空间和伽马空间、高动态范围(HDR)

    Unity Shader 学习笔记(33) 全局光照(GI).反射探针.线性空间和伽马空间.高动态范围(HDR) 参考书籍:<Unity Shader 入门精要> [<Real-Ti ...

  4. ESP32学习笔记(一) 芯片型号介绍

    ESP32学习笔记(一) 芯片型号介绍 目录: ESP32学习笔记(一) 芯片型号介绍 ESP32学习笔记(二) 开发环境搭建 VSCode+platformio ESP32学习笔记(三) 硬件资源介 ...

  5. Unity Shader 学习笔记(3)URP渲染管线带阴影PBR-Shader模板(ASE优化版本)

    此 Shader 已经不是最新版本,最新版本见本专栏的第四篇文章: Unity Shader 学习笔记(4) 材质面板截图: 功能实现(URP渲染管线下): PBR材质.投射和接收阴影. 代码展示: ...

  6. Unity Shader 学习笔记(27)渲染轮廓线(描边)方法、卡通风格渲染、素描风格渲染

    Unity Shader 学习笔记(27)渲染轮廓线(描边)方法.卡通风格渲染.素描风格渲染 参考书籍:<Unity Shader 入门精要> 渲染轮廓线(描边) 五种方法: 基于观察角度 ...

  7. STM32 HAL库学习笔记2 HAL库介绍

    STM32 HAL库学习笔记2 HAL库介绍 CMSIS标准 一.再次认识HAL库 HAL库设计思想 HAL库实现方式 以GPIO模块为例 GPIO外设数据类型 GPIO外设接口函数 二.使用HAL库 ...

  8. 阿里大神最佳总结Flutter进阶学习笔记,技术详细介绍

    开头 很多人工作了十年,但只是用一年的工作经验做了十年而已. 高级工程师一直是市场所需要的,然而很多初级工程师在进阶高级工程师的过程中一直是一个瓶颈. 移动研发在最近两年可以说越来越趋于稳定,因为越来 ...

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

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

最新文章

  1. 如何使用TensorCores优化卷积
  2. centos7编译安装mysql5.7_在Centos7源码包编译安装MySQL5.7
  3. OpenCV中的waitkey()详解
  4. linux下curl指令常见使用
  5. BeanUtils.copyProperties与PropertyUtils.copyProperties用法及区别
  6. 如何使用ABAP异步RFC调用提升应用性能
  7. 【ArcGIS风暴】何为动态投影?这次全面为您揭开ArcGIS中动态投影的神秘面纱!
  8. 华为服务器参数配置文件,最实用的华为配置基础手册.doc
  9. MarkdownPad 汉化破解(含下载地址)
  10. python 港股交易数据_GitHub - 116pythonZS/futuquant: 富途量化平台 API
  11. java学习(64):类访问私有内部内部类方法
  12. 台式电脑麦克风_还有人买台式PC吗?这份新品推荐攻略值得收藏
  13. 死锁必要条件、解决死锁策略
  14. 【吃豆游戏----HTML+JS+CSS等实现,效果+源代码】
  15. doe五步法_DOE系列--试验设计(DOE)五部曲
  16. swagger注释API :@ApiModel
  17. 特殊格式的时间读取并排序
  18. 生成两组相互独立服从标准正态分布的随机数(推导过程)
  19. 什么叫真正的IT男?
  20. python之json和dick数据类型

热门文章

  1. vuejs模仿实现一个电影分享类网站
  2. 有趣、高效的编程示例
  3. Python sys 使用说明
  4. QT 按钮(4种样式)
  5. 基于CRNN的文本字符交易验证码识别--Paddle实战
  6. 为何需要实施数据治理
  7. 如何提升数据安全治理能力
  8. 大数据分析的特点有哪些
  9. 计算机组成原理2010年,2010年计算机组成原理考研试题及解答
  10. 数据自动机之如何使用CYaRon造数据