【核心思路】

实现投影效果有以下几种思路:

一是对处理渲染到相机的最终画面,将想投影的贴图修改上去。

二是对被投影的物体的Shader加上关键字,开启关键字的时候用想投影的贴图。

三是在一个物体上渲染想投影的贴图,让这个物体最后绘制,且只绘制那些被遮挡的部分,

本文采用第三种实现方式。

【实现效果】

【Build-In Shader】

Shader "Unlit/DecalShader"
{Properties{[HDR] _Color ("Tint", Color) = (0, 0, 0, 1)_MainTex ("Texture", 2D) = "white" {}}SubShader{Tags{ "RenderType"="Transparent" "Queue"="Transparent-400" "DisableBatching"="True"}//选择透明渲染,要在所有透明物体渲染完成之后再渲染Blend SrcAlpha OneMinusSrcAlphaZWrite off //关闭深度写入,投影不需要Pass{CGPROGRAM#include "UnityCG.cginc"//定义顶点和片元着色器函数#pragma vertex vert#pragma fragment fragsampler2D _MainTex;float4 _MainTex_ST;fixed4 _Color;//相加深度图,要用C#代码开启相机深度图Camera.main.depthTextureMode = DepthTextureMode.Depthsampler2D_float _CameraDepthTexture;struct appdata{float4 vertex : POSITION;};struct v2f{float4 position : SV_POSITION;float4 screenPos : TEXCOORD0;float3 ray : TEXCOORD1;};v2f vert(appdata v){v2f o;float3 worldPos = mul(unity_ObjectToWorld, v.vertex);o.position = UnityWorldToClipPos(worldPos);o.ray = worldPos - _WorldSpaceCameraPos;//这个点的世界坐标减去相机的世界坐标,得到从相机到这个点的方向向量o.screenPos = ComputeScreenPos (o.position);//计算这个点A在屏幕空间的位置return o;}float3 getProjectedObjectPos(float2 screenPos, float3 worldRay){//根据屏幕目标采样相机深度纹理得到一个深度,注意这个深度是其他物体的,我们叫点B的深度,我们只是用了点A在屏幕坐标float depth = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, screenPos);depth = Linear01Depth (depth) * _ProjectionParams.z;worldRay = normalize(worldRay);worldRay /= dot(worldRay, -UNITY_MATRIX_V[2].xyz);//这一步不可少,如果仅用worldRay * depth,计算出来的深度是相机到点的直线距离,而在Unity中,有near plane和far plane,plane上的任意一点到相机的深度都是一样的,这里用相机朝向和相机到这个点的方向得到这个点的实际单位长度//with that reconstruct world and object space positionsfloat3 worldPos = _WorldSpaceCameraPos + worldRay * depth; //计算得到了B点的世界坐标float3 objectPos =  mul (unity_WorldToObject, float4(worldPos,1)).xyz; //将点B变换到A所在物体的坐标系中clip(0.5 - abs(objectPos));//Cube的世界坐标归一化后,有效值是从-0.5到0.5,其他的需要舍弃objectPos += 0.5;//采样纹理时的坐标范围为0~1,要加0.5return objectPos;}fixed4 frag(v2f i) : SV_TARGET{float2 screenUv = i.screenPos.xy / i.screenPos.w;float2 uv = getProjectedObjectPos(screenUv, i.ray).xz;//计算出来的uv不是0就是1,直接当作uv坐标来用fixed4 col = tex2D(_MainTex, uv);col *= _Color;return col;}ENDCG}}
}

【参考】

Unlit Dynamic Decals/Projection | Ronja's tutorials

Unity 实现贴花/投影效果相关推荐

  1. Unity 实现贴花效果的制作教程

    c#教程​https://www.cnblogs.com/Yesi/p/15829200.html ​ 有些游戏中的战斗痕迹的效果会通过贴花来实现的,贴花的方式多种多样.而在Unity中,有一种给官方 ...

  2. Unity Shader 贴花效果(一)

    本文实现的是一个Mesh Decal方法的贴花方案,参考了本篇博文链接: unity的贴花方案.链接的文章是转载的,我并没有找到原文地址.本篇文章主要是学习和自己的理解为主. 先看未贴花之前的效果 这 ...

  3. unity的贴花方案

    前言 最近通关了<What Remains of Edith Finch>(艾迪芬奇的记忆),总体来说应该算是一个剧情+解密向的游戏,故事+表现手法十分出色. 游戏主要是叙述一个神秘的家族 ...

  4. Unity URP贴花系统的简单使用

    一.unity版本:2021.2 二.创建URP项目 三.找到UniversalRenderer 四.创建GameObject添加贴花组件(URP Decal Projector) 五.创建材质球Ma ...

  5. Unity Shader 实现简单的贴花效果(二)

    这个月进入了找不倒工作的焦虑状态,花了两周时间去学OpenGL,发现以前课上的讲的内容过于浅显,也加深了对渲染管线的了解也算是相当不错的吧. 话不多说,先上最初的效果图吧. 本效果考了该篇博客Unit ...

  6. unity-shader相关

    title: unity-shader相关 categories: Unity3d-Shader tags: [unity, shader] date: 2017-09-12 10:05:18 com ...

  7. 【游戏开发小技】Unity中实现Dota里的角色技能地面贴花效果(URP | ShaderGraph | Decal)

    本文最终效果 文章目录 一.前言 二.环境准备 1.URP环境准备 2.技能范围图案 二.方案一:写Shader实现 1.Shader脚本:UrpDecal.shader 2.材质球 3.创建Cube ...

  8. 【游戏开发小技】Unity中实现Dota里的角色技能地面贴花效果(URP ShaderGraph Decal)

    本文最终效果 文章目录 一.前言 二.环境准备 1.URP环境准备 2.技能范围图案 二.方案一:写Shader实现 1.Shader脚本:UrpDecal.shader 2.材质球 3.创建Cube ...

  9. Unity 贴花效果的实现

    一.前言 在云艾尔登法环时,看到地面上的血迹时,发现某些地方脱离的地面,似乎是通过面片的方式实现的效果.但是同时某些,不过这种类型的血迹有道具的效果,估计是为了实现碰撞检测的功能才选择了面片的方式 而 ...

最新文章

  1. S4HANA事务码MM01创建物料的调试
  2. MYSQL AND OR的联用
  3. ubuntu16.04中创建新用户
  4. Linux 端口占用情况查看
  5. android 安全加固总结报告,[原创]某加固详细分析总结,另附该加固脱壳机
  6. linux mysql show_Linux下 MySQL Show命令的使用
  7. 商品进销差价_新准则下商品进销差价实务处理
  8. NDT算法的匹配流程
  9. 经典 tcp粘包分析
  10. Linux常用命令|徐奥雯编辑整理|XUAOWEN
  11. 逻辑卷(lvm)的配置与管理
  12. MATLAB绘制三维曲面图和等高线 绘图(2)
  13. 全球主要语言缩写对照
  14. 使用公众号快速申请小程序的流程
  15. 雷锋微视点:每日微博精选(2011.10.17)
  16. python表格控件_python表格控件
  17. PS产品精修 Photoshop教程
  18. 知网专利信息爬虫!强无敌!
  19. python compare函数_Python函数基础
  20. Linux内核符号表

热门文章

  1. 电子产品可靠性试验的目的和方法
  2. 常见的几种最优化方法Matlab原理和深度分析
  3. jq 的 append 方法
  4. 设计模式系列之建造者模式构建实体类
  5. NKOI 1385 笨笨种西瓜
  6. Confluence集成实践:2:Confluence的RestAPI
  7. 多重共线性的诊断(R语言)
  8. 建模方法(七)-中心化处理和标准化处理
  9. IEduChina 2019国际教育展暨国际教育论坛相约北京
  10. SpringSecurity知识