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

文章目录

  • 前言
  • 一、我们修正一下上篇文章中,可能遗留的Bug
    • 1、N向量 变为 单位向量
    • 2、使颜色范围在合理区间
  • 二、实现菲涅尔效果强弱可自定义调节
  • 三、修改菲涅尔效果颜色
    • 1、在属性面板定义颜色属性
    • 2、在常量缓冲区申明该参数
    • 3、在片元着色器中,用颜色和菲涅尔效果相乘输出
  • 四、测试代码
    • 最终效果


前言

在上篇文章中,我们实现了 URP 下的菲涅尔基础效果,我们在这篇文章中,对其进行自定义化修改。

  • Unity中URP下的菲涅尔效果实现(URP下的法线和视线向量怎么获取)

一、我们修正一下上篇文章中,可能遗留的Bug

1、N向量 变为 单位向量

虽然我们在顶点着色器中,进行法线坐标转化时,内置进行了向量归一化。但是,顶点着色器到片元着色器会进行线性插值,可能导致归一化后的向量又有变化。所以,我们在片元着色器中对法线再进行一次归一化。

half3 N = normalize(i.normalWS);

2、使颜色范围在合理区间

  • 在上篇文章中,我们直接使用了 NdotL。但是,NdotL是可能存在负数结果的。所以,我们要对其进行处理
    请添加图片描述
  • 使用 saturate(x) 函数。当x < 0时,返回0;当x > 1时,返回1;

half NdotL = dot(N,L);
half fresnel = 1 - saturate(NdotL);


二、实现菲涅尔效果强弱可自定义调节

  • 我们可以发现,使用Pow函数,可以使我们的数值在(0,1)区间变得陡峭
    在这里插入图片描述
  • 我们在属性面板定义一个参数用于 调节pow指数

_Fresnel(“Fade(X) Intensity(Y)”,Vector) = (4,1,0,0)

这里用 x 调节 pow 指数,用 y 调节亮度

  • 在常量缓冲区CBUFFER 区间申明该参数

CBUFFER_START(UnityPerMaterial)
half4 _Fresnel;
CBUFFER_END

  • 在片元着色器,用该算法修改菲尼尔效果

half fresnel = 1 - saturate(NdotL);
half col = pow(fresnel,_Fresnel.x) * _Fresnel.y;

请添加图片描述


三、修改菲涅尔效果颜色

1、在属性面板定义颜色属性

_FresnelColor(“FresnelColor”,Color) = (0,0,0,0)

2、在常量缓冲区申明该参数

CBUFFER_START(UnityPerMaterial)
half4 _FresnelColor;
half4 _Fresnel;
CBUFFER_END

3、在片元着色器中,用颜色和菲涅尔效果相乘输出

half4 col = pow(fresnel,_Fresnel.x) * _Fresnel.y;
col *= _FresnelColor;
return col;

请添加图片描述


四、测试代码

