Unity中URP下的半透明效果实现

文章目录

  • 前言
  • 一、实现半透明的步骤
    • 1、修改Blend模式,使之透明
    • 2、打开深度写入,防止透明对象穿模
    • 3、在Tags中,修改渲染类型和渲染队列为半透明 Transparent
  • 二、对透明效果实现从下到上的透明渐变
    • 1、 我们在 Varying 中,定义一个vertexOS,用于把顶点的本地空间坐标传给片元着色器
    • 2、 在顶点着色器中,把Attribute中的模型顶点本地坐标 传入给 vertexOS
    • 3、 我们输出看一下模型顶点本地坐标的xyz
    • 4、使用模型顶点本地坐标中的 y 坐标实现效果
    • 5、定义一个可调节参数 _Offset ,调节透明开始的位置
    • 6、使用saturate(x)限制蒙版区域在(0,1)之间
    • 7、与之前的菲涅尔效果相乘输出
    • 8、修改透明效果为斜着透明(凭个人喜好添加)
    • 9、使头部的菲涅尔效果更加明显,脚部的菲尼尔效果正常
    • 请添加图片描述
  • 三、最终测试代码


前言

URP下的半透明效果的实现方式,和BRP下的实现是一样的。

我们在上一篇文章实现了菲涅尔效果的基础上,继续添加半透明效果。

  • Unity中URP下的菲涅尔效果实现(个性化修改)

一、实现半透明的步骤

1、修改Blend模式,使之透明

  • Unity中Shader的混合模式Blend

Blend One One

2、打开深度写入,防止透明对象穿模

ZWrite On

3、在Tags中,修改渲染类型和渲染队列为半透明 Transparent

Tags
{
	//告诉引擎,该Shader只用于 URP 渲染管线
	"RenderPipeline"="UniversalPipeline"
	//渲染类型
	"RenderType"="Transparent"
	//渲染队列
	"Queue"="Transparent"
}
  • 我们的菲尼尔效果变透明了
    在这里插入图片描述

二、对透明效果实现从下到上的透明渐变

  • 实现思路
    要实现模型从上到下的渐变效果,我们一般使用模型的本地坐标。

1、 我们在 Varying 中,定义一个vertexOS,用于把顶点的本地空间坐标传给片元着色器

float3 vertexOS : TEXCOORD0;

2、 在顶点着色器中,把Attribute中的模型顶点本地坐标 传入给 vertexOS

3、 我们输出看一下模型顶点本地坐标的xyz

  • i.vertexOS.x
    在这里插入图片描述
  • i.vertexOS.y
    在这里插入图片描述
  • i.vertexOS.z
    在这里插入图片描述

4、使用模型顶点本地坐标中的 y 坐标实现效果

我们要实现从下到上,从透明渐变到不透明的效果,则把 y 坐标取反即可(这里每个人的不一样,自己调试)

return i.vertexOS.y * -1;

在这里插入图片描述

5、定义一个可调节参数 _Offset ,调节透明开始的位置

  • 定义的方法在之前文章中
  • Unity中 URP Shader 常量缓冲区CBUFFER

return i.vertexOS.y * -1 + _Offset;

  • 这样就可调节调节透明开始的位置
    请添加图片描述

6、使用saturate(x)限制蒙版区域在(0,1)之间

saturate(i.vertexOS.y * -1 + _Offset);

7、与之前的菲涅尔效果相乘输出

saturate(i.vertexOS.y * -1 + _Offset) * fresnel1

请添加图片描述

8、修改透明效果为斜着透明(凭个人喜好添加)

经测试,我这里使用 模型顶点本地坐标的 x 可以调试出这种效果(每个人的模型可能不一样)

  • i.vertexOS.y * -1 + i.vertexOS.x * -1
    在这里插入图片描述

return saturate(i.vertexOS.y * -1 + i.vertexOS.x * -1 + _Offset) * fresnel1;

请添加图片描述

9、使头部的菲涅尔效果更加明显,脚部的菲尼尔效果正常

这样的效果,我们很容易联想到使用线性插值的方法实现

  • 上面计算的计算结果作为 插值数a

half fresnel = 1 - saturate(NdotL);
//菲涅尔自定义
half4 fresnel1 = pow(fresnel,_Fresnel.x) * _Fresnel.y * _FresnelColor;
//透明渐变效果
float alphaMask = saturate(i.vertexOS.y * -1 + i.vertexOS.x * -1 + _Offset);
fresnel1 = alphaMask * fresnel1;

  • 使菲涅尔效果更加明显 作为 插值数b

_FresnelColor * alphaMask * fresnel1

  • 把alphaMask作为被插值的变量

fresnel1 = lerp(fresnel1,_FresnelColor * alphaMask * fresnel1,alphaMask * _Fresnel.z);

请添加图片描述

三、最终测试代码

