Unity的StandardShader分析,基于原神模型
嗯。。。。。??这里是没有HLSL代码分析的!!因为觉得Unity官方的东西太烂,没分析之必要,个人表达能力有限,免得误人子弟
之前虽然我也一直吐槽Unity官方,及其家属(中国版本及其员工)
但我今天重新观察了一下场景中Standard的光效
如下图,没有利用任何法线,仅仅靠光的渐变就能做到这个效果,恐怖如斯。。。。
这就是光影的力量么?
这就是PBR的力量么?
现在的我认知还不足够,也只能用仅有的一点逻辑推理分析一下:
1.天下没有免费的午餐
standard能在不做任何配置的情况下,效果做的有多好,成本就有多高,配置就有多难;Unity的渲染效果是很好的(5.x就已经达到这样的高度);这也是我之前经常吐槽的原因,首先是没法配置,然后就是手机跑不起来(直到今天还有人和我说不信现在的iphone还跑不起来这些效果),再就是新出的版本,2019,2020等想向前兼容,又做不到,结果现在整个Editor就是很作。。。。。。
2.原型的模型精度很够
面数其实不多的,嗯。。。“要作一顿美食大餐,佐料很重要,但是原材料的新鲜更重要”;媒体一直说《原神》材质厉害,实际上最基本的模型建模才是基本功;米哈游这个建模是行业天花板了,真的足以让行业向前迈进一大步,建模我是真不懂,就不班门弄斧了。
3.和美术事逼没必要也没法避免
这也是我觉得米哈游牛逼的地方,我就不信他们没有撕逼,因为官方的standard这个东西就是容易让人踩坑,。你厉害,你好彩头,还从来没遇到过撕逼,那真的就只是因为你还没遇到,别急,迟早会si bi。以前我还以为自己遇到肯定能hold住,会这么以为还真是因为还没遇到
4.Unity最大的问题在于和稀泥
在看了一些unity内部源码之后,发现和稀泥真的是他们一贯的尿性(我文章的尿性就是写前面不写后面)
看上面图是不是很熟悉?是不是直观“感觉”就很像漫反射
和Unity的漫反射还不是一个概念
Unity自己有自己漫反射,
Unity有直射光,还有间接光
所以造成新手各种糊涂,自学者各种不懂,进阶者一筹莫展,努力者瞎忙,各种不适
所以。。。。。。。。。。。
(当然,所以掌握基本概念准不会造成自己混乱;自己不乱,乱的就是别人;所以也有一些说法是:1.学真正的渲染就抛弃Unity;2.先忘记Unity Shader)
======================================
(之前博客说的用最简单的渲染管线做最简单URP渲染,会尽快补上)
拆分的源码,明天会放上来吧,有需要研究的自取(已完成),随便建一个材质可用
自定义调用.shader(基于STandard 拆分的源码)
// Unity built-in shader source. Copyright (c) 2016 Unity Technologies. MIT license (see license.txt)
Shader "Sample/StandardStandard"
{
Properties
{
_SelfMainLight("_SelfMainLight",Color)=(1,1,1,1)
_SelfPower("_SelfPower",Range(0.1,110))=0.2
_Color("Color", Color) = (1,1,1,1)
_MainTex("Albedo", 2D) = "white" {}
_Cutoff("Alpha Cutoff", Range(0.0, 1.0)) = 0.5
_Glossiness("Smoothness", Range(0.0, 1.0)) = 0.5
_GlossMapScale("Smoothness Scale", Range(0.0, 1.0)) = 1.0
_SmoothnessTextureChannel ("Smoothness texture channel", Float) = 0
_Metallic("Metallic", Range(0.0, 1.0)) = 0.0
_MetallicGlossMap("Metallic", 2D) = "white" {}
_SpecularHighlights("Specular Highlights", Float) = 1.0
_GlossyReflections("Glossy Reflections", Float) = 1.0
_BumpScale("Scale", Float) = 1.0
_BumpMap("Normal Map", 2D) = "bump" {}
_Parallax ("Height Scale", Range (0.005, 0.08)) = 0.02
_ParallaxMap ("Height Map", 2D) = "black" {}
_OcclusionStrength("Strength", Range(0.0, 1.0)) = 1.0
_OcclusionMap("Occlusion", 2D) = "white" {}
_EmissionColor("Color", Color) = (0,0,0)
_EmissionMap("Emission", 2D) = "white" {}
_DetailMask("Detail Mask", 2D) = "white" {}
_DetailAlbedoMap("Detail Albedo x2", 2D) = "grey" {}
_DetailNormalMapScale("Scale", Float) = 1.0
_DetailNormalMap("Normal Map", 2D) = "bump" {}
_UVSec ("UV Set for secondary textures", Float) = 0
// Blending state
_Mode ("__mode", Float) = 0.0
_SrcBlend ("__src", Float) = 1.0
_DstBlend ("__dst", Float) = 0.0
_ZWrite ("__zw", Float) = 1.0
}
CGINCLUDE
#define UNITY_SETUP_BRDF_INPUT MetallicSetup
//#define DYNAMICLIGHTMAP_ON
ENDCG
SubShader
{
Tags { "RenderType"="Opaque" "PerformanceChecks"="False" }
LOD 300
// ------------------------------------------------------------------
//Base forward pass (directional light, emission, lightmaps, ...)
Pass
{
Name "FORWARD"
Tags { "LightMode" = "ForwardBase" }
Blend
ZWrite
CGPROGRAM
#pragma target 3.0
// -------------------------------------
//#pragma surface lightModel noambier
#pragma shader_feature_local _NORMALMAP
#pragma shader_feature_local _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
#pragma shader_feature_fragment _EMISSION
#pragma shader_feature_local _METALLICGLOSSMAP
#pragma shader_feature_local_fragment _DETAIL_MULX2
#pragma shader_feature_local_fragment _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
#pragma shader_feature_local_fragment _SPECULARHIGHLIGHTS_OFF
#pragma shader_feature_local_fragment _GLOSSYREFLECTIONS_OFF
#pragma shader_feature_local _PARALLAXMAP
#pragma multi_compile_fwdbase
#pragma multi_compile_fog
#pragma multi_compile_instancing
// Uncomment the following line to enable dithering LOD crossfade. Note: there are more in the file to uncomment for other passes.
//#pragma multi_compile _ LOD_FADE_CROSSFADE
#pragma vertex vertBase
//#pragma fragment fragBase
#pragma fragment fragBaseX
#include "UnityStandardCoreForward.cginc"
#include "lite.cginc"
ENDCG
}
// ------------------------------------------------------------------
//Additive forward pass (one light per pass)
Pass
{
Name "FORWARD_DELTA"
Tags { "LightMode" = "ForwardAdd" }
Blend One
Fog { Color (0,0,0,0) } // in additive pass fog should be black
ZWrite Off
ZTest LEqual
CGPROGRAM
#pragma target 3.0
// -------------------------------------
#pragma shader_feature_local _NORMALMAP
#pragma shader_feature_local _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
#pragma shader_feature_local _METALLICGLOSSMAP
#pragma shader_feature_local_fragment _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
#pragma shader_feature_local_fragment _SPECULARHIGHLIGHTS_OFF
#pragma shader_feature_local_fragment _DETAIL_MULX2
#pragma shader_feature_local _PARALLAXMAP
#pragma multi_compile_fwdadd_fullshadows
#pragma multi_compile_fog
// Uncomment the following line to enable dithering LOD crossfade. Note: there are more in the file to uncomment for other passes.
//#pragma multi_compile _ LOD_FADE_CROSSFADE
#pragma vertex vertAdd
#pragma fragment fragAdd
#include "UnityStandardCoreForward.cginc"
ENDCG
}
// ------------------------------------------------------------------
//Shadow rendering pass
Pass {
Name "ShadowCaster"
Tags { "LightMode" = "ShadowCaster" }
ZWrite On ZTest LEqual
CGPROGRAM
#pragma target 3.0
// -------------------------------------
#pragma shader_feature_local _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
#pragma shader_feature_local _METALLICGLOSSMAP
#pragma shader_feature_local_fragment _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
#pragma shader_feature_local _PARALLAXMAP
#pragma multi_compile_shadowcaster
#pragma multi_compile_instancing
// Uncomment the following line to enable dithering LOD crossfade. Note: there are more in the file to uncomment for other passes.
//#pragma multi_compile _ LOD_FADE_CROSSFADE
#pragma vertex vertShadowCaster
#pragma fragment fragShadowCaster
#include "UnityStandardShadow.cginc"
ENDCG
}
// ------------------------------------------------------------------
//Deferred pass
Pass
{
Name "DEFERRED"
Tags { "LightMode" = "Deferred" }
CGPROGRAM
#pragma target 3.0
#pragma exclude_renderers nomrt
// -------------------------------------
#pragma shader_feature_local _NORMALMAP
#pragma shader_feature_local _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
#pragma shader_feature_fragment _EMISSION
#pragma shader_feature_local _METALLICGLOSSMAP
#pragma shader_feature_local_fragment _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
#pragma shader_feature_local_fragment _SPECULARHIGHLIGHTS_OFF
#pragma shader_feature_local_fragment _DETAIL_MULX2
#pragma shader_feature_local _PARALLAXMAP
#pragma multi_compile_prepassfinal
#pragma multi_compile_instancing
// Uncomment the following line to enable dithering LOD crossfade. Note: there are more in the file to uncomment for other passes.
//#pragma multi_compile _ LOD_FADE_CROSSFADE
#pragma vertex vertDeferred
#pragma fragment fragDeferred
#include "UnityStandardCore.cginc"
ENDCG
}
// ------------------------------------------------------------------
// Extracts information for lightmapping, GI (emission, albedo, ...)
// This pass it not used during regular rendering.
Pass
{
Name "META"
Tags { "LightMode"="Meta" }
Cull Off
CGPROGRAM
#pragma vertex vert_meta
#pragma fragment frag_meta
#pragma shader_feature_fragment _EMISSION
#pragma shader_feature_local _METALLICGLOSSMAP
#pragma shader_feature_local_fragment _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
#pragma shader_feature_local_fragment _DETAIL_MULX2
#pragma shader_feature EDITOR_VISUALIZATION
#include "UnityStandardMeta.cginc"
ENDCG
}
}
SubShader
{
Tags { "RenderType"="Opaque" "PerformanceChecks"="False" }
LOD 150
// ------------------------------------------------------------------
//Base forward pass (directional light, emission, lightmaps, ...)
Pass
{
Name "FORWARD"
Tags { "LightMode" = "ForwardBase" }
Blend
ZWrite
CGPROGRAM
#pragma target 2.0
#pragma shader_feature_local _NORMALMAP
#pragma shader_feature_local _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
#pragma shader_feature_fragment _EMISSION
#pragma shader_feature_local _METALLICGLOSSMAP
#pragma shader_feature_local_fragment _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
#pragma shader_feature_local_fragment _SPECULARHIGHLIGHTS_OFF
#pragma shader_feature_local_fragment _GLOSSYREFLECTIONS_OFF
// SM2.0: NOT SUPPORTED shader_feature_local _DETAIL_MULX2
// SM2.0: NOT SUPPORTED shader_feature_local _PARALLAXMAP
#pragma skip_variants SHADOWS_SOFT DIRLIGHTMAP_COMBINED
#pragma multi_compile_fwdbase
#pragma multi_compile_fog
#pragma vertex vertBase
#pragma fragment fragBase
#include "UnityStandardCoreForward.cginc"
ENDCG
}
// ------------------------------------------------------------------
//Additive forward pass (one light per pass)
Pass
{
Name "FORWARD_DELTA"
Tags { "LightMode" = "ForwardAdd" }
Blend One
Fog { Color (0,0,0,0) } // in additive pass fog should be black
ZWrite Off
ZTest LEqual
CGPROGRAM
#pragma target 2.0
#pragma shader_feature_local _NORMALMAP
#pragma shader_feature_local _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
#pragma shader_feature_local _METALLICGLOSSMAP
#pragma shader_feature_local_fragment _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
#pragma shader_feature_local_fragment _SPECULARHIGHLIGHTS_OFF
#pragma shader_feature_local_fragment _DETAIL_MULX2
// SM2.0: NOT SUPPORTED shader_feature_local _PARALLAXMAP
#pragma skip_variants SHADOWS_SOFT
#pragma multi_compile_fwdadd_fullshadows
#pragma multi_compile_fog
#pragma vertex vertAdd
#pragma fragment fragAdd
#include "UnityStandardCoreForward.cginc"
ENDCG
}
// ------------------------------------------------------------------
//Shadow rendering pass
Pass {
Name "ShadowCaster"
Tags { "LightMode" = "ShadowCaster" }
ZWrite On ZTest LEqual
CGPROGRAM
#pragma target 2.0
#pragma shader_feature_local _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
#pragma shader_feature_local _METALLICGLOSSMAP
#pragma shader_feature_local_fragment _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
#pragma skip_variants SHADOWS_SOFT
#pragma multi_compile_shadowcaster
#pragma vertex vertShadowCaster
#pragma fragment fragShadowCaster
#include "UnityStandardShadow.cginc"
ENDCG
}
// ------------------------------------------------------------------
// Extracts information for lightmapping, GI (emission, albedo, ...)
// This pass it not used during regular rendering.
Pass
{
Name "META"
Tags { "LightMode"="Meta" }
Cull Off
CGPROGRAM
#pragma vertex vert_meta
#pragma fragment frag_meta
#pragma shader_feature_fragment _EMISSION
#pragma shader_feature_local _METALLICGLOSSMAP
#pragma shader_feature_local_fragment _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
#pragma shader_feature_local_fragment _DETAIL_MULX2
#pragma shader_feature EDITOR_VISUALIZATION
#include "UnityStandardMeta.cginc"
ENDCG
}
}
FallBack "VertexLit"
//CustomEditor "StandardShaderGUI"
}
lite.cginc(不是lit)
//standard Shader轻量化计划
#include"HLSLSupport.cginc"
#include "AutoLight.cginc"
#include "UnityInstancing.cginc"
#include "UnityCG.cginc"
#include "UnityStandardCore.cginc"
#include "UnityPBSLighting.cginc"
//#include "UnityStandardCoreForwardSimple.cginc"//#if UNITY_STANDARD_SIMPLE
//
half4 _SelfMainLight;
half _SelfPower;
// struct VertexOutputForwardBaseX
// {
// UNITY_POSITION(pos);//"HLSLSupport.cginc"
// float4 tex : TEXCOORD0;
// float4 eyeVec : TEXCOORD1; // eyeVec.xyz | fogCoord
// float4 tangentToWorldAndPackedData : TEXCOORD2; //
// half4 ambientOrLightmapUV : TEXCOORD5; // SH or Lightmap UV
// UNITY_LIGHTING_COORDS(6,7)//"AutoLight.cginc"
//
// // next ones would not fit into SM2.0 limits, but they are always for SM3.0+
// #if UNITY_REQUIRE_FRAG_WORLDPOS && !UNITY_PACK_WORLDPOS_WITH_TANGENT
// float3 posWorld : TEXCOORD8;
// #endif
//
// UNITY_VERTEX_INPUT_INSTANCE_ID//"UnityInstancing.cginc"
// UNITY_VERTEX_OUTPUT_STEREO
// };
// Main Physically Based BRDF
// Derived from Disney work and based on Torrance-Sparrow micro-facet model
//
// BRDF = kD / pi + kS * (D * V * F) / 4
// I = BRDF * NdotL
//
// * NDF (depending on UNITY_BRDF_GGX):
//a) Normalized BlinnPhong
//b) GGX
// * Smith for Visiblity term
// * Schlick approximation for Fresnel
half4 BRDF1_Unity_PBSX (half3 diffColor, half3 specColor, half oneMinusReflectivity, half smoothness,
float3 normal, float3 viewDir,
UnityLight light, UnityIndirect gi)
{
float perceptualRoughness = SmoothnessToPerceptualRoughness (smoothness);
float3 halfDir = Unity_SafeNormalize (float3(light.dir) + viewDir);
// NdotV should not be negative for visible pixels, but it can happen due to perspective projection and normal mapping
// In this case normal should be modified to become valid (i.e facing camera) and not cause weird artifacts.
// but this operation adds few ALU and users may not want it. Alternative is to simply take the abs of NdotV (less correct but works too).
// Following define allow to control this. Set it to 0 if ALU is critical on your platform.
// This correction is interesting for GGX with SmithJoint visibility function because artifacts are more visible in this case due to highlight edge of rough surface
// Edit: Disable this code by default for now as it is not compatible with two sided lighting used in SpeedTree.
#define UNITY_HANDLE_CORRECTLY_NEGATIVE_NDOTV 0
#if UNITY_HANDLE_CORRECTLY_NEGATIVE_NDOTV
// The amount we shift the normal toward the view vector is defined by the dot product.
half shiftAmount = dot(normal, viewDir);
normal = shiftAmount < 0.0f ? normal + viewDir * (-shiftAmount + 1e-5f) : normal;
// A re-normalization should be applied here but as the shift is small we don&#39;t do it to save ALU.
//normal = normalize(normal);
float nv = saturate(dot(normal, viewDir)); // TODO: this saturate should no be necessary here
#else
half nv = abs(dot(normal, viewDir)); // This abs allow to limit artifact
#endif
float nl = saturate(dot(normal, light.dir));
float nh = saturate(dot(normal, halfDir));
half lv = saturate(dot(light.dir, viewDir));
half lh = saturate(dot(light.dir, halfDir));
// Diffuse term
half diffuseTerm = DisneyDiffuse(nv, nl, lh, perceptualRoughness) * nl;
// Specular term
// HACK: theoretically we should divide diffuseTerm by Pi and not multiply specularTerm!
// BUT 1) that will make shader look significantly darker than Legacy ones
// and 2) on engine side &#34;Non-important&#34; lights have to be divided by Pi too in cases when they are injected into ambient SH
float roughness = PerceptualRoughnessToRoughness(perceptualRoughness);
#if UNITY_BRDF_GGX
// GGX with roughtness to 0 would mean no specular at all, using max(roughness, 0.002) here to match HDrenderloop roughtness remapping.
roughness = max(roughness, 0.002);
float V = SmithJointGGXVisibilityTerm (nl, nv, roughness);
float D = GGXTerm (nh, roughness);
#else
// Legacy
half V = SmithBeckmannVisibilityTerm (nl, nv, roughness);
half D = NDFBlinnPhongNormalizedTerm (nh, PerceptualRoughnessToSpecPower(perceptualRoughness));
#endif
float specularTerm = V*D * UNITY_PI; // Torrance-Sparrow model, Fresnel is applied later
# ifdef UNITY_COLORSPACE_GAMMA
specularTerm = sqrt(max(1e-4h, specularTerm));
# endif
// specularTerm * nl can be NaN on Metal in some cases, use max() to make sure it&#39;s a sane value
specularTerm = max(0, specularTerm * nl);
#if defined(_SPECULARHIGHLIGHTS_OFF)
specularTerm = 0.0;
#endif
// surfaceReduction = Int D(NdotH) * NdotH * Id(NdotL>0) dH = 1/(roughness^2+1)
half surfaceReduction;
# ifdef UNITY_COLORSPACE_GAMMA
surfaceReduction = 1.0-0.28*roughness*perceptualRoughness; // 1-0.28*x^3 as approximation for (1/(x^4+1))^(1/2.2) on the domain
# else
surfaceReduction = 1.0 / (roughness*roughness + 1.0); // fade \in
# endif
// To provide true Lambert lighting, we need to be able to kill specular completely.
specularTerm *= any(specColor) ? 1.0 : 0.0;
half grazingTerm = saturate(smoothness + (1-oneMinusReflectivity));
//gi.specular = 0;//测试间接光的高光项;unity 除了直接平行光,还有间接平行光
half3 color = diffColor * (gi.diffuse + light.color * diffuseTerm)
+ specularTerm * light.color * FresnelTerm (specColor, lh)
//+ surfaceReduction * gi.specular * FresnelLerp (specColor, grazingTerm, nv)//这个反射受到 Light界面 Enviorment Reflection 控制
//+ gi.specular * FresnelLerp (specColor, grazingTerm, nv)// surfaceReduction == 间接光的高光项; 换一个做测试
;
return half4(color, 1);
}
half4 fragForwardBaseInternalX (VertexOutputForwardBase i)//VertexOutputForwardBase is in UnityStandardCore.cginc???
{
UNITY_APPLY_DITHER_CROSSFADE(i.pos.xy);//#ifdef LOD_FADE_CROSSFADE //UnityCG.cginc
FRAGMENT_SETUP(s)//UnityStandardCore.cginc
UNITY_SETUP_INSTANCE_ID(i);
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
UnityLight mainLight = MainLight ();
UNITY_LIGHT_ATTENUATION(atten, i, s.posWorld);
half occlusion = Occlusion(i.tex.xy);
//struct UnityLight
//{
// half3 color;
// half3 dir;
//i.ambientOrLightmapUV = half4(0.6,0.6,0.6,0.6);//可以调整 mainlight 的占比,0.1则主要用Mainlight,而0.6则不要mainlight,但会过爆
//mainLight.color = half3(1,1,1);
mainLight.color = pow(_SelfMainLight.rgb-half3(0.01,0.01,0.01),_SelfPower);
//mainLight.color = half3(0,0,0);//关闭主光源
UnityGI gi = FragmentGI (s, occlusion, i.ambientOrLightmapUV, atten, mainLight);
//s.specColor = half4(0,0,0,0);
//s.diffColor = half4(0,0,0,0);
//s.smoothness = 0;//如>=0 UNITY_BRDF_PBS 会有一点外发光
half4 c = BRDF1_Unity_PBSX (s.diffColor, s.specColor, s.oneMinusReflectivity, s.smoothness, s.normalWorld, -s.eyeVec, gi.light, gi.indirect);//UnityPBSLighting.cginc
c.rgb += Emission(i.tex.xy);
//UNITY_EXTRACT_FOG_FROM_EYE_VEC(i);
//UNITY_APPLY_FOG(_unity_fogCoord, c.rgb);
return OutputForward (c, s.alpha);
}
//会提示invalid subscript ‘tangentToWorldAndPackedData&#39;
half4 fragBaseX (VertexOutputForwardBase i) : SV_Target { return fragForwardBaseInternalX(i); }
// half4 fragForwardBaseSimpleInternalX (VertexOutputBaseSimple i)
// {
// UNITY_APPLY_DITHER_CROSSFADE(i.pos.xy);
//
// FragmentCommonData s = FragmentSetupSimple(i);
//
// UnityLight mainLight = MainLightSimple(i, s);
//
// #if !defined(LIGHTMAP_ON) && defined(_NORMALMAP)
// half ndotl = saturate(dot(s.tangentSpaceNormal, i.tangentSpaceLightDir));
// #else
// half ndotl = saturate(dot(s.normalWorld, mainLight.dir));
// #endif
//
// //we can&#39;t have worldpos here (not enough interpolator on SM 2.0) so no shadow fade in that case.
// half shadowMaskAttenuation = UnitySampleBakedOcclusion(i.ambientOrLightmapUV, 0);
// half realtimeShadowAttenuation = SHADOW_ATTENUATION(i);
// half atten = UnityMixRealtimeAndBakedShadows(realtimeShadowAttenuation, shadowMaskAttenuation, 0);
//
// half occlusion = Occlusion(i.tex.xy);
// half rl = dot(REFLECTVEC_FOR_SPECULAR(i, s), LightDirForSpecular(i, mainLight));
//
// UnityGI gi = FragmentGI (s, occlusion, i.ambientOrLightmapUV, atten, mainLight);
// half3 attenuatedLightColor = gi.light.color * ndotl;
//
// half3 c = BRDF3_Indirect(s.diffColor, s.specColor, gi.indirect, PerVertexGrazingTerm(i, s), PerVertexFresnelTerm(i));
// c += BRDF3DirectSimple(s.diffColor, s.specColor, s.smoothness, rl) * attenuatedLightColor;
// c += Emission(i.tex.xy);
//
// UNITY_APPLY_FOG(i.fogCoord, c);
//
// return OutputForward (half4(c, 1), s.alpha);
// }
// //VertexOutputBaseSimple is in UnityStandardCoreForwardSimple.cginc
// //half4 fragBaseX (VertexOutputBaseSimple i) : SV_Target { return fragForwardBaseSimpleInternal(i); }
// half4 fragBaseXX (VertexOutputBaseSimple i) : SV_Target { return fragForwardBaseSimpleInternal(i); }
打光的主要hlsl代码如下,其实还是老三剑客
UnityGI gi = FragmentGI (s, occlusion, i.ambientOrLightmapUV, atten, mainLight);
//s.specColor = half4(0,0,0,0);//高光
//s.diffColor = half4(0,0,0,0);//漫反射光
//s.smoothness = 0;//如>=0 UNITY_BRDF_PBS 会有一点外发光
页:
[1]