Unity中URP下获取主灯信息
文章目录
- 前言
- 一、计算BulinnPhone的函数有两个重载
- 1、 目前最新使用的是该方法(这是我们之后主要分析的函数)
- 2、 被淘汰的老方法,需要传入一堆数据
- 二、GetMainLight
- 1、Light结构体
- 2、GetMainLight具有4个方法重载
- 3、1号重载干了什么(该函数就是获取我们主光信息的函数)
- 三、测试代码
前言
在上一篇文章中,我们大概了解了SampleLit下的片元着色器主要干了什么。
- Unity中URP下的SimpleLit片元着色器
我们在这篇文章中,来看一下计算BlinnPhone光照时,怎么获取主光的信息。
一、计算BulinnPhone的函数有两个重载
1、 目前最新使用的是该方法(这是我们之后主要分析的函数)

/// Phong lighting...half4 UniversalFragmentBlinnPhong(InputData inputData, SurfaceData surfaceData)
{#if defined(DEBUG_DISPLAY)half4 debugColor;if (CanDebugOverrideOutputColor(inputData, surfaceData, debugColor)){return debugColor;}#endifuint meshRenderingLayers = GetMeshRenderingLayer();half4 shadowMask = CalculateShadowMask(inputData);AmbientOcclusionFactor aoFactor = CreateAmbientOcclusionFactor(inputData, surfaceData);Light mainLight = GetMainLight(inputData, shadowMask, aoFactor);MixRealtimeAndBakedGI(mainLight, inputData.normalWS, inputData.bakedGI, aoFactor);inputData.bakedGI *= surfaceData.albedo;LightingData lightingData = CreateLightingData(inputData, surfaceData);
#ifdef _LIGHT_LAYERSif (IsMatchingLightLayer(mainLight.layerMask, meshRenderingLayers))
#endif{lightingData.mainLightColor += CalculateBlinnPhong(mainLight, inputData, surfaceData);}#if defined(_ADDITIONAL_LIGHTS)uint pixelLightCount = GetAdditionalLightsCount();#if USE_FORWARD_PLUSfor (uint lightIndex = 0; lightIndex < min(URP_FP_DIRECTIONAL_LIGHTS_COUNT, MAX_VISIBLE_LIGHTS); lightIndex++){FORWARD_PLUS_SUBTRACTIVE_LIGHT_CHECKLight light = GetAdditionalLight(lightIndex, inputData, shadowMask, aoFactor);
#ifdef _LIGHT_LAYERSif (IsMatchingLightLayer(light.layerMask, meshRenderingLayers))
#endif{lightingData.additionalLightsColor += CalculateBlinnPhong(light, inputData, surfaceData);}}#endifLIGHT_LOOP_BEGIN(pixelLightCount)Light light = GetAdditionalLight(lightIndex, inputData, shadowMask, aoFactor);
#ifdef _LIGHT_LAYERSif (IsMatchingLightLayer(light.layerMask, meshRenderingLayers))
#endif{lightingData.additionalLightsColor += CalculateBlinnPhong(light, inputData, surfaceData);}LIGHT_LOOP_END#endif#if defined(_ADDITIONAL_LIGHTS_VERTEX)lightingData.vertexLightingColor += inputData.vertexLighting * surfaceData.albedo;#endifreturn CalculateFinalColor(lightingData, surfaceData.alpha);
}
2、 被淘汰的老方法,需要传入一堆数据

二、GetMainLight
- 在 UniversalFragmentBlinnPhong 函数中,一开始就获取了主光的信息,这也是我们这篇文章中,主要分析的,怎么获取主光信息

1、Light结构体

其中最主要的就是:
- direction:主光线方向
- color:主光线颜色
2、GetMainLight具有4个方法重载
-
这里我们为了方便分析,分别叫他们 1号、2号、3号、4号重载
-
带参数的方法重载额外实现了 阴影衰减
-
不带参数的方法重载 主要实现了主光信息的获取

-
BulinnPhone光照计算,调用的是4号重载
-
我们按调用顺序依次展开分析
-
4号重载 调用了3号重载

-
3号重载 调用了 1号重载

-
2号 重载也调用了 1号重载(但是,我们这里没有使用到,不做分析)

-
1号重载(该函数就是获取我们主光信息的函数)

3、1号重载干了什么(该函数就是获取我们主光信息的函数)
- _MainLightPosition 获取主光线方向
light.direction = half3(_MainLightPosition.xyz);
我们输出看看效果:

- _MainLightColor 获取主光颜色
light.color = _MainLightColor.rgb;
我们输出看看效果:

