【Unity3D】实现Decal贴花效果,模拟战旗游戏地形效果

目录

一、基础版

二、Post Process 辉光Bloom效果 + 矩形渐隐


涉及知识点:Decal贴花、屏幕后处理Bloom、屏幕空间构建世界空间、ChracterController物体移动、Terrain地形创建

一、基础版

Unity 2019.4.0f1 普通渲染管线(非URP、非HDRP)
URP HDRP 在Unity 2021.2以上均可直接使用内置的贴花系统,具体网上有说明。

贴花物体是一个个Cube立方体,我将它拉长了Y轴 便于能接触到地面。

其中角色物体胶囊体要进行设置渲染层级,GetComponent<MeshRenderer>().material.renderQueue = 3001; //将人物放到贴花物体之后渲染,不被贴花物体影响

如这个Cube长方体就是红色边缘的Cube贴花,贴花颜色是红色。

贴花物体是透明层,不写入深度和深度检测,以及裁剪正面,不裁剪背面。

可参考:贴花(Decal)效果在Shader里是如何实现的_哔哩哔哩_bilibili

核心代码是DepthToWorldPosition,屏幕空间反向构建世界空间,很类似全局雾效,注意摄像机要开启深度贴图。摄像机挂上这个如下脚本设置:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class OpenDepthTexture : MonoBehaviour
{public DepthTextureMode mode;private void Awake(){GetComponent<Camera>().depthTextureMode = mode;}
}

