物体相交

  • 物体相交
    • 思路
    • 实现
    • 效果

物体相交

利用深度图来做效果,不提供数学原理,只提供Shader脚本实现。

思路

已知需要渲染物体的深度信息,通过与_CameraDepthTexture纹理中的深度值进行一些计算或者判定即可完成相交的效果。

计算方式:在视图(View)坐标系下,假设物体深度值为eyeZeyeZeyeZ,深度缓存中的深度值为sceneZsceneZsceneZ,相交宽度为IntersectionWidthIntersectionWidthIntersectionWidth;通过abs(eyeZ−sceneZ)/InstersectionWidthabs(eyeZ - sceneZ)/InstersectionWidthabs(eyeZ−sceneZ)/InstersectionWidth可以得到[0,n][0, n][0,n]的一个值,将[0,n][0, n][0,n]截断到[0,1][0, 1][0,1],最后使用lerp函数实现一个过渡。

_CameraDepthTexture纹理记录的是NDC空间下的深度信息,因此需要转到视图(View)空间下。

实现

Shader "Hidden/IntersectionHighlight"
{Properties{_IntersectionColor("Intersection Color", Color) = (1,1,0,0)_IntersectionWidth("Intersection Width", Range(0, 2)) = 0.1}SubShader{Pass{// 关闭深度写入, 否则渲染会出现问题ZWrite Off// 关闭背面剔除, 渲染双面Cull Off// 开blend, 在片段后会进行blend混合Blend SrcAlpha OneTags {"RenderType" = "Opaque"}CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;};struct v2f{float4 vertex : SV_POSITION;float2 uv : TEXCOORD0;float4 screenPos : TEXCOORD1;float eyeZ : TEXCOORD2;};// 深度缓存图sampler2D _CameraDepthTexture;// 相交颜色fixed4 _IntersectionColor;// 相交宽度float _IntersectionWidth;v2f vert (appdata v){v2f o;// o.vertex为裁剪空间中的点o.vertex = UnityObjectToClipPos(v.vertex);// 返回齐次坐标系下的点, 范围是[0, w]; 其中,w不是viewport的width (ps: 需要与tex2Dproj函数配套使用)o.screenPos = ComputeScreenPos(o.vertex);// 将v.vertex与model和view矩阵相乘, 得到相机到物体的z坐标, 为view坐标系下COMPUTE_EYEDEPTH(o.eyeZ);return o;}fixed4 frag(v2f i) : SV_Target{// UNITY_PROJ_COORD(a)应该是预留的一个接口, 官方解释为大部分平台将返回入参值// SAMPLE_DEPTH_TEXTURE_PROJ(tex, uv)内部调用tex2Dproj(tex, uv), tex2Dproj会将(uv = uv / w)// LinearEyeDepth(depth)将返回depth在view坐标系下的表示, 源码中的_ZBufferParams是相机中far和near两个参数表达式的结果值float screenZ = LinearEyeDepth(SAMPLE_DEPTH_TEXTURE_PROJ(_CameraDepthTexture, UNITY_PROJ_COORD(i.screenPos)));// 相交计算, abs(物体的深度值 - 深度缓存的深度值) / 长度 => [0, n]的范围 => saturate限制到[0, 1]float diff = saturate(abs(i.eyeZ - screenZ) / (_IntersectionWidth / 2));// (0.0 -> 1.0) => (最亮 -> 最暗), diff => colorreturn lerp(_IntersectionColor, float4(0.0, 0.0, 0.0, 0.0), diff);}ENDCG}}
}

效果

Unity3D ShaderLab 物体相交相关推荐

  1. Unity3D ShaderLab 内发光防护罩

    内发光防护罩 内发光防护罩 思路 内轮廓发光效果 相交效果 缺陷 内轮廓发光缺陷 缺陷解决方案 相交效果缺陷 缺陷解决方案 实现 效果 内发光防护罩 1.利用模型法线和视角方向得到内轮廓发光效果. 2 ...

  2. 【物理篇】从零搭建2D物理系统③——物体相交测试(完结)

    如何进行相交测试 在第一期文章中,我们最后留下来一个问题:如何判断一条射线和哪些物体相交? 这个问题分为两步来解决: 使用空间场景划分找到可能相交的物体(粗测阶段).(找到1,2,3这三个物体) 对上 ...

  3. 【Fracturing amp; Destruction】Unity3D的物体爆裂、炸裂、碎裂效果

    如果要想做到如下图的爆裂.炸裂.碎裂效果特效: 自己手写可不容易,因为需要利用<[Unity3D]Mesh>(点击打开链接)将一个物体分解成多个碎片,然后再写一系列的方法.此时可以利用到U ...

  4. 【Fracturing Destruction】Unity3D的物体爆裂、炸裂、碎裂效果

    如果要想做到如下图的爆裂.炸裂.碎裂效果特效: 自己手写可不容易,因为需要利用<[Unity3D]Mesh>(点击打开链接)将一个物体分解成多个碎片,然后再写一系列的方法.此时可以利用到U ...

  5. Unity3d 控制物体transform移动的几种方法

    在Unity开发中我们难免要使用代码控制角色的移动,现将已知的几种方法总结如下: 一.transform.Translate() function Translate (translation : V ...

  6. 【Unity3D】物体、材质的设置、物体位移与旋转

    Unity3D和Flash一样,甚至可以说是和C#一样,拖完组件,再写一系列的脚本,完成编程,甚至可以说,就是带编程脚本的3DSMAX.那么如何完成最基本的物体.材质的设置.物体位移与旋转呢?下面用一 ...

  7. Unity3d 控制物体移动、旋转、缩放

    在Unity中通过利用 Input Manager(输入管理器)可以很简单的实现对一个物体进行移动.旋转.缩放操作. 演示代码: //通过虚拟轴控制物体移动.旋转.缩放 public class Mo ...

  8. unity3d 随机物体生成器 工具

    根据输入的物体生成随机成组的物体. 1 /// <summary> 2 /// 本脚本可以由输入的预制 生成以本物体为中心的随机预制,支持预制打组 3 /// 随机物体生成器(尤其试用于场 ...

  9. 【Unity3D】 物体始终朝向目标物体的实现

    using UnityEngine;public class LookAtTarget : MonoBehaviour {public Transform target;// Use this for ...

最新文章

  1. leetcode-402 移掉K位数组
  2. 使用Gradle整合SpringBoot+Vue.js-开发调试与打包
  3. DWZ与KindEditor编辑器的整合
  4. 给医生的R语言课程:零基础入门篇
  5. superset0.34源码级别汉化
  6. Linux(Ubuntu)常用命令(五)—— vi/vim常用操作
  7. 「代码随想录」714.买卖股票的最佳时机含手续费 【动态规划】力扣详解!
  8. 从随机森林到极端随机森林,再到深度森林
  9. 微信公众号测试号申请及访问(图详解)
  10. 京东方10.1寸1280*800薄屏EV101WXM-N10-BOE工业屏
  11. win10 软件移动位置信息服务器,如何修改win10软件默认安装位置
  12. IT痴汉的工作现状12-叶志坚离职了
  13. autojs查找轮廓相似的图片
  14. 简单html模板 二手,二手物品交易HTML5模板
  15. 《SQL Server2008R2数据挖掘与商业智能》实例——决策树
  16. 多智能体仿真环境NetLogo介绍之导入外部数据
  17. 关于js中sort排序的用法
  18. 小程序监听点击底部tabbar事件
  19. leetcode-753: 破解保险箱
  20. 765. 情侣牵手(贪心思想)

热门文章

  1. CSS之box-shadow
  2. NYOJ 17 单调递增最长公共子序列
  3. Windows删除指定时间之前指定后缀名的文件
  4. Linux 禁ping和开启ping操作
  5. 通过 .htaccess 实现缓存策略
  6. 发个上海英雄会聚会沙龙的公告 希望和大家一起见面交流探讨
  7. 解决Linux下动态链接库失败的问题
  8. 出现“adb不是内部或外部命令,也不是可运行的程序或批量文件。”
  9. 信号处理:傅立叶变换的波形分辨率和频率分辨率
  10. 编程练习:Matlab,图片保存