买一个成品网站多少钱,深圳华南城网站建设,做商城网站产品怎么分布,织梦做音乐网站文章目录 前言一、我们先来看一下 SimpleLit 中的调用二、获取额外灯索引1、非移动平台2、非GLES平台3、大多数平台 三、获取额外灯数据 前言
在上一篇文章中#xff0c;我们知道了URP下是怎么获取额外灯数量的。
Unity中URP下获取额外灯数量
在这篇文章中#xff0c;我们… 文章目录 前言一、我们先来看一下 SimpleLit 中的调用二、获取额外灯索引1、非移动平台2、非GLES平台3、大多数平台 三、获取额外灯数据 前言
在上一篇文章中我们知道了URP下是怎么获取额外灯数量的。
Unity中URP下获取额外灯数量
在这篇文章中我们来了解一下怎么获取每一盏额外灯的数据。 一、我们先来看一下 SimpleLit 中的调用
SimpleLit中调用了 GetAdditionalLight 该函数有三个重载我们分别称为1号、2号、3号重载方便后面区分 3号调用了2号 读源码后可知Unity在获取额外灯信息前。获取了额外灯索引。 所以我们也分成两步来分析获取额外灯索引、获取索引对应的额外灯信息。 二、获取额外灯索引 这里我们主要只是看一下在Shader种并不会去做修改。 正常情况下我们通过 GetPerObjectLightIndex 函数获取额外灯索引 GetPerObjectLightIndex主要分为3种情况。
1、非移动平台 2、非GLES平台 3、大多数平台 三、获取额外灯数据
获取额外灯的数据使用了 GetAdditionalPerObjectLight 函数 这是该函数的主要内容我们接下来分析一下该函数干了什么
// Fills a light struct given a perObjectLightIndex
Light GetAdditionalPerObjectLight(int perObjectLightIndex, float3 positionWS)
{// Abstraction over Light input constants
#if USE_STRUCTURED_BUFFER_FOR_LIGHT_DATAfloat4 lightPositionWS _AdditionalLightsBuffer[perObjectLightIndex].position;half3 color _AdditionalLightsBuffer[perObjectLightIndex].color.rgb;half4 distanceAndSpotAttenuation _AdditionalLightsBuffer[perObjectLightIndex].attenuation;half4 spotDirection _AdditionalLightsBuffer[perObjectLightIndex].spotDirection;uint lightLayerMask _AdditionalLightsBuffer[perObjectLightIndex].layerMask;
#elsefloat4 lightPositionWS _AdditionalLightsPosition[perObjectLightIndex];half3 color _AdditionalLightsColor[perObjectLightIndex].rgb;half4 distanceAndSpotAttenuation _AdditionalLightsAttenuation[perObjectLightIndex];half4 spotDirection _AdditionalLightsSpotDir[perObjectLightIndex];uint lightLayerMask asuint(_AdditionalLightsLayerMasks[perObjectLightIndex]);
#endif// Directional lights store direction in lightPosition.xyz and have .w set to 0.0.// This way the following code will work for both directional and punctual lights.float3 lightVector lightPositionWS.xyz - positionWS * lightPositionWS.w;float distanceSqr max(dot(lightVector, lightVector), HALF_MIN);half3 lightDirection half3(lightVector * rsqrt(distanceSqr));// full-float precision required on some platformsfloat attenuation DistanceAttenuation(distanceSqr, distanceAndSpotAttenuation.xy) * AngleAttenuation(spotDirection.xyz, lightDirection, distanceAndSpotAttenuation.zw);Light light;light.direction lightDirection;light.distanceAttenuation attenuation;light.shadowAttenuation 1.0; // This value can later be overridden in GetAdditionalLight(uint i, float3 positionWS, half4 shadowMask)light.color color;light.layerMask lightLayerMask;return light;
}按照是否是移动平台根据之前的计算的索引 获取到了额外光的主要数据 lightPositionWS额外灯在世界空间下的坐标 color额外灯颜色 distanceAndSpotAttenuation距离衰减 spotDirection距离衰减方向 有了这写数据就可以计算额外灯的方向、距离衰减和角度衰减了。 我们在之后的文章中来分析额外灯方向、距离衰减和角度衰减是怎么计算的。