麻豆黑色丝袜jk制服福利网站-麻豆精品传媒视频观看-麻豆精品传媒一二三区在线视频-麻豆精选传媒4区2021-在线视频99-在线视频a

千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)

手機(jī)站
千鋒教育

千鋒學(xué)習(xí)站 | 隨時(shí)隨地免費(fèi)學(xué)

千鋒教育

掃一掃進(jìn)入千鋒手機(jī)站

領(lǐng)取全套視頻
千鋒教育

關(guān)注千鋒學(xué)習(xí)站小程序
隨時(shí)隨地免費(fèi)學(xué)習(xí)課程

當(dāng)前位置:首頁  >  技術(shù)干貨  > Unityurp級(jí)聯(lián)陰影接縫問題

Unityurp級(jí)聯(lián)陰影接縫問題

來源:千鋒教育
發(fā)布人:qyf
時(shí)間: 2022-08-29 16:42:00 1661762520

  試了一下unity自帶的陰影,發(fā)現(xiàn)有接縫問題,基本是要自己處理級(jí)聯(lián)陰影

  看了urp的build-in之后,想了一個(gè)比較暗黑的方式,簡單處理一下,運(yùn)行對(duì)比圖如下,

圖片 1

  左邊是unity自帶的級(jí)聯(lián)陰影效果,右邊是平滑后的級(jí)聯(lián)陰影思路比較簡單,從unity內(nèi)部函數(shù)中抽幾個(gè)出來改造計(jì)算當(dāng)前像素點(diǎn)(世界坐標(biāo))位于哪個(gè)裁切球,代碼如下:

圖片 2

  強(qiáng)制取某個(gè)裁切球的級(jí)聯(lián)陰影映射,代碼如下:

圖片 3

  本案例只處理第一個(gè)裁切球與第二個(gè)裁切球過渡效果,

  其它的裁切球離攝像機(jī)比較遠(yuǎn),處不處理影響不大,如果要處理,方法也是相同的混合兩個(gè)解析度的陰影代碼如下

