Unity中URP下的顶点偏移

这篇具有很好参考价值的文章主要介绍了Unity中URP下的顶点偏移。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

在上篇文章中,我们实现了URP下的半透明效果。

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

在这篇文章中,我们实现一下像鬼魂一样的顶点偏移效果。


一、实现思路

在顶点着色器中,对模型本地空间坐标在转化成齐次裁剪坐标前,进行赋值修改

  • y = A sin(ωx + φ) + B

二、实现URP下的顶点偏移

1、在顶点着色器中使用正弦函数,实现左右摇摆的效果

v.vertexOS.z += sin(_Time.y);

Unity中URP下的顶点偏移,Unity,unity,游戏引擎

2、在正弦函数的传入参数中,加入一个扰度值,实现不规则的顶点偏移

这里用模型顶点本地空间下的 y 值 作为扰度值

v.vertexOS.z += sin(_Time.y + v.vertexOS.y);

Unity中URP下的顶点偏移,Unity,unity,游戏引擎

3、修改正弦函数的振幅 A,让我们的偏移程度合适

  • 在图形计算器中,看一下效果
    Unity中URP下的顶点偏移,Unity,unity,游戏引擎

v.vertexOS.z += 0.3 * sin(_Time.y + v.vertexOS.y);

Unity中URP下的顶点偏移,Unity,unity,游戏引擎

4、修改正弦函数的 ω 来调节周期,调节偏移频率

  • 在图形计算器中,看一下效果
    Unity中URP下的顶点偏移,Unity,unity,游戏引擎

v.vertexOS.z += 0.3 * sin((_Time.y + v.vertexOS.y)*6);

Unity中URP下的顶点偏移,Unity,unity,游戏引擎

5、对其 x 也做同样的偏移(该效果根据个人喜好添加)

v.vertexOS.x += 0.3 * sin((_Time.y + v.vertexOS.y)*6);

Unity中URP下的顶点偏移,Unity,unity,游戏引擎

6、在属性面板定义一个四维变量 用来控制 正弦的振幅 和 周期

_Animation(“Repeat(XY) Intensity(ZW)”,Vector) = (0,0,0,0)

  • 在顶点着色器中

v.vertexOS.z += _Animation.z * sin((_Time.y + v.vertexOS.y)_Animation.x);
v.vertexOS.x += _Animation.w * sin((_Time.y + v.vertexOS.y)
_Animation.y);

Unity中URP下的顶点偏移,Unity,unity,游戏引擎


三、测试代码

为了同时支持 Universal Render Pipeline 和 BuildIn Render Pipeline。
需要写一个同样逻辑 BRP 下的SubShader文章来源地址https://www.toymoban.com/news/detail-764967.html

//URP下的菲涅尔效果
//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)
        _Animation("Repeat(XY) Intensity(ZW)",Vector) = (0,0,0,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;
                float4 _Animation;
            CBUFFER_END

            Varyings vert(Attributes v)
            {
                Varyings o;
                o.vertexOS = v.vertexOS;
                v.vertexOS.z += _Animation.z * sin((_Time.y + v.vertexOS.y) * _Animation.x);
                v.vertexOS.x += _Animation.w * sin((_Time.y + v.vertexOS.y) * _Animation.y);
                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
        }
    }
    SubShader
    {
        Tags
        {
            //渲染类型
            "RenderType"="Transparent"
            //渲染队列
            "Queue"="Transparent"
        }
        Blend One One ZWrite On
        Pass
        {


            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

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

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

           
            half4 _FresnelColor;
            half4 _Fresnel;
            float _Offset;
            float4 _Animation;
        
            v2f vert(appdata v)
            {
                v2f o;
                o.vertexOS = v.vertexOS;
                v.vertexOS.z += _Animation.z * sin((_Time.y + v.vertexOS.y) * _Animation.x);
                v.vertexOS.x += _Animation.w * sin((_Time.y + v.vertexOS.y) * _Animation.y);
                o.vertexWS = mul(unity_ObjectToWorld,v.vertexOS);
                o.vertexCS = UnityWorldToClipPos(o.vertexWS);
                o.normalWS = UnityObjectToWorldNormal(v.normalOS);

                return o;
            }

            half4 frag(v2f 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;
            }
            ENDCG
        }
    }
}

