当前位置: 首页 > news >正文

透明物体的投射和接收阴影

1、让透明度测试Shader投射阴影

(1)同样我们使用FallBack的形式投射阴影,但是需要注意的是,FallBack的内容为:Transparent / Cutout / VertexLit,该默认Shader中会把裁剪后的物体深度信息写入到 阴影映射纹理和摄像机深度图中
注意:使用该默认Shader计算投射阴影时,需要使用_Cutwoff属性 和 _Color属性来进行相关计算,因此我们必须保证我们的Shader当中有名为_Cutoff的阈值属性 和 _Color的漫反射颜色属性,否则无法得到正确阴影结果

(2)为了得到正确的阴影效果,我们需要将该物体的Cast Shadows(投射阴影)属性设置为Two Sided(双面),强制让Unity计算阴影隐射纹理时计算所有面的深度信息。因为如果不设置,默认将物体渲染到阴影隐射纹理和摄像机深度图时只会考虑物体的正面,背对光源的面不会参与计算(左图),设置为双面后即可参与计算,得到正确的结果(右图)。

3、让透明度测试Shader接收阴影

主要分5步骤:
(1)编译指令:#pragma multi_compile_fwdbase
用于帮助我们编译所有变体 并且保证衰减相关光照变量能够正确赋值到对应的内置变量中
(2)包含内置文件: #include "AutoLight.cginc"
(3)结构体中声明阴影坐标宏:SHADOW_COORDS(n)
n为下一个可用的插值寄存器的索引值(结构体前面有几个TEXCOORD就填几)
(4)坐标转换宏:TRANSFER_SHADOW(o);
(5)Unity光照衰减计算宏:UNITY_LIGHT_ATTENUATION(atten, v2f结构体, 顶点世界坐标位置);

