URP学习之基础的法线采样

URP学习之基础的法线采样

Shader "Custom/Normal"
{
    Properties
    {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        [Normal]_MainNorTex("Normal",2D) = "Bump"{}
        _BaseColor ("BaseColor", Color) = (1,1,1,1)
    }
    SubShader
    {
        Tags { 
            "RenderPipeline"="UniversalRenderPipline"
            "RenderType"="Opaque" 
        }
        HLSLINCLUDE
        #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
        #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"
        
        CBUFFER_START(UnityMaterial)
        float4 _MainTex_ST;
        float4 _BaseColor;
        CBUFFER_END


        //定义和采样贴图
        TEXTURE2D (_MainTex);
        SAMPLER(sampler_MainTex);
        float4 MainTex (float2 uv)
        {
            return SAMPLE_TEXTURE2D(_MainTex,sampler_MainTex,uv);
        }
        

        TEXTURE2D(_MainNorTex);
        SAMPLER(sampler_MainNorTex);
        float3 NorTex(float2 uv)
        {
            return UnpackNormal(SAMPLE_TEXTURE2D(_MainNorTex,sampler_MainNorTex,uv));
        }
        //定义和采样贴图结束




        struct appdata
        {
            float4 vertex:POSITION;
            float4 normal:NORMAL;
            float4 tangent:TANGENT;
            float2 uv : TEXCOORD0;
        };

        struct v2f
        {
            float4 vertex:SV_POSITION;
            float3 normal:NORMAL;
            float3 tangent:TANGENT;
            float2 uv:TEXCOORD0;
            float3 Btangent:TEXCOORD1;
            float3 NdotL:TEXCOORD2;
        };


        ENDHLSL
        pass{

            HLSLPROGRAM
            #pragma vertex VERT
            #pragma fragment FRAG

            v2f VERT( appdata i)
            {
                v2f o;
                o.vertex = TransformObjectToHClip(i.vertex.xyz);
                
                o.tangent = normalize(TransformObjectToWorld(i.tangent.xyz));
                o.normal = normalize(TransformObjectToWorldNormal(i.normal.xyz));
                //副切线获取途径      cross(法线,切线) * 切线.w
                o.Btangent= cross(o.normal.xyz,o.tangent.xyz) * i.tangent.w;
                
                
                o.uv = i.uv;
                return o;
            }

            float4 FRAG(v2f i):SV_TARGET
            {
                //引入采样好的贴图生成变量
                float4 var_MainTex = MainTex (i.uv);
                float3 var_MainNorTex = NorTex(i.uv);

                //制作TBN矩阵
                float3x3 TBN = float3x3(i.tangent,i.Btangent,i.normal);
                //利用TBN矩阵变换法线空间
                float3 nDirWS = normalize(mul(var_MainNorTex,TBN));
                //获取主灯光函数
                Light MainLight = GetMainLight();
                //法线Dot灯光
                float NdotL = (dot(nDirWS,MainLight.direction.xyz))*0.5+0.5;

                return NdotL.xxxx*var_MainTex * MainLight.color.rgbb;

            }

            ENDHLSL 
        }
    }
    //    FallBack "Diffuse"
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值