//URP下的菲涅尔效果
Shader "MyShader/URP/P3_2_4"
{Properties{_FresnelColor("FresnelColor",Color) = (0,0,0,0)_Fresnel("Fade(X) Intensity(Y)",Vector) = (4,1,0,0)}SubShader{Tags{//告诉引擎,该Shader只用于 URP 渲染管线"RenderPipeline"="UniversalPipeline"//渲染类型"RenderType"="Opaque"//渲染队列"Queue"="Geometry"}Pass{Cull Back Blend One Zero ZTest LEqual ZWrite OnHLSLPROGRAM#pragma vertex vert#pragma fragment frag#pragma target 2.0#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{float4 vertexCS : SV_POSITION;float3 normalWS : TEXCOORD0;float3 vertexWS : TEXCOORD1;};CBUFFER_START(UnityPerMaterial)half4 _FresnelColor;half4 _Fresnel;CBUFFER_ENDVaryings vert (Attributes v){Varyings o;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 col = pow(fresnel,_Fresnel.x) * _Fresnel.y;col *= _FresnelColor;return col;}ENDHLSL}}
}

最终效果

请添加图片描述

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

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

相关文章

信息收集 - 域名

1、Whois查询: Whois 是一个用来查询域名是否已经被注册以及相关详细信息的数据库(如:域名所有人、域名注册商、域名注册日期和过期日期等)。通过访问 Whois 服务器,你可以查询域名的归属者联系方式和注册时间。 你可以在 域名Whois查询 - 站长之家 上进行在线查询。 2、…

蓝蜂网关接入天津市应急与能耗监测管理平台案例

蓝蜂网关接入天津市应急与能耗监测管理平台案例 一、应用背景 按天津市供热办要求&#xff0c;全天津市已有供热软件平台的各个热力公司必须将所采集的热源和换热站的供热监测数据和重点户的测温数据一并上传到《天津市供热应急与能耗监测管理平台》&#xff08;以下简称市管理…

C++ 开发中为什么要使用继承

为何继承 实验介绍 继承是 C++ 中的特性之一,使用继承能够有效减轻工作量,使得开发更加高效。 知识点 什么是继承为何继承继承的内容权限关键字什么是继承 生活中继承是指孩子继承父亲的财产等。C++ 使用了这一思想,却又与生活中的继承不一样。 在使用继承时,派生类是…

(8)Linux Makefile | 依赖关系,依赖方法

&#x1f4ad;前言&#xff1a; 本篇文章会着重讲解Linux中的自动化构建代码工具: make/makefile的介绍与使用。 在Linux下编译代码时,每次都会输入 gcc code.c -o code.exe在删除可执行程序时,每次都会输入 rm -rf code.exe这样非常的不方便,很麻烦,于是乎学习自动化构建代…

FFmpeg转码流程和常见概念

视频格式&#xff1a;mkv&#xff0c;flv&#xff0c;mov&#xff0c;wmv&#xff0c;avi&#xff0c;mp4&#xff0c;m3u8&#xff0c;ts等等 FFmpeg的转码工具&#xff0c;它的处理流程是这样的&#xff1a; 从输入源获得原始的音视频数据&#xff0c;解封装得到压缩封装的音…

9.鸿蒙app用户界面的跳转abilityslice的跳转

9.用户界面的跳转abilityslice的跳转&#xff0c;值传递&#xff0c;数值累加 首页页面显示1&#xff0c;第2页显示2&#xff0c;再次点击返回首页3。。。 MainAbilitySlice.java 关键代码&#xff1a; 点击事件 text.setClickedListener(new Component.ClickedListener() …

新能源充电桩测试系统

新能源充电桩测试系统是用于检测和评估新能源汽车充电设备性能的一种专用设备。随着新能源汽车的普及&#xff0c;充电桩作为其重要的配套设施&#xff0c;其性能、安全性和稳定性对于保障新能源汽车的正常运行至关重要。建立一个完善的新能源充电桩测试系统对于提高充电桩的质…

Flink系列之:监控反压

Flink系列之&#xff1a;监控反压 一、反压二、Task 性能指标三、示例四、反压状态 Flink Web 界面提供了一个选项卡来监控正在运行 jobs 的反压行为。 一、反压 如果你看到一个 task 发生 反压警告&#xff08;例如&#xff1a; High&#xff09;&#xff0c;意味着它生产数…

为什么云监控、云产品流量监控中的流量数据和DDoS防护的流量监控数据有差异?

一般情况下&#xff0c;DDoS防护的流量监控数据大于您在云监控或具体云产品数据页面看到的流量数据。 示例&#xff1a;假设您的ECS实例遭受了DDoS攻击&#xff0c;触发流量清洗&#xff0c;您收到DDoS原生防护基础版的清洗通知&#xff0c;触发清洗时的流量为2.5 Gbps。但是&…

海康视觉——当不更新拍照时,使用上一张的图像进行运算

一、需求&#xff1a; 机器需要一个功能&#xff0c;将标签贴在标签位置上 一个载具上有五个标签位&#xff0c;每个标签位只在Y轴间隔相同距离 相机只在第一个标签位才拍照&#xff0c;之后四个标签位根据第一个标签位的图像进行修正XYR后 直接移动Y轴距离就可以进行后四个…

算法设计与分析2023秋-头歌实验-实验七 动态规划

文章目录 第1关&#xff1a;数塔问题任务描述相关知识编程要求解题思路测试说明参考答案 第2关&#xff1a;最长公共子序列任务描述相关知识编程要求解题思路&#xff1a;测试说明参考答案 第3关&#xff1a;求序列-2 11 -4 13 -5 -2的最大子段和任务描述相关知识编程要求解题思…

Discord Midjourney 安装使⽤教程(AI绘画)

安装步骤: 1.注册Discord账号 2.进⼊Midjourney社区创作 3.创建⾃⼰服务器 安装教程: 1.注册Discord账号 账号注册的方式&#xff1a; 注册地址: //账号注册地址https://discord.com/ 2.进⼊Midjourney社区创作 // 邀请链接: 官方的midjourneyhttps://discord.gg/midjo…