Shader "ShaderProj/4/TranparentTest_Both"
{Properties{_MainTex("MainTex", 2D) = ""{}_Color("MainColor", Color) = (1,1,1,1)_SpecularColor("SpecularColor", Color) = (1,1,1,1)_SpecularNum("SpecularNum", Range(0,20)) = 15_Cutoff("CutOff", Range(0,1)) = 0       // 透明度测试阈值}SubShader{Tags{"Queue"="AlphaTest""IgnoreProjector"="True""RenderType"="TransparentCutout"}Pass{Tags { "LightMode"="ForwardBase" }// 关闭剔除,正面背面都被渲染Cull OffCGPROGRAM#pragma vertex vert#pragma fragment frag#pragma multi_compile_fwdbase#include "UnityCG.cginc"#include "Lighting.cginc"#include "AutoLight.cginc"sampler2D _MainTex;float4 _MainTex_ST;fixed4 _Color;fixed4 _SpecularColor;float _SpecularNum;fixed _Cutoff;struct v2f{float4 pos:SV_POSITION;float2 uv:TEXCOORD0;float3 wNormal:NORMAL;float3 wPos:TEXCOORD01;SHADOW_COORDS(2)};fixed3 getLambertColor(float3 normal, float3 lightDir, fixed3 albedo){fixed3 color = _LightColor0 * albedo * max(0, dot(lightDir, normal));return color;}fixed3 getSpecularColor(float3 worldPos, float3 normal, float3 lightDir){//float3 viewDir = normalize(_WorldSpaceCameraPos - worldPos);float3 viewDir = normalize(UnityWorldSpaceViewDir(worldPos));float3 halfAngle = normalize(viewDir + lightDir);fixed3 color = _LightColor0 * _SpecularColor * pow(max(0, dot(normal, halfAngle)), _SpecularNum);return color;}v2f vert (appdata_base v){v2f data;data.pos = UnityObjectToClipPos(v.vertex);data.wNormal = UnityObjectToWorldNormal(v.normal);data.wPos = mul(unity_ObjectToWorld, v.vertex);data.uv = TRANSFORM_TEX(v.texcoord, _MainTex);//data.uv = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw;TRANSFER_SHADOW(data)return data;}fixed4 frag (v2f i) : SV_Target{// 透明度测试fixed4 texColor = tex2D(_MainTex, i.uv);clip(texColor.a - _Cutoff);//计算光照衰减和阴影衰减的宏UNITY_LIGHT_ATTENUATION(atten, i, i.wPos)fixed3 albedo = texColor.rgb * _Color.rgb;                float3 lightDir = normalize(_WorldSpaceLightPos0);fixed3 lambertColor = getLambertColor(i.wNormal, lightDir, albedo);fixed3 specularColor = getSpecularColor(i.wPos, i.wNormal, lightDir);fixed3 color = (lambertColor + specularColor) * atten + UNITY_LIGHTMODEL_AMBIENT.rgb * albedo;return fixed4(color, 1);}ENDCG}}Fallback "Transparent/Cutout/VertexLit"
}

3、透明度混合处理阴影

根据透明度测试的思路,我们如果想要物体产生阴影效果无非就两步:
(1)投射阴影
    在FallBack中关联内置的对应Shader("Transparent/VertexLit")
(2)接受阴影
    在Shader中书写计算阴影衰减值的相关代码
因此对于透明度混合的Shader也会使用同样的思路去制作

但是!!!由于透明度混合需要关闭深度写入,而阴影相关的处理需要用到深度值参与计算,因此Unity中从性能方面考虑(要计算半透明物体的的阴影表现效果是相对复杂的),所有的内置半透明Shader都不会产生阴影效果(比如 Transparent/ VertexLit)
因此
2 - 1.透明混合Shader想要 投射阴影时
不管你在FallBack中写入哪种自带的半透明混合Shader,都不会有投射阴影的效果,因为深度不会写入

2 - 2.透明混合Shader想要 接受阴影时
Unity内置关于阴影接收计算的相关宏,不会计算处理透明混合Shader【混合因子 设置为半透明效果(Blend SrcAlpha OneMinusSrcAlpha)的Shader】
因为透明混合物体的深度值和遮挡关系无法直接用传统的深度缓冲和阴影贴图来处理

结论:Unity中不会直接为透明度混合Shader处理阴影

4、透明度混合强制生成阴影

在FallBack中设置一个非透明Shader,比如VertexLit、Diffuse等,用其中的灯光模式设置为阴影投射的渲染通道来参与阴影映射纹理的计算,把该物体当成一个实体物体处理,但是,这种效果并不真实,不建议使用

相关文章:

透明物体的投射和接收阴影

1、让透明度测试Shader投射阴影 (1)同样我们使用FallBack的形式投射阴影,但是需要注意的是,FallBack的内容为:Transparent / Cutout / VertexLit,该默认Shader中会把裁剪后的物体深度信息写入到 阴影映射纹…...

NL2SQL商业案例详解:AI智能开放搜索 OpenSearch

NL2SQL商业案例详解:AI智能开放搜索 OpenSearch 基于阿里巴巴自主研发的大规模分布式搜索引擎搭建的一站式智能搜索业务开发平台,目前为包括淘宝、天猫在内的阿里集团核心业务提供搜索服务支持。通过内置各行业的查询语义理解、机器学习排序算法等能力,以及充分开放的文本向…...

【万字长文】Word2Vec计算详解(一)

【万字长文】Word2Vec计算详解(一) 写在前面 本文用于记录本人学习NLP过程中,学习Word2Vec部分时的详细过程,本文与本人写的其他文章一样,旨在给出Word2Vec模型中的详细计算过程,包括每个模块的计算过程&a…...

【EXCEL数据处理】000022 案例 保姆级教程,附多个操作案例。EXCEL邮件合并工具

前言:哈喽,大家好,今天给大家分享一篇文章!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 【EXCEL数据处理】000022 案例 保姆级教程,附多个操作案例。…...

第十五周:机器学习笔记

第十五周周报 摘要Abstract一、机器学习1. 各式各样神奇的自注意力机制1.1 Local Attention/Truncated Attention(截断注意力机制)1.2 Stride Attention(跨步注意力机制)1.3 Global Attention(全局注意力机制&#xff…...

Highcharts 散点图

Highcharts 散点图 介绍 Highcharts 是一个流行的 JavaScript 图表库,广泛用于网页上展示动态和交互式的图表。散点图是 Highcharts 提供的一种图表类型,它通过在二维坐标系中展示数据点的分布,来揭示变量之间的关系。散点图特别适用于展示和比较大量的数据点,从而发现数…...

谷粒商城踩坑

1.mysql表名大小写问题(P16) 问题描述:代码要求的是表名大写,但实际上数据库是小写的,就报错: 问题解决:未解决 mysql版本为5.7.44。网上有两种解决方式,但是都解决不了 1.1 解决方…...

构建MySQL健康检查Web应用

构建MySQL健康检查Web应用 在这里将探讨如何将MySQL健康检查功能转换为一个功能完整的Web应用。这个应用允许用户通过简单的Web界面执行MySQL健康检查,并查看详细的结果。我们将逐步介绍代码实现、改进过程以及如何设置和运行这个应用。 1. MySQL健康检查类 首先…...

【LeetCode】每日一题 2024_10_8 旅行终点站(哈希)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动! 国庆结束了 . . . 力扣的每日一题也来到了终点站 题目:旅行终点站 代码与解题思路 func destCity(paths [][]string) string { // 国庆结束,旅途到了终点// 今天这道题算是一个小…...

Matlab实现海鸥优化算法优化回声状态网络模型 (SOA-ESN)(附源码)

目录 1.内容介绍 2部分代码 3.实验结果 4.内容获取 1内容介绍 海鸥优化算法(Seagull Optimization Algorithm, SOA)是一种受海鸥觅食和飞行行为启发的群体智能优化算法。SOA通过模拟海鸥在空中搜寻食物、聚集和分散的行为模式,来探索和开发…...

看门狗电路设计

看门狗电路设计 看门狗是什么应用架构图TPV6823芯片功能硬件时序图为什么要一般是要保持200个毫秒左右的这种低电平的时间看门狗电路实际应用与条件 看门狗是什么 硬件看门狗芯片,Watch DogTimer,可用于受到电气噪音、电源故障、静电放电等影响(造成软件…...

No.13 笔记 | 网络安全防护指南:从法律法规到技术防御

一、法律法规 《中华人民共和国网络安全法》要点 遵守法律:所有个人和组织在使用网络时,必须遵守宪法和法律,不得利用网络从事危害国家安全等活动。 个人信息保护:禁止非法获取、出售或提供个人信息。若违反但未构成犯罪&#x…...

大数据毕业设计选题推荐-白酒销售数据分析-Python数据可视化-Hive-Hadoop-Spark

✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…...

shell脚本写代码

用简单的test语句来判断是否闰年 #! /bin/bash read -p "sd " yearif [ $((year%4)) -eq 0 -a $((year%100)) -ne 0 -o $((year%400)) -eq 0 ]thenecho "是润年"elseecho "不是闰年" fi判断一个数是否为偶数 #! /bin/bash read -p "…...

SLM2104S高压半桥驱动SLM2104SCA-13GTR兼容IR2104 高压、高速的功率MOSFET和IGBT驱动器

SLM2104SCA-13GTR产品概述: SLM2104SCA-13GTR是一款高压、高速的功率MOSFET和IGBT驱动器,它提供相互依存的高边、低边输出驱动信号。采用专有的高压集成电路和锁存免疫CMOS技术,提供可靠的单芯片驱动方案。逻辑输入电平与标准CMOS或LSTTL输出…...

三层网络与三层组网

"三层组网"和"三层网络"虽然名字相似,但它们的含义却有所不同 三层网络 三层网络指的是网络层的概念,它工作在OSI模型的第三层——网络层。网络层的主要功能是通过IP地址进行路由和转发数据包。三层网络设备,如路由器或…...

从0开始下载安装并使用unity

首先我们要在浏览器上找到unity的官网 这一个就是了,我们点进去后是这个界面: 然后我们点击上面这张图的左下角的“下载Unity Hub”,推荐后续安装都装在D盘: 这里他会让我们注册一个账号,如果之前有的话登录就行了&am…...

QT:计算点到线段的垂线段的距离

描述 在Qt中,要计算一个点到一条线段的垂线段的长度(即点到线段上最近点的距离,且这个点是垂直于线段的),你不能直接使用QVector2D::distanceToLine,因为这个方法计算的是点到直线的垂直距离,而…...

经典5级流水线概述

抽象化的流水线结构: 流水线的基本概念 多个任务重叠(并发/并行)执行,但使用不同的资源流水线技术提高整个系统的吞吐率,不能缩短单个任务的执行时间其潜在的加速比=流水线的级数 流水线正常工作的基本条件…...

LSTM模型实现电力数据预测

关于深度实战社区 我们是一个深度学习领域的独立工作室。团队成员有:中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等,曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万粉丝,拥有2篇国家级人工智能发明专利。 社区特色&a…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异&#xff…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...