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

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行&#xff1a; rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准

城市路内停车管理常因行道树遮挡、高位设备盲区等问题&#xff0c;导致车牌识别率低、逃费率高&#xff0c;传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法&#xff0c;正成为破局关键。该设备安装于车位侧方0.5-0.7米高度&#xff0c;直接规避树枝遮…...

土建施工员考试:建筑施工技术重点知识有哪些?

《管理实务》是土建施工员考试中侧重实操应用与管理能力的科目&#xff0c;核心考查施工组织、质量安全、进度成本等现场管理要点。以下是结合考试大纲与高频考点整理的重点内容&#xff0c;附学习方向和应试技巧&#xff1a; 一、施工组织与进度管理 核心目标&#xff1a; 规…...

如何通过git命令查看项目连接的仓库地址?

要通过 Git 命令查看项目连接的仓库地址&#xff0c;您可以使用以下几种方法&#xff1a; 1. 查看所有远程仓库地址 使用 git remote -v 命令&#xff0c;它会显示项目中配置的所有远程仓库及其对应的 URL&#xff1a; git remote -v输出示例&#xff1a; origin https://…...