到了这里,关于Unity中URP下的顶点偏移的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【unity shader】水体渲染基础-通过顶点偏移实现波浪

    为了表示宽广水域中的水体变化,往往需要进行水平面的整体运动变化。即对平面的顶点进行位移,以实现波浪的起伏效果。现在对于波浪的构成,如快速傅里叶变换和波浪的统计学理论,在游戏中的应用也相对完善。今天主要是做一个基础的波浪实现:正弦波形。 1.1. 基础

    2024年02月03日
    浏览(49)
  • Unity引擎修改模型顶点色的工具

    大家好,我是阿赵。   之前分享过怎样通过MaxScript在3DsMax里面修改模型的顶点色。不过由于很多时候顶点色的编辑需要根据在游戏引擎里面的实际情况和shader的情况来动态调整,所以如果能在引擎里面直接修改模型的顶点色,将会方便很多。于是我写了下面这个在Unity引擎

    2024年02月11日
    浏览(45)
  • Unity中URP下的线性雾

    在之前的文章中,我们实现了URP下的雾效支持。 Unity中URP下的添加雾效支持 在上一篇文章中,我们解析了 URP 下统一不同平台下的z值是怎么实现的 Unity中URP下统一不同平台下的z值 我们在这篇文章中,看一下Unity在URP下线性雾是怎么实现的。 主要是使用上一篇统一好的z值,来

    2024年01月19日
    浏览(36)
  • Unity中URP下的菲涅尔效果实现(URP下的法线和视线向量怎么获取)

    我们在这篇文章中,了解一下URP中Shader怎么实现菲涅尔效果,同时学习一下URP下怎么获取法线 和 视线向量。 Lambert光照模型公式: Diffuse = Ambient + Kd * LightColor * max(0,dot(N,L)) 实现灯光照射中间亮 周围暗的效果,核心是dot(N,L) Unity中Shader的Lambert光照的实现 光照效果下, 视线单

    2024年02月02日
    浏览(46)
  • Unity中URP下的SimpleLit片元着色器

    在上篇文章中,我们了解了Unity中URP下SimpleLit中的顶点着色器。 Unity中URP下的SimpleLit顶点着色器 我们在这篇文章中,来了解一下Unity中URP下SimpleLit中的片元着色器。有助于我们之后写自己的光照Shader。 这里传入参数为 顶点着色器输出的Varyings结构体 返回结果用 out修饰来代替

    2024年01月20日
    浏览(34)
  • Unity中URP下的添加雾效支持

    我们使用之前的棋盘格作为测试Shader来添加雾效。 Unity中 URP 下的棋盘格Shader #pragma multi_compile_fog float fogCoord : TEXCOORD2; o.fogCoord = ComputeFogFactor(o.vertexCS.z); col.rgb = MixFog(col,i.fogCoord);

    2024年04月25日
    浏览(34)
  • Unity中URP下的SimpleLit的 Lambert漫反射计算

    在之前的文章中,我们已经知道了 SimpleLit 下的主光数据怎么获取。 Unity中URP下获取主灯信息 Unity中ShaderGraph下获取主灯 有了这些数据,我们就可以计算 Lambert漫反射 和 BlinnPhone高光反射 了。 我们在获取了主光信息后 Light mainLight = GetMainLight1(inputData, shadowMask, aoFactor); 就来到了

    2024年01月21日
    浏览(92)
  • Unity-3DRPG游戏 学习笔记(1)--使用URP渲染管线

    教程地址: Unity2020 3DRPG游戏开发教程|Core核心功能01:Create Project 创建项目导入素材|Unity中文课堂_哔哩哔哩_bilibili 创建URP通用渲染管线(2021版本) 1. 打开:Windows--Package Manager--左上角下拉选择Unity Registry--搜索Universal RP--Install 2. Project窗口--Assets--右键Create--Rendering--URP Asstes

    2024年02月11日
    浏览(46)
  • 【Unity Shader Graph URP渲染管线下的自定义半透明效果_半透明案例分享】

    URP的渲染管线下 在项目设置里找到“Graphic” 找到URP Asset文件 索引到Renderer List文件——“ForwardRenderer” 在这个“ForwardRenderer”文件里找到“Add Renderer Feature” 添加一个渲染对象,类似下图:Render Object (Experimental) 如图设置,将“Event”设置成 AfterRenderingSkybox ,然后“Layer M

    2024年02月09日
    浏览(59)
  • Unity3D学习记录01:URP渲染管线以及3D游戏场景设置

    以下内容所使用的版本均为Unity2022.3 先在 Window-Package Manager-Unity Registry 里面搜索添加Universal RP   Unity中,创建渲染管线的方式为Asset文件夹下右键 Create-Readering-URP Asset(with Universal Asset) 会创建以下两个Pipeline:  接着在图中的设置里添加这两个渲染管线(Project Setting在Edit窗口下

    2024年02月08日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包