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 官方提供的一个类似于安装仓库的功能,可以实…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
