Shader 学习笔记 ---Depth of Field 介绍
Render Monkey的sample里的DOF的稍微有点复杂,不过效果很漂亮。我觉得只要知道了原理并实现了基本的效果就可以了
o(∩_∩)o...
一共分为4个pass
前两个pass效果一样 在两个不同的位置渲染两个teapot到BackBuffer这张纹理,并保存下相对聚焦区域的深度值
- //渲染物体的VS代码
- struct VS_OUTPUT
- {
- float4 Pos : POSITION;
- float2 Tex : TEXCOORD0;
- float3 View : TEXCOORD1;
- float depth : TEXCOORD2;
- };
- VS_OUTPUT vs_main (
- float4 inPos : POSITION,
- float2 inTex : TEXCOORD0 )
- {
- VS_OUTPUT Out = (VS_OUTPUT) 0;
- float4 offsetPos = inPos;
- offsetPos.xyz += 10.0 * teapotPos; //沿Z轴偏移一段距离
- // Output transformed position:
- Out.Pos = mul( view_proj_matrix, offsetPos );
- // Compute position in view space:
- float3 Pview = mul( view_matrix, offsetPos );
- // Compute the view direction in view space:
- Out.View = - normalize( Pview );
- // Propagate texture coordinate for the object:
- Out.Tex = inTex;
- Out.depth = Pview.z; //算出深度值
- return Out;
- }
- //渲染物体的PS代码
- float d_near;
- float d_focus; //聚焦区域
- float d_far;
- sampler2D Texture0;
- float ComputeDepthBlur (float depth)
- {
- float f;
- f = (depth - d_focus)/d_focus;//算出当前像素点相对于d_focus的深度值
- f = clamp (f, -1.0, 1.0); //控制在-1到1之间
- return f * 0.5f + 0.5f; //控制在0到1之间
- }
- float4 ps_main( float2 Tex : TEXCOORD0,
- float depth : TEXCOORD2) : COLOR
- {
- float4 FinalColor = tex2D(Texture0, Tex);
- FinalColor.a = ComputeDepthBlur (depth); //在纹理中保存深度值
- return FinalColor;
- }
第三个pass 模糊一下BackBuffer,并渲染到Blur这张纹理
第四个pass 混合BackBuffer和Blur这两张纹理,根据BackBuffer保存下的深度值,来确定当前像素点的模糊程度
- //关键的PS代码
- sampler2D TBlur; //模糊的纹理
- sampler2D TBack; //正常的纹理 , 保存有深度值
- float4 ps_main(float2 texCoord: TEXCOORD0) : COLOR {
- float4 sharp = tex2D(TBack, texCoord);
- float4 blur = tex2D(TBlur, texCoord);
- // 根据深度值来决定混合的程度,即模糊的程度
- return lerp(sharp, blur, sharp.w );
- }
以下是效果图和四个PASS分别的效果
Shader 学习笔记 ---Depth of Field 介绍相关推荐
- HTML/CSS学习笔记01【概念介绍、基本标签】
w3cschool菜鸟教程.CHM(腾讯微云):https://share.weiyun.com/c1FaX6ZD HTML/CSS学习笔记01[概念介绍.基本标签.表单标签][day01] HTML ...
- C语言学习笔记---001C语言的介绍,编译过程原理,工具等
C语言学习笔记---001C语言的介绍,编译过程原理,工具等 创梦技术交流平台:资源下载,技术交流,网络赚钱: 交流qq群:1群:248318056 2群:251572072 技术交流平台:cre.i ...
- Unity Shader 学习笔记(33) 全局光照(GI)、反射探针、线性空间和伽马空间、高动态范围(HDR)
Unity Shader 学习笔记(33) 全局光照(GI).反射探针.线性空间和伽马空间.高动态范围(HDR) 参考书籍:<Unity Shader 入门精要> [<Real-Ti ...
- ESP32学习笔记(一) 芯片型号介绍
ESP32学习笔记(一) 芯片型号介绍 目录: ESP32学习笔记(一) 芯片型号介绍 ESP32学习笔记(二) 开发环境搭建 VSCode+platformio ESP32学习笔记(三) 硬件资源介 ...
- Unity Shader 学习笔记(3)URP渲染管线带阴影PBR-Shader模板(ASE优化版本)
此 Shader 已经不是最新版本,最新版本见本专栏的第四篇文章: Unity Shader 学习笔记(4) 材质面板截图: 功能实现(URP渲染管线下): PBR材质.投射和接收阴影. 代码展示: ...
- Unity Shader 学习笔记(27)渲染轮廓线(描边)方法、卡通风格渲染、素描风格渲染
Unity Shader 学习笔记(27)渲染轮廓线(描边)方法.卡通风格渲染.素描风格渲染 参考书籍:<Unity Shader 入门精要> 渲染轮廓线(描边) 五种方法: 基于观察角度 ...
- STM32 HAL库学习笔记2 HAL库介绍
STM32 HAL库学习笔记2 HAL库介绍 CMSIS标准 一.再次认识HAL库 HAL库设计思想 HAL库实现方式 以GPIO模块为例 GPIO外设数据类型 GPIO外设接口函数 二.使用HAL库 ...
- 阿里大神最佳总结Flutter进阶学习笔记,技术详细介绍
开头 很多人工作了十年,但只是用一年的工作经验做了十年而已. 高级工程师一直是市场所需要的,然而很多初级工程师在进阶高级工程师的过程中一直是一个瓶颈. 移动研发在最近两年可以说越来越趋于稳定,因为越来 ...
- Shader学习笔记(三)学习Shader所需的数学基础
感受高数 一.笛卡尔坐标系 1.二维笛卡尔坐标系 2.三维笛卡尔坐标系 二.点和矢量 1.矢量和标量的乘法/除法 2.矢量的加法和减法 3.矢量的模 4.单位矢量 5.矢量的点积 6.矢量的叉积(cr ...
最新文章
- 如何使用TensorCores优化卷积
- centos7编译安装mysql5.7_在Centos7源码包编译安装MySQL5.7
- OpenCV中的waitkey()详解
- linux下curl指令常见使用
- BeanUtils.copyProperties与PropertyUtils.copyProperties用法及区别
- 如何使用ABAP异步RFC调用提升应用性能
- 【ArcGIS风暴】何为动态投影?这次全面为您揭开ArcGIS中动态投影的神秘面纱!
- 华为服务器参数配置文件,最实用的华为配置基础手册.doc
- MarkdownPad 汉化破解(含下载地址)
- python 港股交易数据_GitHub - 116pythonZS/futuquant: 富途量化平台 API
- java学习(64):类访问私有内部内部类方法
- 台式电脑麦克风_还有人买台式PC吗?这份新品推荐攻略值得收藏
- 死锁必要条件、解决死锁策略
- 【吃豆游戏----HTML+JS+CSS等实现,效果+源代码】
- doe五步法_DOE系列--试验设计(DOE)五部曲
- swagger注释API :@ApiModel
- 特殊格式的时间读取并排序
- 生成两组相互独立服从标准正态分布的随机数(推导过程)
- 什么叫真正的IT男?
- python之json和dick数据类型