untiy 实现贴花效果
实现 效果
2023-09-27 14:27:14 时间
注意,必须为你的摄像机开启提取深度纹理,如果挂载shader后没有效果,为你的摄像机挂载这个脚本,并在脚本上右键reset一下
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraDepth : MonoBehaviour
{
private void Reset()
{
GetComponent<Camera>().depthTextureMode |= DepthTextureMode.Depth;
// GetComponent<Camera>().depthTextureMode |= DepthTextureMode.DepthNormals;
}
}
接下来是主角shader
Shader "Custom/Decal"
{
Properties
{
_Color("Color", Color) = (1,1,1,1)//贴图颜色校正
_MainTex("Albedo (RGB)", 2D) = "white" {} //贴图的颜色
_ShadowAmount("ShadowAmount",Range(0,1)) = 0 //阴影的浓度
}
SubShader
{
Tags{"RenderType" = "Transparent" "Queue" = "Geometry+1" "DisableBatching" = "True" } //queue必须稍晚一些
Pass
{
Tags{"LightMode" = "ForwardBase"}
// Blend SrcAlpha OneMinusSrcAlpha
ZWrite off
ZTest off
Cull Front //剔除前部,防止摄像机进入cube后,贴花不显示
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_fwdbase
#include "UnityCG.cginc"
#include "AutoLight.cginc"
#include "Lighting.cginc"
struct v2f
{
float4 pos : SV_POSITION;
float4 screenPos:TEXCOORD0;
SHADOW_COORDS(1)
};
float4 _Color;
sampler2D _MainTex;
float4 _MainTex_ST;
sampler2D _CameraDepthTexture; //深度纹理
fixed _ShadowAmount;//阴影的强度
//从深度图反推世界坐标 参数屏幕坐标
float3 DepthToWorldPosition(float4 screenPos)
{
float depth = Linear01Depth(UNITY_SAMPLE_DEPTH(tex2Dproj(_CameraDepthTexture,screenPos)));
float4 ndcPos = (screenPos / screenPos.w) * 2 - 1; //要除以一个w是因为从屏幕上获取的坐标(_ProjectionParams)是没有除过w的,需要先除一下来获取NDC
float3 clipPos = float3(ndcPos.x, ndcPos.y, 1) * _ProjectionParams.z;
float3 viewPos = mul(unity_CameraInvProjection,clipPos.xyzz).xyz * depth;
float3 worldPos = mul(UNITY_MATRIX_I_V, float4(viewPos, 1)).xyz;
return worldPos;
}
v2f vert(appdata_base v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
//屏幕坐标
o.screenPos = ComputeScreenPos(o.pos);
TRANSFER_SHADOW(o);
return o;
}
fixed4 frag(v2f i) :SV_Target
{
float3 pos = DepthToWorldPosition(i.screenPos); //世界坐标
float3 localPos = mul(unity_WorldToObject, float4(pos,1)).xyz;//局部坐标 注意这里是把别人的世界坐标转为自己的局部坐标
clip(0.5 -abs(localPos));//剔除除了底面外的其他面,abs是取绝对值,对一个float3取得值结果在0-1
//float a=0.5-abs(localPos);
float2 decalUV = localPos.xz+0.5;
fixed3 finalColor = tex2D(_MainTex, decalUV);
//计算阴影
UNITY_LIGHT_ATTENUATION(atten, i, pos);
finalColor.xyz *= lerp(_ShadowAmount,1,atten );
//return float4(a,a,a,1) ;
//return float4(localPos,1) ;
return float4(finalColor,1) ;
}
ENDCG
}
}
}
创建一个材质,将材质的shader设置为这个,然后在场景里创建一个cube,将材质设置为贴花材质,即可,效果如下
shader参照大佬的视频
相关文章
- 带你用VUE实现上传图片效果
- 实战案例丨分布式系统中如何用python实现Paxos
- 【单目标优化算法】沙猫群优化算法(Matlab代码实现)
- Matlab使用Plot函数实现数据动态显示方法总结
- 基于opencv+python实现数独
- o(1)复杂度之双边滤波算法的原理、流程、实现及效果。
- Python操作MySQL基本环境搭建及增删改查实现
- React使用antd实现可编辑单元格
- android自定义view实现progressbar的效果
- 大学生如何实现经济独立 ?
- 如何实现Linux tmp目录自动清理
- 转: android 实现效果特效
- 使用HashTable来实现树的查找
- 【彩虹爱心源代码----HTML+JS+CSS等实现(附效果+源代码)】
- 【基于SSM+MySQL+JSP的在线教材管理系统的设计与实现(效果+数据库+源码+获取~~)】
- LeetCode刷题(7)【栈&队列】用队列实现栈(C语言)
- Oracle中字符串连接的实现方法
- jquery pagination 实现jsp页面分页效果
- SpringMVC入门到实战------八、RESTful案例。SpringMVC+thymeleaf+BootStrap+RestFul实现员工信息的增删改查
- unity 实现物体破碎效果的一些方法
- 阿里云助艾尔肯实现维吾尔族音乐梦
- vue实现换一批业务【WoodenFish完整版】
- unity 实现PPT动画效果切换图片
- Elasticsearch按某个字段去重-实现group by效果
- 《Mastering Opencv读书笔记》第一章 实现图像卡通效果
- 一款纯css3实现的响应式导航
- Android多线程任务优化2:实现后台预读线程
- Java实现MD5加密解密类
- [Unity3d]汽车的前照灯的效果实现