//URP下的菲涅尔效果
//URP下的透明效果
Shader "MyShader/URP/P3_2_5"
{
    Properties
    {
        _FresnelColor("FresnelColor",Color) = (0,0,0,0)
        _Fresnel("Fade(X) Intensity(Y) Top(Z) Offset(W)",Vector) = (4,1,1,0)
    }
    SubShader
    {
        Tags
        {
            //告诉引擎,该Shader只用于 URP 渲染管线
            "RenderPipeline"="UniversalPipeline"
            //渲染类型
            "RenderType"="Transparent"
            //渲染队列
            "Queue"="Transparent"
        }
        Blend One One ZWrite On
        Pass
        {
            
            
            HLSLPROGRAM
            #pragma vertex vert
            #pragma fragment frag
           
            #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"
            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"

            struct Attributes
            {
                float3 vertexOS : POSITION;
                float3 normalOS : NORMAL;
            };

            struct Varyings
            {
                float3 vertexOS : TEXCOORD0;
                float4 vertexCS : SV_POSITION;
                float3 vertexWS : TEXCOORD1;
                float3 normalWS : TEXCOORD2;
            };

            CBUFFER_START(UnityPerMaterial)
            half4 _FresnelColor;
            half4 _Fresnel;
            float _Offset;
            CBUFFER_END
            
            Varyings vert (Attributes v)
            {
                Varyings o;
                o.vertexOS = v.vertexOS;
                o.vertexWS = TransformObjectToWorld(v.vertexOS);
                o.vertexCS = TransformWorldToHClip(o.vertexWS);
                o.normalWS = TransformObjectToWorldNormal(v.normalOS);
                
                return o;
            }

            half4 frag (Varyings i) : SV_Target
            {
                
                //dot(N,L)
                half3 N = normalize(i.normalWS);
                half3 L = normalize(_WorldSpaceCameraPos - i.vertexWS);
                half NdotL = dot(N,L);
                //菲涅尔效果 1 - dot(N,L)
                half fresnel = 1 - saturate(NdotL);
                //菲涅尔自定义
                half4 fresnel1 = pow(fresnel,_Fresnel.x) * _Fresnel.y * _FresnelColor;
                
                //透明渐变效果
                float alphaMask = saturate(i.vertexOS.y * -1 + i.vertexOS.x * -1 + _Fresnel.w);
                fresnel1 = alphaMask * fresnel1;

                //头部菲涅尔效果和下部菲涅尔效果做出区别
                fresnel1 = lerp(fresnel1,_FresnelColor * alphaMask * fresnel1,alphaMask * _Fresnel.z);
                
                return fresnel1;
            }
            ENDHLSL
        }
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue3表格导入导出.xlsx

在这次使用时恰好整出来了,希望大家也能学习到,特此分享出来 使用前确保安装以下模块,最好全局配置element-plus ### 展示一下 ### ###导出选项 ### ###导入de数据 ### 安装的模块 npm install js-table2excel // 安装js-table2excel n…

翻译: LLMs离通用人工智能AGI有多远 20个小时学会开车 Artificial General Intelligence

AGI,即人工通用智能,是一个令人兴奋的概念。我认为围绕它的一些混淆源于“通用”这个词的使用。正如您所知,人工智能是一种通用技术,意味着它对许多不同的事情都有用。大型语言模型的崛起导致了像ChatGPT这样的单一模型可以用于许…

Java发起SOAP请求代码参考

目录 Java发起SOAP请求代码参考 代码1.组装参数2.加密参数3.发起连接4.解析返回数据 参考 文章所属专区 超链接 代码 1.组装参数 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans&qu…

AUTOSAR CanTSyn模块配置与代码实现(二)

AUTOSAR CanTSyn模块配置与代码实现 1、FUP message处理 CanTSyn_process_FUP_message 先比较和SYNC报文的Sequence是否相等&#xff0c;如果不相等则不接受该报文。 然后调用CanTSyn_unpack_store_fup处理fup报文。 获取接收到FUP时的本地时间&#xff0c;并与接收到的SYNC…

虚拟机无法进入系统问题

概述 客户在华为云平台上创建了两台虚拟机并部署aarch64 V10 OS&#xff0c;2021-10-28其中一台虚拟机业务出现异常&#xff0c;运维重启虚拟机后系统进不去&#xff0c;左上角光标闪烁&#xff0c;接着重启另一台虚拟机同样起不来&#xff0c;现象一致。 分析 通过分析现场…

天眼销使用指南

刚做销售的你&#xff0c;打电话是不是总是被客户拒决&#xff1f;要不打过去就是空号错号、找不着人&#xff1f;更甚者连客户电话都不知道&#xff1f; 如何快~速找到目标客户准确的联系方式呢&#xff1f;赶紧把这份使用指南请收好&#xff0c;客户不用愁。 1、进入【天眼…

0. Java简介与安装配置

0. Java简介与安装配置 文章目录 0. Java简介与安装配置1.1 Java简介1.2 Java特性1.2 Linux环境安装1.3 Windows环境安装1.3.1 下载JDK安装包1.3.2 安装JDK3. 配置JAVA环境4. 检验安装是否成功 1.3 开发工具参考文献 1.1 Java简介 Java是一门面向对象]编程语言&#xff0c;不仅…

部分常用算法笔记

一、简单易考 1、冒泡排序 https://www.nowcoder.com/practice/2baf799ea0594abd974d37139de27896 for i:0;i<length;i { for j:0;j<length-i-1;j { if array[j] > array[j1] { array[j1],array[j] array[j],array[j1] } } } 2、求数组最大最小值。 1&#xff09;O(…

Hudi 表类型和查询类型

数据湖hudi的表类型定义了数据在DFS上如何组织布局&#xff0c;同时实现一些timeline等操作&#xff08;表类型定定义数据是如何写入的&#xff09;&#xff1b;查询类型则是定义如何读取DFS上的数据。 Table typequery typeCopy-On-Write 快照查询&#xff1b; 增量查询&…

若依系列框架RuoYi(104集),RuoYi-Vue(121集)、RuoYi-Cloud(134集)最新完整视频.txt

若依系列框架RuoYi(104集),RuoYi-Vue&#xff08;121集&#xff09;、RuoYi-Cloud&#xff08;134集&#xff09;最新完整视频.txt

C/C++ BM1反转链表

文章目录 前言题目1.解决方案一1.1 思路阐述1.2 源码 2. 解决方案二2.1 思路阐述2.2 源码 总结 前言 这题是牛客网的BM1&#xff0c;主要涉及到链表的操作以及栈数据结构的使用。 题目 给定一个单链表的头结点pHead(该头节点是有值的&#xff0c;比如在下图&#xff0c;它的…

Arduino开发实例-液体流量测量

液体流量测量 文章目录 液体流量测量1、流量传感器介绍2、硬件准备及接线3、代码实现在本文中,将介绍如何流量传感器进行测量液体流量。 流量传感器用于测量液体流速。 市场上有不同类型的流量传感器,在本文中,我们将使用霍尔效应流量传感器。 这些类型的流量传感器是非侵入…

不是私域难做,是我们做私域的方法该换了!

最近&#xff0c;有一些声音在不断变多&#xff1a;私域越来越难做了&#xff01;许多过去做私域的成功经验&#xff0c;今天好像都不奏效了。 在业绩层面上&#xff0c;很多企业一开始还能通过大量拉新、信息轰炸这种“博概率”的方式获得销量&#xff0c;但时间一长&#xf…

Tomcat远程调试

windows环境 写一个 startup-debug.bat&#xff0c;指定tomcat的根目录&#xff0c;端口自己定义 rem *******设置Tomcat目录*******-- set CATALINE_HOMED:\asd\A8-2\tomcat d: rem 8787为可用端口,为远程调试监听端口-- cd %CATALINE_HOME%/bin set JPDA_ADDRESS8787 set J…

DriveWorks Solo捕获参数(三)

捕获参数 - 木门和矩形窗 木质门 下一个组件是木门本身。除了尺寸之外&#xff0c;门还具有需要控制的功能。 让我们首先捕获尺寸。 通过单击“捕获资源管理器”中的标题来激活“捕获的模型”部分。 双击任务窗格树中的模型木门以在 SOLIDWORKS 中将其打开。捕获以下尺寸。…

【Python目标识别】Yolo v5-7.0版本中文标签显示方法(附字体链接)

Yolo的程序之前已经定制化输出过了&#xff0c;但是最近业主突然想要中文的标签&#xff0c;所以赶紧去修改了一下源代码&#xff0c;从网上发现很多资料都改这改那&#xff0c;搞四五个文件结果还没成功。所以自己研究了一下&#xff0c;现在已经完美解决了。今天就和大家分享…

转移mysql中的数据

目录 1 mysqldump 2 将数据库中的数据转换为一个sql文件 3 执行sql文件 1 mysqldump 转移数据需要用到mysqldump。默认情况下mysqldump会自动被安装上&#xff0c;如果没有用不了&#xff0c;建议重新安装一下 参考 mysqldump 命令安装:_mob649e8162c013的技术博客_51…

0155 - Java 数组

1 数组介绍 数组可以存放多个同一类型的数据。数组也是一种数据类型&#xff0c;是引用类型。 即&#xff1a;数(数据)组(一组)就是一组数据 2 数组的使用 2.1 使用方式一 2.2 使用方式二 3 数组使用注意事项和细节 数组是多个相同类型数据的组合&#xff0c;实现对这些数据…

为你自己学laravel - 15 - model的更新和删除

为你自己学laravel。 model的部分。 这一次讲解的是model当中怎么从数据库当中更新数据和删除数据。 先从数据库当中抓出来资料。 当然我们是使用php artisan tinker进入到终端机。 我们的做法是想要将available这个栏位修改成为true。 第一种更新方法 上面我们就是修改了对…

智能优化算法应用:基于学生心理学算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于学生心理学算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于学生心理学算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.学生心理学算法4.实验参数设定5.算法…