- unity_LightData.z 获取光照距离衰减值
- 因为,主光线是平行灯。所以,没有距离远近的说法,这里值只有 1 和 0
// unity_LightData.z is 1 when not culled by the culling mask, otherwise 0.
//距离衰减,接收光照时为 1。剔除接收光照为 0
light.distanceAttenuation = unity_LightData.z;
- 阴影衰减预先赋值为 1,后面再做处理
light.shadowAttenuation = 1.0;
三、测试代码
// Shader targeted for low end devices. Single Pass Forward Rendering.
Shader "MyShader/URP/P4_7_3"
{// Keep properties of StandardSpecular shader for upgrade reasons.Properties{[MainTexture] _BaseMap("Base Map (RGB) Smoothness / Alpha (A)", 2D) = "white" {}[MainColor] _BaseColor("Base Color", Color) = (1, 1, 1, 1)_Cutoff("Alpha Clipping", Range(0.0, 1.0)) = 0.5_Smoothness("Smoothness", Range(0.0, 1.0)) = 0.5_SpecColor("Specular Color", Color) = (0.5, 0.5, 0.5, 0.5)_SpecGlossMap("Specular Map", 2D) = "white" {}_SmoothnessSource("Smoothness Source", Float) = 0.0_SpecularHighlights("Specular Highlights", Float) = 1.0[HideInInspector] _BumpScale("Scale", Float) = 1.0[NoScaleOffset] _BumpMap("Normal Map", 2D) = "bump" {}[HDR] _EmissionColor("Emission Color", Color) = (0,0,0)[NoScaleOffset]_EmissionMap("Emission Map", 2D) = "white" {}// Blending state_Surface("__surface", Float) = 0.0_Blend("__blend", Float) = 0.0_Cull("__cull", Float) = 2.0[ToggleUI] _AlphaClip("__clip", Float) = 0.0[HideInInspector] _SrcBlend("__src", Float) = 1.0[HideInInspector] _DstBlend("__dst", Float) = 0.0[HideInInspector] _SrcBlendAlpha("__srcA", Float) = 1.0[HideInInspector] _DstBlendAlpha("__dstA", Float) = 0.0[HideInInspector] _ZWrite("__zw", Float) = 1.0[HideInInspector] _BlendModePreserveSpecular("_BlendModePreserveSpecular", Float) = 1.0[HideInInspector] _AlphaToMask("__alphaToMask", Float) = 0.0[ToggleUI] _ReceiveShadows("Receive Shadows", Float) = 1.0// Editmode props_QueueOffset("Queue offset", Float) = 0.0// ObsoleteProperties[HideInInspector] _MainTex("BaseMap", 2D) = "white" {}[HideInInspector] _Color("Base Color", Color) = (1, 1, 1, 1)[HideInInspector] _Shininess("Smoothness", Float) = 0.0[HideInInspector] _GlossinessSource("GlossinessSource", Float) = 0.0[HideInInspector] _SpecSource("SpecularHighlights", Float) = 0.0[HideInInspector][NoScaleOffset]unity_Lightmaps("unity_Lightmaps", 2DArray) = "" {}[HideInInspector][NoScaleOffset]unity_LightmapsInd("unity_LightmapsInd", 2DArray) = "" {}[HideInInspector][NoScaleOffset]unity_ShadowMasks("unity_ShadowMasks", 2DArray) = "" {}}SubShader{Tags{"RenderType" = "Opaque""RenderPipeline" = "UniversalPipeline""UniversalMaterialType" = "SimpleLit""IgnoreProjector" = "True"}LOD 300//ForwardLitPass{Name "ForwardLit"Tags{"LightMode" = "UniversalForward"}// -------------------------------------// Render State Commands// Use same blending / depth states as Standard shaderBlend[_SrcBlend][_DstBlend], [_SrcBlendAlpha][_DstBlendAlpha]ZWrite[_ZWrite]Cull[_Cull]AlphaToMask[_AlphaToMask]HLSLPROGRAM#pragma target 2.0// -------------------------------------// Shader Stages#pragma vertex LitPassVertexSimple#pragma fragment LitPassFragmentSimple// -------------------------------------// Material Keywords#pragma shader_feature_local _NORMALMAP#pragma shader_feature_local_fragment _EMISSION#pragma shader_feature_local _RECEIVE_SHADOWS_OFF#pragma shader_feature_local_fragment _SURFACE_TYPE_TRANSPARENT#pragma shader_feature_local_fragment _ALPHATEST_ON#pragma shader_feature_local_fragment _ _ALPHAPREMULTIPLY_ON _ALPHAMODULATE_ON#pragma shader_feature_local_fragment _ _SPECGLOSSMAP _SPECULAR_COLOR#pragma shader_feature_local_fragment _GLOSSINESS_FROM_BASE_ALPHA// -------------------------------------// Universal Pipeline keywords#pragma multi_compile _ _MAIN_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE _MAIN_LIGHT_SHADOWS_SCREEN#pragma multi_compile _ _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS#pragma multi_compile _ EVALUATE_SH_MIXED EVALUATE_SH_VERTEX#pragma multi_compile _ LIGHTMAP_SHADOW_MIXING#pragma multi_compile _ SHADOWS_SHADOWMASK#pragma multi_compile _ _LIGHT_LAYERS#pragma multi_compile _ _FORWARD_PLUS#pragma multi_compile_fragment _ _ADDITIONAL_LIGHT_SHADOWS#pragma multi_compile_fragment _ _SHADOWS_SOFT#pragma multi_compile_fragment _ _SHADOWS_SOFT_LOW _SHADOWS_SOFT_MEDIUM _SHADOWS_SOFT_HIGH#pragma multi_compile_fragment _ _SCREEN_SPACE_OCCLUSION#pragma multi_compile_fragment _ _DBUFFER_MRT1 _DBUFFER_MRT2 _DBUFFER_MRT3#pragma multi_compile_fragment _ _LIGHT_COOKIES#include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/RenderingLayers.hlsl"// -------------------------------------// Unity defined keywords#pragma multi_compile _ DIRLIGHTMAP_COMBINED#pragma multi_compile _ LIGHTMAP_ON#pragma multi_compile _ DYNAMICLIGHTMAP_ON#pragma multi_compile_fog#pragma multi_compile_fragment _ DEBUG_DISPLAY#pragma multi_compile_fragment _ LOD_FADE_CROSSFADE//--------------------------------------// GPU Instancing#pragma multi_compile_instancing#pragma instancing_options renderinglayer#include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DOTS.hlsl"//--------------------------------------// Defines#define BUMP_SCALE_NOT_SUPPORTED 1// -------------------------------------// Includes#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SurfaceInput.hlsl"CBUFFER_START(UnityPerMaterial)float4 _BaseMap_ST;half4 _BaseColor;half4 _SpecColor;half4 _EmissionColor;half _Cutoff;half _Surface;CBUFFER_END#ifdef UNITY_DOTS_INSTANCING_ENABLEDUNITY_DOTS_INSTANCING_START(MaterialPropertyMetadata)UNITY_DOTS_INSTANCED_PROP(float4, _BaseColor)UNITY_DOTS_INSTANCED_PROP(float4, _SpecColor)UNITY_DOTS_INSTANCED_PROP(float4, _EmissionColor)UNITY_DOTS_INSTANCED_PROP(float , _Cutoff)UNITY_DOTS_INSTANCED_PROP(float , _Surface)UNITY_DOTS_INSTANCING_END(MaterialPropertyMetadata)static float4 unity_DOTS_Sampled_BaseColor;static float4 unity_DOTS_Sampled_SpecColor;static float4 unity_DOTS_Sampled_EmissionColor;static float unity_DOTS_Sampled_Cutoff;static float unity_DOTS_Sampled_Surface;void SetupDOTSSimpleLitMaterialPropertyCaches(){unity_DOTS_Sampled_BaseColor = UNITY_ACCESS_DOTS_INSTANCED_PROP_WITH_DEFAULT(float4 , _BaseColor);unity_DOTS_Sampled_SpecColor = UNITY_ACCESS_DOTS_INSTANCED_PROP_WITH_DEFAULT(float4 , _SpecColor);unity_DOTS_Sampled_EmissionColor = UNITY_ACCESS_DOTS_INSTANCED_PROP_WITH_DEFAULT(float4 , _EmissionColor);unity_DOTS_Sampled_Cutoff = UNITY_ACCESS_DOTS_INSTANCED_PROP_WITH_DEFAULT(float , _Cutoff);unity_DOTS_Sampled_Surface = UNITY_ACCESS_DOTS_INSTANCED_PROP_WITH_DEFAULT(float , _Surface);}#undef UNITY_SETUP_DOTS_MATERIAL_PROPERTY_CACHES#define UNITY_SETUP_DOTS_MATERIAL_PROPERTY_CACHES() SetupDOTSSimpleLitMaterialPropertyCaches()#define _BaseColor unity_DOTS_Sampled_BaseColor#define _SpecColor unity_DOTS_Sampled_SpecColor#define _EmissionColor unity_DOTS_Sampled_EmissionColor#define _Cutoff unity_DOTS_Sampled_Cutoff#define _Surface unity_DOTS_Sampled_Surface#endifTEXTURE2D(_SpecGlossMap);SAMPLER(sampler_SpecGlossMap);half4 SampleSpecularSmoothness(float2 uv, half alpha, half4 specColor,TEXTURE2D_PARAM(specMap, sampler_specMap)){half4 specularSmoothness = half4(0, 0, 0, 1);#ifdef _SPECGLOSSMAPspecularSmoothness = SAMPLE_TEXTURE2D(specMap, sampler_specMap, uv) * specColor;#elif defined(_SPECULAR_COLOR)specularSmoothness = specColor;#endif#ifdef _GLOSSINESS_FROM_BASE_ALPHAspecularSmoothness.a = alpha;#endifreturn specularSmoothness;}inline void InitializeSimpleLitSurfaceData(float2 uv, out SurfaceData outSurfaceData){outSurfaceData = (SurfaceData)0;half4 albedoAlpha = SampleAlbedoAlpha(uv, TEXTURE2D_ARGS(_BaseMap, sampler_BaseMap));outSurfaceData.alpha = albedoAlpha.a * _BaseColor.a;outSurfaceData.alpha = AlphaDiscard(outSurfaceData.alpha, _Cutoff);outSurfaceData.albedo = albedoAlpha.rgb * _BaseColor.rgb;outSurfaceData.albedo = AlphaModulate(outSurfaceData.albedo, outSurfaceData.alpha);half4 specularSmoothness = SampleSpecularSmoothness(uv, outSurfaceData.alpha, _SpecColor,TEXTURE2D_ARGS(_SpecGlossMap, sampler_SpecGlossMap));outSurfaceData.metallic = 0.0; // unusedoutSurfaceData.specular = specularSmoothness.rgb;outSurfaceData.smoothness = specularSmoothness.a;outSurfaceData.normalTS = SampleNormal(uv, TEXTURE2D_ARGS(_BumpMap, sampler_BumpMap));outSurfaceData.occlusion = 1.0;outSurfaceData.emission = SampleEmission(uv, _EmissionColor.rgb,TEXTURE2D_ARGS(_EmissionMap, sampler_EmissionMap));}#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"#if defined(LOD_FADE_CROSSFADE)#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/LODCrossFade.hlsl"#endifstruct Attributes{float4 positionOS : POSITION;float3 normalOS : NORMAL;float4 tangentOS : TANGENT;float2 texcoord : TEXCOORD0;float2 staticLightmapUV : TEXCOORD1;float2 dynamicLightmapUV : TEXCOORD2;UNITY_VERTEX_INPUT_INSTANCE_ID};struct Varyings{float2 uv : TEXCOORD0;float3 positionWS : TEXCOORD1; // xyz: posWS#ifdef _NORMALMAPhalf4 normalWS : TEXCOORD2; // xyz: normal, w: viewDir.xhalf4 tangentWS : TEXCOORD3; // xyz: tangent, w: viewDir.yhalf4 bitangentWS : TEXCOORD4; // xyz: bitangent, w: viewDir.z#elsehalf3 normalWS : TEXCOORD2;#endif#ifdef _ADDITIONAL_LIGHTS_VERTEXhalf4 fogFactorAndVertexLight : TEXCOORD5; // x: fogFactor, yzw: vertex light#elsehalf fogFactor : TEXCOORD5;#endif#if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR)float4 shadowCoord : TEXCOORD6;#endifDECLARE_LIGHTMAP_OR_SH(staticLightmapUV, vertexSH, 7);#ifdef DYNAMICLIGHTMAP_ONfloat2 dynamicLightmapUV : TEXCOORD8; // Dynamic lightmap UVs#endiffloat4 positionCS : SV_POSITION;UNITY_VERTEX_INPUT_INSTANCE_IDUNITY_VERTEX_OUTPUT_STEREO};void InitializeInputData(Varyings input, half3 normalTS, out InputData inputData){inputData = (InputData)0;inputData.positionWS = input.positionWS;#ifdef _NORMALMAPhalf3 viewDirWS = half3(input.normalWS.w, input.tangentWS.w, input.bitangentWS.w);inputData.tangentToWorld = half3x3(input.tangentWS.xyz, input.bitangentWS.xyz, input.normalWS.xyz);inputData.normalWS = TransformTangentToWorld(normalTS, inputData.tangentToWorld);#elsehalf3 viewDirWS = GetWorldSpaceNormalizeViewDir(inputData.positionWS);inputData.normalWS = input.normalWS;#endifinputData.normalWS = NormalizeNormalPerPixel(inputData.normalWS);viewDirWS = SafeNormalize(viewDirWS);inputData.viewDirectionWS = viewDirWS;#if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR)inputData.shadowCoord = input.shadowCoord;#elif defined(MAIN_LIGHT_CALCULATE_SHADOWS)inputData.shadowCoord = TransformWorldToShadowCoord(inputData.positionWS);#elseinputData.shadowCoord = float4(0, 0, 0, 0);#endif#ifdef _ADDITIONAL_LIGHTS_VERTEXinputData.fogCoord = InitializeInputDataFog(float4(inputData.positionWS, 1.0), input.fogFactorAndVertexLight.x);inputData.vertexLighting = input.fogFactorAndVertexLight.yzw;#elseinputData.fogCoord = InitializeInputDataFog(float4(inputData.positionWS, 1.0), input.fogFactor);inputData.vertexLighting = half3(0, 0, 0);#endif#if defined(DYNAMICLIGHTMAP_ON)inputData.bakedGI = SAMPLE_GI(input.staticLightmapUV, input.dynamicLightmapUV, input.vertexSH, inputData.normalWS);#elseinputData.bakedGI = SAMPLE_GI(input.staticLightmapUV, input.vertexSH, inputData.normalWS);#endifinputData.normalizedScreenSpaceUV = GetNormalizedScreenSpaceUV(input.positionCS);inputData.shadowMask = SAMPLE_SHADOWMASK(input.staticLightmapUV);#if defined(DEBUG_DISPLAY)#if defined(DYNAMICLIGHTMAP_ON)inputData.dynamicLightmapUV = input.dynamicLightmapUV.xy;#endif#if defined(LIGHTMAP_ON)inputData.staticLightmapUV = input.staticLightmapUV;#elseinputData.vertexSH = input.vertexSH;#endif#endif}///// Light Abstraction /////Light GetMainLight1(){Light light;//通过内置参数获取主光线方向light.direction = half3(_MainLightPosition.xyz);#if USE_FORWARD_PLUS#if defined(LIGHTMAP_ON) && defined(LIGHTMAP_SHADOW_MIXING)light.distanceAttenuation = _MainLightColor.a;#elselight.distanceAttenuation = 1.0;#endif#else// unity_LightData.z is 1 when not culled by the culling mask, otherwise 0.//距离衰减,接收光照时为 1。反之,为0light.distanceAttenuation = unity_LightData.z;#endiflight.shadowAttenuation = 1.0;//通过内置参数获取主光线颜色light.color = _MainLightColor.rgb;light.layerMask = _MainLightLayerMask;return light;}Light GetMainLight1(float4 shadowCoord, float3 positionWS, half4 shadowMask){Light light = GetMainLight1();light.shadowAttenuation = MainLightShadow(shadowCoord, positionWS, shadowMask,_MainLightOcclusionProbes);#if defined(_LIGHT_COOKIES)real3 cookieColor = SampleMainLightCookie(positionWS);light.color *= cookieColor;#endifreturn light;}Light GetMainLight1(InputData inputData, half4 shadowMask, AmbientOcclusionFactor aoFactor){Light light = GetMainLight1(inputData.shadowCoord, inputData.positionWS, shadowMask);#if defined(_SCREEN_SPACE_OCCLUSION) && !defined(_SURFACE_TYPE_TRANSPARENT)if (IsLightingFeatureEnabled(DEBUGLIGHTINGFEATUREFLAGS_AMBIENT_OCCLUSION)){light.color *= aoFactor.directAmbientOcclusion;}#endifreturn light;}/// Phong lighting...half4 UniversalFragmentBlinnPhong1(InputData inputData, SurfaceData surfaceData){#if defined(DEBUG_DISPLAY)half4 debugColor;if (CanDebugOverrideOutputColor(inputData, surfaceData, debugColor)){return debugColor;}#endifuint meshRenderingLayers = GetMeshRenderingLayer();half4 shadowMask = CalculateShadowMask(inputData);AmbientOcclusionFactor aoFactor = CreateAmbientOcclusionFactor(inputData, surfaceData);Light mainLight = GetMainLight1(inputData, shadowMask, aoFactor);MixRealtimeAndBakedGI(mainLight, inputData.normalWS, inputData.bakedGI, aoFactor);inputData.bakedGI *= surfaceData.albedo;LightingData lightingData = CreateLightingData(inputData, surfaceData);#ifdef _LIGHT_LAYERSif (IsMatchingLightLayer(mainLight.layerMask, meshRenderingLayers))#endif{lightingData.mainLightColor += CalculateBlinnPhong(mainLight, inputData, surfaceData);}#if defined(_ADDITIONAL_LIGHTS)uint pixelLightCount = GetAdditionalLightsCount();#if USE_FORWARD_PLUSfor (uint lightIndex = 0; lightIndex < min(URP_FP_DIRECTIONAL_LIGHTS_COUNT, MAX_VISIBLE_LIGHTS); lightIndex++){FORWARD_PLUS_SUBTRACTIVE_LIGHT_CHECKLight light = GetAdditionalLight(lightIndex, inputData, shadowMask, aoFactor);#ifdef _LIGHT_LAYERSif (IsMatchingLightLayer(light.layerMask, meshRenderingLayers))#endif{lightingData.additionalLightsColor += CalculateBlinnPhong(light, inputData, surfaceData);}}#endifLIGHT_LOOP_BEGIN(pixelLightCount)Light light = GetAdditionalLight(lightIndex, inputData, shadowMask, aoFactor);#ifdef _LIGHT_LAYERSif (IsMatchingLightLayer(light.layerMask, meshRenderingLayers))#endif{lightingData.additionalLightsColor += CalculateBlinnPhong(light, inputData, surfaceData);}LIGHT_LOOP_END#endif#if defined(_ADDITIONAL_LIGHTS_VERTEX)lightingData.vertexLightingColor += inputData.vertexLighting * surfaceData.albedo;#endifreturn CalculateFinalColor(lightingData, surfaceData.alpha);}///// Vertex and Fragment functions /////// Used in Standard (Simple Lighting) shaderVaryings LitPassVertexSimple(Attributes input){Varyings output = (Varyings)0;UNITY_SETUP_INSTANCE_ID(input);UNITY_TRANSFER_INSTANCE_ID(input, output);UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);VertexPositionInputs vertexInput = GetVertexPositionInputs(input.positionOS.xyz);VertexNormalInputs normalInput = GetVertexNormalInputs(input.normalOS, input.tangentOS);#if defined(_FOG_FRAGMENT)half fogFactor = 0;#elsehalf fogFactor = ComputeFogFactor(vertexInput.positionCS.z);#endifoutput.uv = TRANSFORM_TEX(input.texcoord, _BaseMap);output.positionWS.xyz = vertexInput.positionWS;output.positionCS = vertexInput.positionCS;#ifdef _NORMALMAPhalf3 viewDirWS = GetWorldSpaceViewDir(vertexInput.positionWS);output.normalWS = half4(normalInput.normalWS, viewDirWS.x);output.tangentWS = half4(normalInput.tangentWS, viewDirWS.y);output.bitangentWS = half4(normalInput.bitangentWS, viewDirWS.z);#elseoutput.normalWS = NormalizeNormalPerVertex(normalInput.normalWS);#endifOUTPUT_LIGHTMAP_UV(input.staticLightmapUV, unity_LightmapST, output.staticLightmapUV);#ifdef DYNAMICLIGHTMAP_ONoutput.dynamicLightmapUV = input.dynamicLightmapUV.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;#endifOUTPUT_SH(output.normalWS.xyz, output.vertexSH);#ifdef _ADDITIONAL_LIGHTS_VERTEXhalf3 vertexLight = VertexLighting(vertexInput.positionWS, normalInput.normalWS);output.fogFactorAndVertexLight = half4(fogFactor, vertexLight);#elseoutput.fogFactor = fogFactor;#endif#if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR)output.shadowCoord = GetShadowCoord(vertexInput);#endifreturn output;}// Used for StandardSimpleLighting shadervoid LitPassFragmentSimple(Varyings input, out half4 outColor : SV_Target0#ifdef _WRITE_RENDERING_LAYERS, out float4 outRenderingLayers : SV_Target1#endif){UNITY_SETUP_INSTANCE_ID(input);UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);SurfaceData surfaceData;InitializeSimpleLitSurfaceData(input.uv, surfaceData);#ifdef LOD_FADE_CROSSFADELODFadeCrossFade(input.positionCS);#endifInputData inputData;InitializeInputData(input, surfaceData.normalTS, inputData);SETUP_DEBUG_TEXTURE_DATA(inputData, input.uv, _BaseMap);#ifdef _DBUFFERApplyDecalToSurfaceData(input.positionCS, surfaceData, inputData);#endifhalf4 color = UniversalFragmentBlinnPhong1(inputData, surfaceData);outColor = color;color.rgb = MixFog(color.rgb, inputData.fogCoord);color.a = OutputAlpha(color.a, IsSurfaceTypeTransparent(_Surface));outColor = color;#ifdef _WRITE_RENDERING_LAYERSuint renderingLayers = GetMeshRenderingLayer();outRenderingLayers = float4(EncodeMeshRenderingLayer(renderingLayers), 0, 0, 0);#endif}ENDHLSL}//ShadowCasterPass{Name "ShadowCaster"Tags{"LightMode" = "ShadowCaster"}// -------------------------------------// Render State CommandsZWrite OnZTest LEqualColorMask 0Cull[_Cull]HLSLPROGRAM#pragma target 2.0// -------------------------------------// Shader Stages#pragma vertex ShadowPassVertex#pragma fragment ShadowPassFragment// -------------------------------------// Material Keywords#pragma shader_feature_local_fragment _ALPHATEST_ON#pragma shader_feature_local_fragment _GLOSSINESS_FROM_BASE_ALPHA// -------------------------------------// Unity defined keywords#pragma multi_compile_fragment _ LOD_FADE_CROSSFADE//--------------------------------------// GPU Instancing#pragma multi_compile_instancing#include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DOTS.hlsl"// This is used during shadow map generation to differentiate between directional and punctual light shadows, as they use different formulas to apply Normal Bias#pragma multi_compile_vertex _ _CASTING_PUNCTUAL_LIGHT_SHADOW// -------------------------------------// Includes#include "Packages/com.unity.render-pipelines.universal/Shaders/SimpleLitInput.hlsl"#include "Packages/com.unity.render-pipelines.universal/Shaders/ShadowCasterPass.hlsl"ENDHLSL}//GBufferPass{Name "GBuffer"Tags{"LightMode" = "UniversalGBuffer"}// -------------------------------------// Render State CommandsZWrite[_ZWrite]ZTest LEqualCull[_Cull]HLSLPROGRAM#pragma target 4.5// Deferred Rendering Path does not support the OpenGL-based graphics API:// Desktop OpenGL, OpenGL ES 3.0, WebGL 2.0.#pragma exclude_renderers gles3 glcore// -------------------------------------// Shader Stages#pragma vertex LitPassVertexSimple#pragma fragment LitPassFragmentSimple// -------------------------------------// Material Keywords#pragma shader_feature_local_fragment _ALPHATEST_ON//#pragma shader_feature _ALPHAPREMULTIPLY_ON#pragma shader_feature_local_fragment _ _SPECGLOSSMAP _SPECULAR_COLOR#pragma shader_feature_local_fragment _GLOSSINESS_FROM_BASE_ALPHA#pragma shader_feature_local _NORMALMAP#pragma shader_feature_local_fragment _EMISSION#pragma shader_feature_local _RECEIVE_SHADOWS_OFF// -------------------------------------// Universal Pipeline keywords#pragma multi_compile _ _MAIN_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE _MAIN_LIGHT_SHADOWS_SCREEN//#pragma multi_compile _ _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS//#pragma multi_compile _ _ADDITIONAL_LIGHT_SHADOWS#pragma multi_compile_fragment _ _SHADOWS_SOFT#pragma multi_compile_fragment _ _SHADOWS_SOFT_LOW _SHADOWS_SOFT_MEDIUM _SHADOWS_SOFT_HIGH#pragma multi_compile_fragment _ _DBUFFER_MRT1 _DBUFFER_MRT2 _DBUFFER_MRT3#include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/RenderingLayers.hlsl"// -------------------------------------// Unity defined keywords#pragma multi_compile _ DIRLIGHTMAP_COMBINED#pragma multi_compile _ LIGHTMAP_ON#pragma multi_compile _ DYNAMICLIGHTMAP_ON#pragma multi_compile _ LIGHTMAP_SHADOW_MIXING#pragma multi_compile _ SHADOWS_SHADOWMASK#pragma multi_compile_fragment _ _GBUFFER_NORMALS_OCT#pragma multi_compile_fragment _ _RENDER_PASS_ENABLED#pragma multi_compile_fragment _ LOD_FADE_CROSSFADE//--------------------------------------// GPU Instancing#pragma multi_compile_instancing#pragma instancing_options renderinglayer#include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DOTS.hlsl"//--------------------------------------// Defines#define BUMP_SCALE_NOT_SUPPORTED 1// -------------------------------------// Includes#include "Packages/com.unity.render-pipelines.universal/Shaders/SimpleLitInput.hlsl"#include "Packages/com.unity.render-pipelines.universal/Shaders/SimpleLitGBufferPass.hlsl"ENDHLSL}//DepthOnlyPass{Name "DepthOnly"Tags{"LightMode" = "DepthOnly"}// -------------------------------------// Render State CommandsZWrite OnColorMask RCull[_Cull]HLSLPROGRAM#pragma target 2.0// -------------------------------------// Shader Stages#pragma vertex DepthOnlyVertex#pragma fragment DepthOnlyFragment// -------------------------------------// Material Keywords#pragma shader_feature_local_fragment _ALPHATEST_ON#pragma shader_feature_local_fragment _GLOSSINESS_FROM_BASE_ALPHA// -------------------------------------// Unity defined keywords#pragma multi_compile_fragment _ LOD_FADE_CROSSFADE//--------------------------------------// GPU Instancing#pragma multi_compile_instancing#include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DOTS.hlsl"// -------------------------------------// Includes#include "Packages/com.unity.render-pipelines.universal/Shaders/SimpleLitInput.hlsl"#include "Packages/com.unity.render-pipelines.universal/Shaders/DepthOnlyPass.hlsl"ENDHLSL}// This pass is used when drawing to a _CameraNormalsTexture texturePass{Name "DepthNormals"Tags{"LightMode" = "DepthNormals"}// -------------------------------------// Render State CommandsZWrite OnCull[_Cull]HLSLPROGRAM#pragma target 2.0// -------------------------------------// Shader Stages#pragma vertex DepthNormalsVertex#pragma fragment DepthNormalsFragment// -------------------------------------// Material Keywords#pragma shader_feature_local _NORMALMAP#pragma shader_feature_local_fragment _ALPHATEST_ON#pragma shader_feature_local_fragment _GLOSSINESS_FROM_BASE_ALPHA// -------------------------------------// Unity defined keywords#pragma multi_compile_fragment _ LOD_FADE_CROSSFADE// Universal Pipeline keywords#include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/RenderingLayers.hlsl"//--------------------------------------// GPU Instancing#pragma multi_compile_instancing#include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DOTS.hlsl"// -------------------------------------// Includes#include "Packages/com.unity.render-pipelines.universal/Shaders/SimpleLitInput.hlsl"#include "Packages/com.unity.render-pipelines.universal/Shaders/SimpleLitDepthNormalsPass.hlsl"ENDHLSL}// This pass it not used during regular rendering, only for lightmap baking.Pass{Name "Meta"Tags{"LightMode" = "Meta"}// -------------------------------------// Render State CommandsCull OffHLSLPROGRAM#pragma target 2.0// -------------------------------------// Shader Stages#pragma vertex UniversalVertexMeta#pragma fragment UniversalFragmentMetaSimple// -------------------------------------// Material Keywords#pragma shader_feature_local_fragment _EMISSION#pragma shader_feature_local_fragment _SPECGLOSSMAP#pragma shader_feature EDITOR_VISUALIZATION// -------------------------------------// Includes#include "Packages/com.unity.render-pipelines.universal/Shaders/SimpleLitInput.hlsl"#include "Packages/com.unity.render-pipelines.universal/Shaders/SimpleLitMetaPass.hlsl"ENDHLSL}//Universal2DPass{Name "Universal2D"Tags{"LightMode" = "Universal2D""RenderType" = "Transparent""Queue" = "Transparent"}HLSLPROGRAM#pragma target 2.0// -------------------------------------// Shader Stages#pragma vertex vert#pragma fragment frag// -------------------------------------// Material Keywords#pragma shader_feature_local_fragment _ALPHATEST_ON#pragma shader_feature_local_fragment _ALPHAPREMULTIPLY_ON// -------------------------------------// Includes#include "Packages/com.unity.render-pipelines.universal/Shaders/SimpleLitInput.hlsl"#include "Packages/com.unity.render-pipelines.universal/Shaders/Utils/Universal2D.hlsl"ENDHLSL}}Fallback "Hidden/Universal Render Pipeline/FallbackError"CustomEditor "UnityEditor.Rendering.Universal.ShaderGUI.SimpleLitShader"
}
相关文章:
Unity中URP下获取主灯信息
文章目录 前言一、计算BulinnPhone的函数有两个重载1、 目前最新使用的是该方法(这是我们之后主要分析的函数)2、 被淘汰的老方法,需要传入一堆数据 二、GetMainLight1、Light结构体2、GetMainLight具有4个方法重载3、1号重载干了什么&#x…...
尝试着在Stable Diffusion里边使用SadTalker进行数字人制作
首先需要标明的是,我这里是图片说话类型,而且是看了知识星球AI破局俱乐部大航海数字人手册进行操作的。写下这篇文章是防止我以后遗忘。 我使用的基础软件是Stable Diffusion,SadTalker是作为插件放进来的,需要注意的是这对自己的…...
链路聚合原理与配置
链路聚合原理 随着网络规模不断扩大,用户对骨干链路的带宽和可靠性提出了越来越高的要求。在传统技术中,常用更换高速率的接口板或更换支持高速率接口板的设备的方式来增加带宽,但这种方案需要付出高额的费用,而且不够灵活。采用…...
第8章 通信网络安全
文章目录 8.1 信息系统安全概述8.1.1 信息系统的构成和分类8.1.2 信息系统安全1、信息系统中的安全概念2、信息系统安全问题的发展演变3、信息系统的安全结构 8.1.3 信息系统的安全保护等级1.TCSEC(可信计算机系统评估准则)2. 我国信息安全标准 8.1.4 通…...
L1-092 进化论(Java)
在“一年一度喜剧大赛”上有一部作品《进化论》,讲的是动物园两只猩猩进化的故事。猩猩吕严说自己已经进化了 9 年了,因为“三年又三年”。猩猩土豆指出“三年又三年是六年呐”…… 本题给定两个数字,以及用这两个数字计算的结果,…...
SpringBoot 源码解析5:ConfigurationClassPostProcessor整体流程和@ComponentScan源码分析
SpringBoot 源码解析5:ConfigurationClassPostProcessor整体流程和ComponentScan源码分析 1. 知道以下几点,读ConfigurationClassPostProcessor源码会更轻松2. 源码解析 ConfigurationClassPostProcessor#postProcessBeanDefinitionRegistry2.1 Configur…...
一.初识Linux 1-3操作系统概述Linux初识虚拟机介绍
目录 一.初识Linux 1.操作系统概述 计算机组成 硬件: 软件: 操作系统: 操作系统工作流程 操作系统作用 常见的操作系统 PC端: 移动端:(掌上操作系统) 一.初识Linux 2.Linux初识 linu…...
Eureka整合seata分布式事务
文章目录 一、分布式事务存在的问题二、分布式事务理论三、认识SeataSeata分布式事务解决方案1、XA模式2、AT模式3、SAGA模式4.SAGA模式优缺点:5.四种模式对比 四、微服务整合Seata AT案例Seata配置微服务整合2.1、父工程项目创建引入依赖 2.2、Eureka集群搭建2.3、…...
华为云磁盘性能指标(参考)
MD[华为云磁盘性能指标(参考)] 云硬盘(Elastic Volume Service, EVS) 根据性能,磁盘可分为极速型SSD V2、极速型SSD、通用型SSD V2、超高IO、通用型SSD、高IO、普通IO。 性能指标(参考),测速说明:操作系统-windows …...
利用OpenGL图形库实现人物动画移动效果
使用OpenGL库实现人物动画移动效果需要涉及到更复杂的图形编程和事件处理。以下是一个简单的例子,使用OpenGL和GLUT库实现人物的基本动画移动效果。 确保你已经安装了OpenGL和GLUT。你可以使用包管理器或者从官方网站下载并安装。 一、如果你已经安装过了OpenGL和…...
History命令解释,及一个相关的bash脚本(如何编写脚本程序从记录文件中提取history命令)
目 录 一、history命令介绍 1、history命令是什么? 2、history的主要功能 二、history命令的用法 1、语法 2、选项说明 3、命令实例 三、history和历史记录文件bash_history 四、history命令的相关配置 1,命令带时间展示-HISTTI…...
apisix 单机部署 linux
安装etcd: cd /home/app rz tar -zxvf etcd-v3.5.4-linux-amd64.tar.gz cd etcd-v3.5.4-linux-amd64 vim start.sh内容: #!/bin/sh nohup etcd --name infra0 --initial-advertise-peer-urls http://127.0.0.1:2380 \--listen-peer-urls http://127.0.…...
Redis 面试题 | 06.精选Redis高频面试题
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…...
2008年苏州大学837复试机试C/C++
2008年苏州大学复试机试 题目 编写程序充成以下功能: 一、从键盘上输入随机变量x的 10个取样点。X0,X1—X9 的值; 1、计算样本平均值 2、判定x是否为等差数列 3、用以下公式计算z的值(t0.63) 注。请对程序中必要地方进行注释 补充:个人觉得这个题目回忆…...
MySQL笔记-information_schema库中COLUMNS表的一些笔记
mysql建表中可以添加comment,也就是注释,这些注释会写到information_schema库的COLUMNS表中,可以使用如下SQL语句进行查询: SELECT COLUMN_NAME, COLUMN_COMMENT FROM information_schema.COLUMNS WHERE TABLE_SCHEMA your_data…...
归并排序模板
模板在文末,以下步骤方便理解记忆。 先贴一张快速排序模板步骤,用于对比记忆 归并排序步骤: (0)如果数组左边界L ≥ 数组右边界,则不需要排序,直接return。 (1)直接取…...
【NVIDIA】Jetson Orin Nano系列:安装 Qt6、firefox、jtop、flameshot
1、使用命令安装 sudo apt install qtcreator sudo apt install qt6-* sudo apt install libqt6* sudo apt install qml-qt6 sudo apt install qmlscene-qt6 sudo apt install assistant-qt6 sudo apt install designer-qt62、启动 qtcreator 3、常用工具安装 sudo apt in…...
Fastapi+Jsonp实现前后端跨域请求
文章目录 一、实现方法1.后端部分【Fastapi】2.前端部分【JS】二、测试一、实现方法 1.后端部分【Fastapi】 # coding:utf-8import json from fastapi import FastAPI, Response from fastapi.middleware.cors import CORSMiddlewareapp = FastAPI(...
MacOS受欢迎的数据库开发工具 Navicat Premium 15 中文版
Navicat Premium 15 Mac是一款数据库管理工具,提供了一个全面的解决方案,用于连接、管理和维护各种数据库系统。以下是Navicat Premium 15 Mac的一些主要功能和特点: 软件下载:Navicat Premium 15 中文版下载 多平台支持ÿ…...
helm---自动化一键部署
什么是helm?? 在没有这个helm之前,deployment service ingress helm的作用就是通过打包的方式,把deployment service ingress 这些打包在一块,一键式部署服务,类似于yum 官方提供的一个类似于安装仓库的功能,可以实…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...
并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...
宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...
