Unity 实现贴花/投影效果
【核心思路】
实现投影效果有以下几种思路:
一是对处理渲染到相机的最终画面,将想投影的贴图修改上去。
二是对被投影的物体的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 实现贴花/投影效果相关推荐
- Unity 实现贴花效果的制作教程
c#教程https://www.cnblogs.com/Yesi/p/15829200.html 有些游戏中的战斗痕迹的效果会通过贴花来实现的,贴花的方式多种多样.而在Unity中,有一种给官方 ...
- Unity Shader 贴花效果(一)
本文实现的是一个Mesh Decal方法的贴花方案,参考了本篇博文链接: unity的贴花方案.链接的文章是转载的,我并没有找到原文地址.本篇文章主要是学习和自己的理解为主. 先看未贴花之前的效果 这 ...
- unity的贴花方案
前言 最近通关了<What Remains of Edith Finch>(艾迪芬奇的记忆),总体来说应该算是一个剧情+解密向的游戏,故事+表现手法十分出色. 游戏主要是叙述一个神秘的家族 ...
- Unity URP贴花系统的简单使用
一.unity版本:2021.2 二.创建URP项目 三.找到UniversalRenderer 四.创建GameObject添加贴花组件(URP Decal Projector) 五.创建材质球Ma ...
- Unity Shader 实现简单的贴花效果(二)
这个月进入了找不倒工作的焦虑状态,花了两周时间去学OpenGL,发现以前课上的讲的内容过于浅显,也加深了对渲染管线的了解也算是相当不错的吧. 话不多说,先上最初的效果图吧. 本效果考了该篇博客Unit ...
- unity-shader相关
title: unity-shader相关 categories: Unity3d-Shader tags: [unity, shader] date: 2017-09-12 10:05:18 com ...
- 【游戏开发小技】Unity中实现Dota里的角色技能地面贴花效果(URP | ShaderGraph | Decal)
本文最终效果 文章目录 一.前言 二.环境准备 1.URP环境准备 2.技能范围图案 二.方案一:写Shader实现 1.Shader脚本:UrpDecal.shader 2.材质球 3.创建Cube ...
- 【游戏开发小技】Unity中实现Dota里的角色技能地面贴花效果(URP ShaderGraph Decal)
本文最终效果 文章目录 一.前言 二.环境准备 1.URP环境准备 2.技能范围图案 二.方案一:写Shader实现 1.Shader脚本:UrpDecal.shader 2.材质球 3.创建Cube ...
- Unity 贴花效果的实现
一.前言 在云艾尔登法环时,看到地面上的血迹时,发现某些地方脱离的地面,似乎是通过面片的方式实现的效果.但是同时某些,不过这种类型的血迹有道具的效果,估计是为了实现碰撞检测的功能才选择了面片的方式 而 ...
最新文章
- S4HANA事务码MM01创建物料的调试
- MYSQL AND OR的联用
- ubuntu16.04中创建新用户
- Linux 端口占用情况查看
- android 安全加固总结报告,[原创]某加固详细分析总结,另附该加固脱壳机
- linux mysql show_Linux下 MySQL Show命令的使用
- 商品进销差价_新准则下商品进销差价实务处理
- NDT算法的匹配流程
- 经典 tcp粘包分析
- Linux常用命令|徐奥雯编辑整理|XUAOWEN
- 逻辑卷(lvm)的配置与管理
- MATLAB绘制三维曲面图和等高线 绘图(2)
- 全球主要语言缩写对照
- 使用公众号快速申请小程序的流程
- 雷锋微视点:每日微博精选(2011.10.17)
- python表格控件_python表格控件
- PS产品精修 Photoshop教程
- 知网专利信息爬虫!强无敌!
- python compare函数_Python函数基础
- Linux内核符号表