U3D/URP/兰伯特和半兰伯特漫反射光照/shader

news/2025/3/31 10:28:18/

1. 实现效果

lambert:

halfLambert:

 

2. 代码块

Shader "Unlit/diffusion"
{Properties{_MainTex ("Texture", 2D) = "white" {}_Color("Base Color", color) = (1.0, 1.0, 1.0, 1.0)[Toggle(_LAMBERT_LIGHTS)]_DiffusionLights0("DiffusionModle = Lambert", float)=1.0[Toggle(_HALFLAMBERT_LIGHTS)]_DiffusionLights1("DiffusionModle = HalfLambert", float)=0.0}SubShader{Tags{"RenderPipeLine" = "UniversalRenderPipeline""RenderType" = "Opaque"}Pass{Tags{"LightMode" = "UniversalForward"}HLSLPROGRAM#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"#pragma vertex vert#pragma fragment frag#pragma shader_feature _LAMBERT_LIGHTS#pragma shader_feature _HALFLAMBERT_LIGHTS//定义属性CBUFFER_START(UnityPerMaterial)uniform float3 _Color;CBUFFER_ENDuniform TEXTURE2D(_MainTex);uniform SAMPLER(sampler_MainTex);//顶点着色器输入struct VertexInput{float4 positionOS   :   POSITION;float3 normalOS     :   NORMAL;float2 uv           :   TEXCOORD0;};//顶点着色器输出struct VertexOutput{float4 positionCS   :   SV_POSITION;float3 normalWS     :   TEXCOORD0;float2 uv0          :   TEXCOORD1;float3 positionWS   :   TEXCOORD2;};struct objectData{Light light;float3 positionWS;float3 nDirWS;float2 uv;};half3 CalculateLight(objectData od){//获取贴图half3 var_mainTex = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, od.uv);//获取光源方向信息float3 lDir = od.light.direction;//获取法线信息float3 nDirWS = od.nDirWS;//准备点乘信息float ndotl = dot(nDirWS, lDir);float diffusion = 0.0;//光照模型#if _LAMBERT_LIGHTSdiffusion = max(0.0, ndotl); //lanbert#elif _HALFLAMBERT_LIGHTSdiffusion = ndotl * 0.5 + 0.5;   //halflambert#endifhalf3 finalCol = var_mainTex * diffusion * od.light.color * _Color;return finalCol;}//顶点着色VertexOutput vert(VertexInput v){VertexOutput o;o.positionCS = TransformObjectToHClip(v.positionOS.xyz);o.normalWS = TransformObjectToWorldNormal(v.normalOS);o.positionWS = TransformObjectToWorld(v.positionOS);o.uv0 = v.uv;return o;}//像素着色器half4 frag(VertexOutput i):SV_TARGET{Light light = GetMainLight();//构建结构体接受数据objectData ObjectData;ObjectData.light = light;ObjectData.nDirWS = i.normalWS;ObjectData.uv = i.uv0;//调用函数计算主光源half3 finalCol = CalculateLight(ObjectData);//计算次光源//获取场景中灯源数量int lightsCount = GetAdditionalLightsCount();for(int t = 0; t < lightsCount; t++){//调用不同光照Light light = GetAdditionalLight(t, i.positionWS);objectData AdditionalObjectData;AdditionalObjectData.light = light;AdditionalObjectData.nDirWS = i.normalWS;AdditionalObjectData.uv = i.uv0;finalCol += CalculateLight(AdditionalObjectData);}return half4(finalCol, 1.0);}ENDHLSL}}
}

3. 切换光照模型

勾选不同选项即可

 


http://www.ppmy.cn/news/946287.html

相关文章

贴膜换座椅铺地胶 汽车装饰三大注意事项

1. 贴太阳膜最大的问题在于施工 质量好的太阳膜能起到隔热效果。许多车主拿到新车&#xff0c;首先想到的是为爱车贴膜。不过&#xff0c;大部分人关心膜的价格&#xff0c;贴膜的质量如何却往往被忽视。专家支招&#xff1a;选择授权施工店。现在市场最普遍的太阳膜全车贴…

毫米波雷达IWR1843开箱演示

实物展示 IWR1843雷达板如下图所示&#xff0c; 支架四个&#xff0c;三对螺丝螺帽&#xff08;实际上只需两对&#xff0c;留一对冗余&#xff09;&#xff1b;USB数据线&#xff1b;缺少5V电源线&#xff08;手动焊接&#x1f612;&#xff09;。 文章目录 实物展示需要下载…

雷达天线简介

天线是雷达与外界联系的部分。它实现多种目的&#xff1a; (1)发射时集中能量&#xff0c;即有定向性并具有窄波束宽度&#xff1b; (2)收集来自目标的回波能量&#xff1b; (3)提供目标角位置测量&#xff1b; (4)提供角度上分辨(或分离)目标的空间分辨率&#xff1b; (5)观测…

毫米波雷达 ti awr2243 天线通道校准方法

为什么要校准&#xff1f; 级联芯片之间的工艺差异各天线通道之间的增益差异温度偏移天线之间的耦合以及天线罩的影响等 数据处理层面的校准方法&#xff1a; ti awr2243使用的是4片级联方案&#xff0c;4个三发四收雷达板&#xff0c;总共12个发射天线16个接收天线&#xf…

4D毫米波雷达天线设计

本篇主要讨论4D雷达天线阵列设计。4D毫米波雷达天线并不是说这个天线有4个维度,而是从目标特性的角度讲,被探测的目标有物理空间3个维度+频谱1个维度的特性。 而与天线设计有关的是方位向和俯仰向,以前的3D车载雷达是没有俯仰向的,所以4D比3D多的是俯仰向的信息。 车载毫米…

毫米波雷达AWR1843BOOST辅助停车案例

一、设备需求 硬件&#xff1a;AWR1843BOOST开发板 micro USB线一根 5V/2.5A&#xff08;电流要求不小于2.5A&#xff09;电源适配器1个 软件&#xff1a; 1.mmwave Automotive Toolbox&#xff08;v2.4.5以上&#xff09; 下载地址&#xff1a;&#xff08;使用谷歌浏览器打…

Chief Ray and Margin Ray and Principle Ray(主光线和边缘光线)

Chief Ray and Margin Ray Chief Ray and Principle Ray(主光线)Margin Ray(边缘光线)Chief Ray and Principle Ray(主光线) 定义:在没有渐晕和像差的系统中,主光线被定义为从特定场点传播的射线,通过入射光瞳的中心到达像面。此时,因为我们设定系统没有渐晕和像差,…

Revit中如何创建水的效果及基坑?

一、Revit中如何创建水的效果? 我们在创建建筑的时候会遇上小池塘啊小池子之类的装饰景观&#xff0c;Revit又不像专业的3D软件那样可以有非常真实的水的效果&#xff0c;那么我们该如何简单创建水呢?下面来看步骤&#xff1a; 1、 在水池位置创建一块楼板&#xff0c;并将该…