"Combate Unity3D ShaderLab Desenvolvimento explicar" Capítulo 9 LightProbes iluminação baseada

Sonda luz

  • 作用:Ele permite que a iluminação estática e sombras dinâmicas em objetos de trabalho.
  • 原理:
    • 理论基础: L = Σ Eu 0 Eu S H ( Eu ) * C ( Eu ) \ Soma ^ {i \ a \ infty} _ {i \ a 0} {SH (i) * C (i)} , o brilho da iluminação pode ser decomposta em uma série de funções de base harmónicas esféricas multiplicado pela soma coeficiente correspondente.
    • 烘焙静态光影到光照探针:Calcular e gravar o número de coeficientes em cada um dos luz sonda durante a cozedura, podem ser reconstruídos em tempo de execução por um factor de brilho de iluminação.
    • 建立四面体结构:Muitas combinações de luz da sonda em uma pilha tetraedros, que irá ser calculado em conformidade com a posição de objectos dinâmicos de tempo de execução tetraédrico então interpolado usando a luminância de luz sonda tetraédrica.
  • 数据结构:Estes dados são gravados em LightmapSettings.lightProbes em.
    • 四面体机构:A gravação de uma série de tetraédricos todas as sondas de iluminação dos mesmos.
    • 系数:Gravado (três canais, cada um dos coeficientes de canal 9) para cada um dos condutores de luz 27 coeficientes.
  • 动态修改光照探针数据:LightmapSettings.lightProbes.bakedProbes registrados em todos os objetos de luz da sonda, esses objetos podem ser modificados dinamicamente durante a execução.
    • 修改亮度:Você pode modificar dinamicamente a luminosidade de cada sonda iluminação.
    • 增加环境光:Aumentando a luz ambiente pode aumentar a dinâmica da luz para cada sonda.
LightmapSettings.lightProbes.bakedProbes.AddAmbiendLight(color);

Utilizando a sonda Shader luz

  • luz sondas utilizadas na frente passar
Shader "Tut/Lighting/LightProbes/Lab_7/SHForward"
{
	Properties{}
	SubShader{
		Pass{
			Tags{ "LightMode" = "ForwardBase" }
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#include "UnityCG.cginc"
			#include "Lighting.cginc"

			struct vertOut{
				float4 pos:SV_POSITION;
				float4 color:COLOR;
			}
			vertOut vert(appdata_base v){
				float3 worldN = mul(float3x3(_Object2World), v.normal);
				vertOut o;
				o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
				o.color.rgb = ShadeSH9(half4(worldN, 1));
				o.color.a = 1;
				return o;
			}
			float4 frag(vertOut i):COLOR{
				return i.color;
			}
			ENDCG
		}
	}
}
  • Shader superfície utilizando a sonda de luz.
Shader "Tut/Lighting/LightProbes/Lab_7/SHForward"
{
	Properties{}
	SubShader{
			Tags{ "RenderType" = "Opaque" }
			LOD 200
			CGPROGRAM
			#pragma surface surf Lambert noambient vertex:vert
			
			struct Input{
				float3 shLight;
			}
			void vert(inout appdata_full v, Input o){
				float3 worldN = mul(float3x3(_Object2World), SCALED_NORMAL);
				o.shLight = ShadeSH9(half4(worldN, 1));
			}
			void surf(Input IN, inout SurfaceOutput o){
				o.Emission = IN.shLight;
				o.Albedo = float3(1,1,1);
				o.Alpha = 1;
			}
			ENDCG
	}
}
  • função ShadeSH9:
half3 ShadeSH9(half4 normal){
	half3 x1,x2,x3;
	x1.r = dot(unity_SHAr, normal);
	x1.g = dot(unity_SHAg, normal);
	x1.b = dot(unity_SHAb, normal);
	
	half4 vB = normal.xyzz * normal.yzzx;
	x2.r = dot(unity_SHBr, vB);
	x2.g = dot(unity_SHBg, vB);
	x2.b = dot(unity_SHBb, vB);

	float4 vC = normal.x * normal.x - normal.y * normal.y;
	x3 = unity_SHC.rgb *vC;
	return x1 + x2 + x3;
}
Publicado 41 artigos originais · ganhou elogios 4 · Vistas 3891

Acho que você gosta

Origin blog.csdn.net/weixin_42487874/article/details/103277351
Recomendado
Clasificación