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 OnPass{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_ENDVaryings 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}}
}

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

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

相关文章

【大模型知识库】(5):本地环境运行dity+fastchat的BGE模型,可以使用embedding接口对知识库进行向量化,连调成功。

1,视频演示地址 2,关于 dify 项目 https://github.com/langgenius/dify/blob/main/README_CN.md Dify 是一个 LLM 应用开发平台,已经有超过 10 万个应用基于 Dify.AI 构建。它融合了 Backend as Service 和 LLMOps 的理念,涵盖…

100G云数据中心网络建设解决方案

随着数据和流量的快速增长,近年来数据中心已经进入了一个全新的100G时代。为了更高效地提供包括人工智能、虚拟现实、4K视频等在内的云计算服务,全球范围内正在大规模建设众多大型100G数据中心,如云数据中心。作为一种新型高效的基础设施&…

智能优化算法应用:基于未来搜索算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于未来搜索算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于未来搜索算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.未来搜索算法4.实验参数设定5.算法结果6.…

源码编译 METIS 以及 GKlib 在Linux ubuntu上

1. GKlib 构建 $ git clone --recursive gitgithub.com:Kleenelan/GKlib.git $ cd GKlib/ $ make config ccgcc openmpset $ make $ make install源码构建了 GKlib 的 openmp 版本,以便充分使用多核的算力; make config ccgcc openmpset 的效果图&#…

视频推拉流EasyDSS互联网直播/点播平台构建户外无人机航拍直播解决方案

一、背景分析 近几年,国内无人机市场随着航拍等业务走进大众,出现爆发式增长。无人机除了在民用方面的应用越来越多,在其他领域也已经开始广泛应用,比如公共安全、应急搜救、农林、环保、交通 、通信、气象、影视航拍等。无人机使…

八股文打卡day3——计算机网络(3)

面试题:请讲一下四次挥手的过程? 1.客户端发送FIN数据包给服务器,表示客户端不再发送数据给服务器,想要断开这个方向的连接。 2.服务器收到客户端的FIN包之后,发送ACK包给客户端,对收到的FIN包进行收到确认…

pyenv管理Python不同版本教程

pyenv管理Python不同版本教程 目录 0.前提 1.pyenv网址 2.不同系统安装pyenv 3.pyenv使用命令 4.实际的推荐 0.前提 着重理解PYENV_ROOT是啥,那么就可以随便设置python安装的路径了。 很多博客是都是官网github的readme的搬运工,本篇博客亦如此。但…

【Qt之Quick模块】2.创建Qt Quick UI工程

前言 上个文档对Qucik模块进行了概述,及创建Quick应用程序流程。 这个文档是创建Quick UI工程。 Qt Quick UI原型 Qt Quick UI原型项目对于测试或原型化用户界面非常有用,或者只是为了进行QML编辑而设置一个单独的项目。但是不能用它们进行应用程序开…

操作系统实验——移动头磁盘调度算法模拟实现与比较

1、实验目的 ​ 理解并掌握主要的移动头磁盘调度算法的基本设计思想和编程实现要旨。 2、实验内容 ​ 利用标准 C 语言,编程设计与实现关于移动头磁盘调度的先来先服务调度算法(FCFS)、最短寻道时间优先调度算法(SSTF&#xff…

基于物联网表计的综合能源管理方案——安科瑞 顾烊宇

为加快推进国家“双碳”战略和新型能源体系建设,努力实现负荷准确控制和用户精细化管理,按照“政府主导、电网组织、政企协同、用户实施”的指导原则,多地成立市/县级电力负荷管理中心,包括浙江宁波、慈溪、辽宁大连、湖南株洲、娄…

CompleteFuture与Future的比较

CompleteFuture的介绍CompleteFuture的特点CompleteFuture的应用场景CompletableFuture的优缺点Future的介绍Future的特点Future的应用场景Future的优缺点CompletableFuture和Future的区别CompletableFuture和Future的关联关系CompletableFuture和Future的使用示例CompletableF…

【Docker】Docker安装部署maven私服

文章目录 镜像拉取构建nexus实例登录maven私服如何查看实例初始化的admin密码呢?1.查看容器挂载卷2.找到nexus_nexus_data查看挂载卷详情3.查看admin账号密码4.登录并重置密码 使用nexus私服1.设置settings.xml2.设置idea pom 出现的问题小插曲 镜像拉取 docker pu…