圖片 4

  其它urp管線需要用到的pass DepthOnly ShadowCaster就不說明了,照抄就可以了,以便物體本身也能生成陰影以下貼出完整的urp shader代碼

  Shader "lsc/csm_shader"

  {

  Properties

  {

  _MainTex("Texture", 2D) = "white" {}

  }

  SubShader

  {

  LOD 100

  Tags{"RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline" "UniversalMaterialType" = "Lit" "IgnoreProjector" = "True" "ShaderModel" = "2.0"}

  Pass

  {

  Name "ForwardLit"

  Tags{"LightMode" = "UniversalForward"}

  HLSLPROGRAM

  #pragma vertex vert

  #pragma fragment frag

  #pragma exclude_renderers gles gles3 glcore

  #pragma target 4.5

  #pragma multi_compile _ _MAIN_LIGHT_SHADOWS

  #pragma multi_compile _ _MAIN_LIGHT_SHADOWS_CASCADE

  #pragma multi_compile_fragment _ _ADDITIONAL_LIGHT_SHADOWS

  #pragma multi_compile_fragment _ _SHADOWS_SOFT

  #pragma vertex LitPassVertex

  #pragma fragment LitPassFragment

  #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"

  #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"

  struct appdata

  {

  float4 vertex : POSITION;

  float2 uv : TEXCOORD0;

  float3 normal : NORMAL;

  };

  struct v2f

  {

  float2 uv : TEXCOORD0;

  float4 vertex : SV_POSITION;

  float3 normal : TEXCOORD2;

  float3 world_pos : TEXCOORD3;

  };

  sampler2D _MainTex;

  float4 _MainTex_ST;

  v2f vert(appdata v)

  {

  v2f o;

  VertexPositionInputs vertexInput = GetVertexPositionInputs(v.vertex.xyz);

  o.vertex = vertexInput.positionCS;;

  o.uv = TRANSFORM_TEX(v.uv, _MainTex);

  o.normal = v.normal;

  o.world_pos = vertexInput.positionWS;

  return o;

  }

  //常規(guī)的計(jì)算csm紋理映射函數(shù)

  //unity把所有的級(jí)聯(lián)陰影刷在一個(gè)深度紋理

  //通過切換shadow coord的方式取不同解析度的光源深度紋理

  //每個(gè)解析度區(qū)間是用裁切球的方式

  float4 anhei_TransformWorldToShadowCoord(float3 positionWS)

  {

  half cascadeIndex = ComputeCascadeIndex(positionWS);

  float4 shadowCoord = mul(_MainLightWorldToShadow[cascadeIndex], float4(positionWS, 1.0));

  return float4(shadowCoord.xyz, cascadeIndex);

  }

  //自定義直接指定取某個(gè)區(qū)間段級(jí)聯(lián)陰影

  float4 anhei_TransformWorldToShadowCoord2(int idx, float3 positionWS)

  {

  half cascadeIndex = idx;

  float4 shadowCoord = mul(_MainLightWorldToShadow[cascadeIndex], float4(positionWS, 1.0));

  return float4(shadowCoord.xyz, cascadeIndex);

  }

  //常規(guī)計(jì)算當(dāng)前像素點(diǎn)(世界坐標(biāo))處于哪個(gè)裁切球

  half anhei_ComputeCascadeIndex(float3 positionWS)

  {

  float3 fromCenter0 = positionWS - _CascadeShadowSplitSpheres0.xyz;

  float3 fromCenter1 = positionWS - _CascadeShadowSplitSpheres1.xyz;

  float3 fromCenter2 = positionWS - _CascadeShadowSplitSpheres2.xyz;

  float3 fromCenter3 = positionWS - _CascadeShadowSplitSpheres3.xyz;

  float4 distances2 = float4(dot(fromCenter0, fromCenter0), dot(fromCenter1, fromCenter1), dot(fromCenter2, fromCenter2), dot(fromCenter3, fromCenter3));

  half4 weights = half4(distances2 < _CascadeShadowSplitSphereRadii);

  weights.yzw = saturate(weights.yzw - weights.xyz);

  return 4 - dot(weights, half4(4, 3, 2, 1));

  }

  float4 frag(v2f i) : SV_Target

  {

  // sample the texture

  float4 col = tex2D(_MainTex, i.uv);

  float3 nml = normalize(i.normal.xyz);

  int cas_idx_1 = anhei_ComputeCascadeIndex(i.world_pos);

  Light light_1;

  Light light_0;

  half shadow_mix = 1.0f;

  float mix_fact = 0;

  if (cas_idx_1 == 0)//只處理第一個(gè)裁切球,其它裁切球的太遠(yuǎn)了,在畫面上可能看不見

  {

  float4 shadow_coord0 = anhei_TransformWorldToShadowCoord2(0, i.world_pos);

  light_0 = GetMainLight(shadow_coord0);

  float4 shadow_coord1 = anhei_TransformWorldToShadowCoord2(1, i.world_pos);

  light_1 = GetMainLight(shadow_coord1);

  shadow_mix = light_1.shadowAttenuation;

  //離第一個(gè)裁切球心距離

  float3 fromCenter0 = i.world_pos - _CascadeShadowSplitSpheres0.xyz;

  float3 first_sphere_dis = length(fromCenter0);

  //第一個(gè)裁切球的半徑

  float first_sphere_rad = sqrt(_CascadeShadowSplitSphereRadii.x);

  //做一個(gè)簡單的插值

  mix_fact = clamp((first_sphere_dis) / (first_sphere_rad / 1.0f), 0.0f, 1.0f);

  shadow_mix = light_0.shadowAttenuation* (1 - mix_fact) + light_1.shadowAttenuation * mix_fact;

  }

  else

  {

  float4 shadow_coord1 = anhei_TransformWorldToShadowCoord2(1, i.world_pos);

  light_1 = GetMainLight(shadow_coord1);

  shadow_mix = light_1.shadowAttenuation;

  }

  col.rgb = shadow_mix * col.rgb;

  return col;

  }

  ENDHLSL

  }

  // ShadowCaster 將物體寫入光源的深度紋理

  // 使用自定義的shadow caster, urp會(huì)從光源處拍攝場影

  pass

  {

  Tags{ "LightMode" = "ShadowCaster" }

  HLSLPROGRAM

  #pragma vertex vert

  #pragma fragment frag

  #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"

  #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"

  struct appdata

  {

  float4 vertex : POSITION;

  float3 normal : NORMAL;

  };

  struct v2f

  {

  float4 pos : SV_POSITION;

  };

  sampler2D _MainTex;

  float4 _MainTex_ST;

  float3 _LightDirection;

  v2f vert(appdata v)

  {

  v2f o;

  float3 world_pos = TransformObjectToWorld(v.vertex);

  float3 world_nml = TransformObjectToWorldNormal(v.normal);

  o.pos = TransformWorldToHClip(ApplyShadowBias(world_pos, world_nml, _LightDirection));

  return o;

  }

  float4 frag(v2f i) : SV_Target

  {

  float4 color;

  color.xyz = float3(0.0, 0.0, 0.0);

  return color;

  }

  ENDHLSL

  }

  // DepthOnly 直接使用內(nèi)置hlsl代碼

  Pass

  {

  Name "DepthOnly"

  Tags{"LightMode" = "DepthOnly"}

  ZWrite On

  ColorMask 0

  Cull[_Cull]

  HLSLPROGRAM

  #pragma exclude_renderers gles gles3 glcore

  #pragma target 4.5

  #pragma vertex DepthOnlyVertex

  #pragma fragment DepthOnlyFragment

  // -------------------------------------

  // Material Keywords

  #pragma shader_feature_local_fragment _ALPHATEST_ON

  #pragma shader_feature_local_fragment _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A

  //--------------------------------------

  // GPU Instancing

  #pragma multi_compile_instancing

  #pragma multi_compile _ DOTS_INSTANCING_ON

  #include "Packages/com.unity.render-pipelines.universal/Shaders/LitInput.hlsl"

  #include "Packages/com.unity.render-pipelines.universal/Shaders/DepthOnlyPass.hlsl"

  ENDHLSL

  }

  }

  }

  更多關(guān)于unity游戲培訓(xùn)的問題,歡迎咨詢千鋒教育在線名師。千鋒教育擁有多年IT培訓(xùn)服務(wù)經(jīng)驗(yàn),采用全程面授高品質(zhì)、高體驗(yàn)培養(yǎng)模式,擁有國內(nèi)一體化教學(xué)管理及學(xué)員服務(wù),助力更多學(xué)員實(shí)現(xiàn)高薪夢(mèng)想。

