当前位置: 首页 > 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…...

ES6从入门到精通:前言

ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色&#xf…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求&#xff…...

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

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

如何在网页里填写 PDF 表格?

有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据&#xff…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

Python Einops库:深度学习中的张量操作革命

Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...

pycharm 设置环境出错

pycharm 设置环境出错 pycharm 新建项目,设置虚拟环境,出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...

Python网页自动化Selenium中文文档

1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API,让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API,你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...