Shader "Unlit/SimpleDecal"
{Properties{_MainTex ("Texture", 2D) = "white" {}_Color ("Color", Color) = (1,1,1,1)}SubShader{Tags { "RenderType"="Transparent" "Queue"="Transparent" }LOD 100Pass{//Blend One DstAlphaBlend SrcAlpha OneMinusSrcAlpha//Blend One OneZWrite OffZTest OffCull Front CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;};struct v2f{float2 uv : TEXCOORD0;float4 vertex : SV_POSITION;float4 screenPos : TEXCOORD3;};sampler2D _MainTex;float4 _MainTex_ST;sampler2D _CameraDepthTexture;fixed4 _Color;v2f vert (appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = TRANSFORM_TEX(v.uv, _MainTex);o.screenPos = ComputeScreenPos(o.vertex);return o;}float3 DepthToWorldPosition(float4 screenPos){float depth = Linear01Depth(UNITY_SAMPLE_DEPTH(tex2Dproj(_CameraDepthTexture,screenPos)));//线性深度值float4 ndcPos = (screenPos/screenPos.w) * 2 - 1;  //除以w是归一化Unity提供的屏幕坐标[0,1]  *2-1操作 转[-1,1]得到ndc(仅有x,y有效位)float3 clipPos = float3(ndcPos.x, ndcPos.y, 1) * _ProjectionParams.z;  //ndc补z位,直接用1 远平面值,之后乘以far远平面距离得到裁剪坐标//clipPos还缺一个w,实际z值就是w值故完整clipPos是(clipPos.xyzz) 再直接转视图空间得到远平面的视图空间坐标点(即Depth为1的点)                float3 viewPos = mul(unity_CameraInvProjection, clipPos.xyzz).xyz * depth; //*depth相当于一个Lerp操作,depth是[0,1]范围的值,取到depth深度的视图点float3 worldPos = mul(UNITY_MATRIX_I_V,float4(viewPos, 1)).xyz; //视图转世界坐标return worldPos;}fixed4 frag (v2f i) : SV_Target{float3 worldPos = DepthToWorldPosition(i.screenPos);float4 localPos = mul(unity_WorldToObject, float4(worldPos, 1.0));clip(float3(0.5,0.5,0.5) - abs(localPos.xyz));fixed2 decalUV = fixed2(localPos.x, localPos.z);decalUV = decalUV + 0.5; //模型空间 [-0.5,0.5] => [0,1] uv空间fixed4 color = tex2D(_MainTex, decalUV) * _Color;return color;}ENDCG}}
}

玩家胶囊体脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Player3D : MonoBehaviour
{public GameObject greenPrefab;public GameObject redPrefab;public int size = 5;public Terrain terrain;private CharacterController characterController;private float h;private float v;private float verticalVelocity;public float moveSpeed = 1;// Start is called before the first frame updatevoid Start(){Vector3 pos = transform.position;int halfSize = Mathf.FloorToInt(size / 2);for (int i = -halfSize; i <= halfSize; i++){for (int j = -halfSize; j <= halfSize; j++){int v = Mathf.Abs(i) + Mathf.Abs(j);if (v <= halfSize){GameObject go = GameObject.Instantiate(v == halfSize ? redPrefab : greenPrefab, transform);go.transform.position = new Vector3(pos.x + i, pos.y, pos.z + j);}}}characterController = GetComponent<CharacterController>();GetComponent<MeshRenderer>().material.renderQueue = 3001; //将人物放到贴花物体之后渲染,不被贴花物体影响}private void Update(){float h = Input.GetAxis("Horizontal");float v = Input.GetAxis("Vertical");Vector3 moveDir = transform.forward * v + transform.right * h;if (!characterController.isGrounded){verticalVelocity -= 9.8f * Time.deltaTime;moveDir.y = verticalVelocity;}else{verticalVelocity = -0.5f;}characterController.Move(moveDir * moveSpeed * Time.deltaTime);}
}

二、Post Process 辉光Bloom效果 + 矩形渐隐

Package Manager导入Post Processing


需确保摄像机开启HDR,查看相应的Graphics Settings设置

如果你的是安卓环境,那么就要去看安卓下的HDR是否开启,如果你是URP、HDRP,则是看对应管线资源的配置是否有开启HDR。

摄像机挂上后处理组件 Post-process Layer,并设置摄像机和Layer要勾选我们想要辉光效果的层级,例如自定义的HDR层

创建一个PostProcess空物体,添加如下图组件Post-process Volume,并且设置它的Layer为HDR

点击组件的New按钮会创建一个Profile资源,再点击Add effect... 添加Unity -> Bloom曝光效果

设置Intensity强度适当5~10左右
Threshold阈值[0,1]范围保持默认即可(如果你设置大于1会导致曝光效果几乎没有)
Soft Knee 软曝光?可以自定义
Diffusion 漫反射,当曝光的地形在有漫反射的物体上时会叠加漫反射的强度好像,反正我不需要拉到最左边即可(即1)其他请自行研究,如下图即可得到gif图效果,如果没有辉光说明Layer层级设置不对,所有需要辉光的物体都要设置Layer层级是HDR(由Post-process Layer指定的层级)

贴花Shader脚本修改如下:

Shader "Unlit/SimpleDecal"
{Properties{_MainTex ("Texture", 2D) = "white" {}[HDR]_Color ("Color", Color) = (1,1,1,1)_Range ("Range", Range(0,0.5)) = 0.45_FadeIntensity ("Fade Intensity", float) = 2}SubShader{Tags { "RenderType"="Transparent" "Queue"="Transparent" }LOD 100Pass{Blend SrcAlpha OneMinusSrcAlphaZWrite OffZTest OffCull FrontCGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;};struct v2f{float2 uv : TEXCOORD0;float4 vertex : SV_POSITION;float4 screenPos : TEXCOORD3;};sampler2D _MainTex;float4 _MainTex_ST;sampler2D _CameraDepthTexture;fixed4 _Color;float _Range;float _FadeIntensity;v2f vert (appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = TRANSFORM_TEX(v.uv, _MainTex);o.screenPos = ComputeScreenPos(o.vertex);return o;}float3 DepthToWorldPosition(float4 screenPos){float depth = Linear01Depth(UNITY_SAMPLE_DEPTH(tex2Dproj(_CameraDepthTexture,screenPos)));//线性深度值float4 ndcPos = (screenPos/screenPos.w) * 2 - 1;  //除以w是归一化Unity提供的屏幕坐标[0,1]  *2-1操作 转[-1,1]得到ndc(仅有x,y有效位)float3 clipPos = float3(ndcPos.x, ndcPos.y, 1) * _ProjectionParams.z;  //ndc补z位,直接用1 远平面值,之后乘以far远平面距离得到裁剪坐标//clipPos还缺一个w,实际z值就是w值故完整clipPos是(clipPos.xyzz) 再直接转视图空间得到远平面的视图空间坐标点(即Depth为1的点)                float3 viewPos = mul(unity_CameraInvProjection, clipPos.xyzz).xyz * depth; //*depth相当于一个Lerp操作,depth是[0,1]范围的值,取到depth深度的视图点float3 worldPos = mul(UNITY_MATRIX_I_V,float4(viewPos, 1)).xyz; //视图转世界坐标return worldPos;}fixed4 frag (v2f i) : SV_Target{float3 worldPos = DepthToWorldPosition(i.screenPos);float4 localPos = mul(unity_WorldToObject, float4(worldPos, 1.0));clip(float3(0.5,0.5,0.5) - abs(localPos.xyz));fixed2 decalUV = fixed2(localPos.x, localPos.z);decalUV = decalUV + 0.5; //模型空间 [-0.5,0.5] => [0,1] uv空间fixed4 color = tex2D(_MainTex, decalUV) * _Color;//由外到内渐隐 (圆形渐隐)//float2 center = float2(0.5, 0.5);//float alpha = lerp(0, distance(float2(0,0), center), distance(decalUV, center));//color.a *= alpha;//由外到内渐隐(矩形渐隐)fixed2 uv = decalUV - 0.5; //转[-0.5,0.5]空间 方便计算float x = abs(uv.x) - _Range;float y = abs(uv.y) - _Range;               //float sum = x+y ;//max(0, x) + max(0, y);float sum = max(x, y);//color.a *= smoothstep(0, (0.5 - _Range) * 2, sum);color.a *= smoothstep(0, (0.5 - _Range) * _FadeIntensity, sum);return color;}ENDCG}}
}

有些bug就是Scene场景看不到贴花地形了,暂时没研究处来是啥情况

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/893921.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构与算法学习笔记----求组合数

数据结构与算法学习笔记----求组合数 author: 明月清了个风 first publish time: 2025.1.27 ps⭐️一组求组合数的模版题&#xff0c;因为数据范围的不同要用不同的方法进行求解&#xff0c;涉及了很多之前的东西快速幂&#xff0c;逆元&#xff0c;质数&#xff0c;高精度等…

基于物联网设计的疫苗冷链物流监测系统

一、前言 1.1 项目开发背景 随着全球经济的发展和物流行业的不断创新&#xff0c;疫苗和生物制品的运输要求变得越来越高。尤其是疫苗的冷链物流&#xff0c;温度、湿度等环境因素的控制直接关系到疫苗的质量和效力&#xff0c;因此高效、可靠的冷链监控系统显得尤为重要。冷…

学习数据结构(1)时间复杂度

1.数据结构和算法 &#xff08;1&#xff09;数据结构是计算机存储、组织数据的方式&#xff0c;指相互之间存在⼀种或多种特定关系的数据元素的集合 &#xff08;2&#xff09;算法就是定义良好的计算过程&#xff0c;取一个或一组的值为输入&#xff0c;并产生出一个或一组…

基于RIP的MGRE实验

实验拓扑 实验要求 按照图示配置IP地址配置静态路由协议&#xff0c;搞通公网配置MGRE VPNNHRP的配置配置RIP路由协议来传递两端私网路由测试全网通 实验配置 1、配置IP地址 [R1]int g0/0/0 [R1-GigabitEthernet0/0/0]ip add 15.0.0.1 24 [R1]int LoopBack 0 [R1-LoopBack0]i…

Oracle迁移DM数据库

Oracle迁移DM数据库 本文记录使用达梦官方数据迁移工具DTS&#xff0c;将Oracle数据库的数据迁移至达梦数据库。 1 数据准备 2 DTS工具操作步骤 2.1 创建工程 打开DTS迁移工具&#xff0c;点击新建工程&#xff0c;填写好工程信息&#xff0c;如图&#xff1a; 2.2 新建迁…

微服务(一)

文章目录 项目地址一、微服务1.1 分析User的Domian Verb和Nouns 二、运行docker和k8s2.1 Docker1. 编写dockerfile2. 创建docker image3. 运行docker使用指定端口4. 查看当前运行的镜像5. 停止当前所有运行的docker6. 删除不用的docker images7. 将本地的image上传到hub里 2.2 …

分享|instructionfine-tuning 指令微调是提高LLM性能和泛化能力的通用方法

《生成式AI导论》课程中&#xff0c;李宏毅老师提到一篇关于“ instruction fine-tuning” 指令微调的论文&#xff1a; 《Scaling Instruction-Finetuned Language Models》 摘要分享&#xff1a; 事实证明&#xff0c; 在一组以指令形式表达的数据集上微调语言模型可以提…

python生成图片和pdf,快速

1、下载安装 pip install imgkit pip install pdfkit2、wkhtmltopdf工具包&#xff0c;下载安装 下载地址&#xff1a;https://wkhtmltopdf.org/downloads.html 3、生成图片 import imgkit path_wkimg rD:\app\wkhtmltopdf\bin\wkhtmltoimage.exe # 工具路径&#xff0c;安…

Hive:基本查询语法

和oracle一致的部分 和oracle不一样的部分 排序 oracle中,在升序排序中&#xff0c;NULL 值被视为最大的值&#xff1b;在降序排序中&#xff0c;NULL 值被视为最小的值。 在MySQL中&#xff0c;NULL 被视为小于任何非空值。 在Hive中, NULL是最小的; Hive除了可以用order…

Python GUI 开发 | PySide6 辅助工具简介

关注这个框架的其他相关笔记&#xff1a;Python GUI 开发 | PySide6 & PyQt6 学习手册-CSDN博客 在上一章中&#xff0c;我们介绍了如何搭建 PySide6 & PyQt6 的开发环境。在搭建环境的时候我们配置了几个几个快捷工具&#xff0c;很多小伙伴可能都不知道是干啥用的。那…

hive:数据导入,数据导出,加载数据到Hive,复制表结构

hive不建议用insert,因为Hive是建立在Hadoop之上的数据仓库工具&#xff0c;主要用于批处理和大数据分析&#xff0c;而不是为OLTP&#xff08;在线事务处理&#xff09;操作设计的。INSERT操作会非常慢 数据导入 命令行界面:建一个文件 查询数据>>复制>>粘贴到新…

HarmonyOS:ForEach:循环渲染

一、前言 ForEach接口基于数组类型数据来进行循环渲染&#xff0c;需要与容器组件配合使用&#xff0c;且接口返回的组件应当是允许包含在ForEach父容器组件中的子组件。例如&#xff0c;ListItem组件要求ForEach的父容器组件必须为List组件。 API参数说明见&#xff1a;ForEa…

基于PostgreSQL的自然语义解析电子病历编程实践与探索(上)

一、引言 1.1研究目标与内容 本研究旨在构建一个基于 PostgreSQL 的自然语义解析电子病历编程体系,实现从电子病历文本中提取结构化信息,并将其存储于 PostgreSQL 数据库中,以支持高效的查询和分析。具体研究内容包括: 电子病历的预处理与自然语言处理:对电子病历文本进…

安装 docker 详解

在平常的开发工作中&#xff0c;我们经常需要部署项目。随着 Docker 容器的出现&#xff0c;大大提高了部署效率。Docker 容器包含了应用程序运行所需的所有依赖&#xff0c;避免了换环境运行问题。可以在短时间内创建、启动和停止容器&#xff0c;大大提高了应用的部署速度&am…

深度学习项目--基于LSTM的糖尿病预测探究(pytorch实现)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 LSTM模型一直是一个很经典的模型&#xff0c;一般用于序列数据预测&#xff0c;这个可以很好的挖掘数据上下文信息&#xff0c;本文将使用LSTM进行糖尿病…

初阶1 入门

本章重点 C的关键字命名空间C的输入输出缺省参数函数重载引用内联函数auto关键字基于范围的for循环指针的空值nullptr 1.C的关键字 c总共有63个关键字&#xff0c;其中包含c语言的32个 这些关键字不需要特意去记&#xff0c;在我们日后写代码的过程中会慢慢用到并记住。 2.…

动态规划DP 数字三角形模型(模型分析+例题分析+C++代码实现)(数字三角形、摘花生、最低通行费用、方格取数、传纸条)

总体概览 数字三角形 原题链接 AcWing 898.数字三角形 题目描述 给定一个如下图所示的数字三角形&#xff0c;从顶部出发&#xff0c;在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点&#xff0c;一直走到底层&#xff0c;要求找出一条路径&#xff0c;使路…

C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)

前言 C#/.NET/.NET Core技术前沿周刊&#xff0c;你的每周技术指南针&#xff01;记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿&#xff0c;助力技术成长与视野拓宽。 欢迎投稿、推荐…

力扣hot100链表总结-day0127

目录 206.反转链表&#xff08;0127&#xff09; 19.删除链表的倒数第N个节点&#xff08;0127&#xff09; 206.反转链表&#xff08;0127&#xff09; 总结&#xff1a; 1.迭代实现&#xff1a;将给出的头节点head固定&#xff0c;始终把head的下一个节点给安装成新头节点…

安宝特方案 | AR在供应链管理中的应用:提升效率与透明度

随着全球化的不断深入和市场需求的快速变化&#xff0c;企业对供应链管理的要求也日益提高。如何在复杂的供应链环境中提升效率、降低成本&#xff0c;并确保信息的透明度&#xff0c;成为了各大行业亟待解决的问题。而增强现实&#xff08;AR&#xff09;技术&#xff0c;特别…