tags:
聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
10年以上業(yè)內(nèi)強(qiáng)師集結(jié),手把手帶你蛻變精英
請(qǐng)您保持通訊暢通,專屬學(xué)習(xí)老師24小時(shí)內(nèi)將與您1V1溝通
免費(fèi)領(lǐng)取
今日已有369人領(lǐng)取成功
劉同學(xué) 138****2860 剛剛成功領(lǐng)取
王同學(xué) 131****2015 剛剛成功領(lǐng)取
張同學(xué) 133****4652 剛剛成功領(lǐng)取
李同學(xué) 135****8607 剛剛成功領(lǐng)取
楊同學(xué) 132****5667 剛剛成功領(lǐng)取
岳同學(xué) 134****6652 剛剛成功領(lǐng)取
梁同學(xué) 157****2950 剛剛成功領(lǐng)取
劉同學(xué) 189****1015 剛剛成功領(lǐng)取
張同學(xué) 155****4678 剛剛成功領(lǐng)取
鄒同學(xué) 139****2907 剛剛成功領(lǐng)取
董同學(xué) 138****2867 剛剛成功領(lǐng)取
周同學(xué) 136****3602 剛剛成功領(lǐng)取
相關(guān)推薦HOT
軟件開發(fā)管理流程中會(huì)出現(xiàn)哪些問題?

一、需求不清需求不明確是導(dǎo)致項(xiàng)目失敗的主要原因之一。如果需求沒有清晰定義,開發(fā)人員可能會(huì)開發(fā)出不符合用戶期望的產(chǎn)品。二、通信不足溝通問...詳情>>

2023-10-14 13:43:21
軟件定制開發(fā)中的敏捷開發(fā)是什么?

軟件定制開發(fā)中的敏捷開發(fā)是什么軟件定制開發(fā)中的敏捷開發(fā),從宏觀上看,是一個(gè)高度關(guān)注人員交互,持續(xù)開發(fā)與交付,接受需求變更并適應(yīng)環(huán)境變化...詳情>>

2023-10-14 13:24:57
什么是PlatformIo?

PlatformIO是什么PlatformIO是一個(gè)全面的物聯(lián)網(wǎng)開發(fā)平臺(tái),它為眾多硬件平臺(tái)和開發(fā)環(huán)境提供了統(tǒng)一的工作流程,有效簡化了開發(fā)過程,并能兼容各種...詳情>>

2023-10-14 12:55:06
云快照與自動(dòng)備份有什么區(qū)別?

1、定義和目標(biāo)不同云快照的主要目標(biāo)是提供一種快速恢復(fù)數(shù)據(jù)的方法,它只記錄在快照時(shí)間點(diǎn)后的數(shù)據(jù)變化,而不是所有的數(shù)據(jù)。自動(dòng)備份的主要目標(biāo)...詳情>>

2023-10-14 12:48:59
服務(wù)器為什么要用Linux?

服務(wù)器為什么要用Linux作為服務(wù)器操作系統(tǒng)的優(yōu)選,Linux在眾多選擇中脫穎而出。Linux作為服務(wù)器操作系統(tǒng)的優(yōu)選,有其獨(dú)特的優(yōu)勢(shì)和特點(diǎn)。包括其...詳情>>

2023-10-14 12:34:11
主站蜘蛛池模板: 亚洲午夜成激人情在线影院| 小受被多男摁住—灌浓精| 亚洲va久久久噜噜噜久久狠狠| 无翼乌邪恶帝日本全彩网站| 波多野结衣中文无毒不卡| 日韩欧国产精品一区综合无码| 波多野结衣之双调教hd| 久久久久久91| 卡通动漫精品一区二区三区| 波多野结衣四虎| 一二三四社区在线中文视频| 国产三级在线观看视频不卡| 久久久久久久综合狠狠综合| 国产欧美精品一区二区三区四区| 动漫h肉yin文| 日本漂亮人妖megumi| 午夜久| 免费观看四虎精品国产永久| 欧美成人免费在线观看| **aaaa**毛片在线播放| 无翼乌漫画全彩| 男人桶爽女人30分钟视频动态图| 黑人干白人| 欧美人与动人物乱大交| 亚洲伊人色欲综合网| 久久66热这里只会有精品| 91高端极品外围在线观看| 亚洲精品国产精品乱码不卞 | 精品福利视频一区二区三区| 2018中文字幕第一页| 国产高清露脸| 欧美最猛黑人xxxx黑人猛交98| 国产理论片在线观看| 男生和女生一起差差在线观看| 免费a级毛片18以上观看精品| 鲤鱼乡太大了坐不下去| 免费女人18毛片a级毛片视频| 台湾swag在线观看| 欧美日韩精品| 向日葵app看片视频| 亚韩在线|