Shader开发之StandardShader
这篇主要讲shader开发之StanderShader与自己项目的结合!
[Shader解读与结合]
[StandardShader]
这个shader我们可以在untiy官网上下载到:
这里我们可以下载unity自带的shader!
这里就是基于物理着色的shader!
这里可以看到两个入口函数可以在下面的cginc库里找到,然后打开库:
然后再UnityStandardCore库里面找到对应的函数名:
[ShaderForge中的基于物理的着色]
我们只是在ShaderFoge中调处基本的物理着色,因为StanderShader对于我们的可扩展性稍差,需要自己扩展的话我们简单的使用ShaderForge就行!
打开一个ShaderForge基于物理的着色shader,我们需要实现任何其他的效果,都第一个子着色器,的前置灯光通道里面实现!根据代码的标签,我们可以很清楚的知道每一步都做了什么内容,这里需要能读懂shader代码,需要一些代码基础!
实例:实现多带透明通道的图层叠加
1.在设置面板添加新的标签:
Properties {
_BumpMap ("Normal Map", 2D) = "bump" {}
_Color ("Color", Color) = (0.5019608,0.5019608,0.5019608,1)
_MainTex ("MainTex", 2D) = "white" {}
_Character("Character",2D) = "white"{}
_Metallic ("Metallic", Range(0, 1)) = 0
_Gloss ("Gloss", Range(0, 1)) = 0.8
_Specular("Specular",Range(0,1)) = 1
_Saturation("Saturation",Range(0,1.5)) = 1
_TimeA("TimeA",Range(0,2)) = 1
}
2.加入unity的金属质感的光照处理:
CGINCLUDE
#define UNITY_SETUP_BRDF_INPUT MetallicSetup
ENDCG
3.加入透明通道的叠加处理:
Blend SrcAlpha OneMinusSrcAlpha
4.在两个不同的通道处理两张不同的图片:
Tags {
"LightMode" = "ForwardBase"
}
Tags {
"LightMode"="ForwardBase"
}
5.找到diffuse标签,加入自己的逻辑处理:
/// Diffuse:
NdotL = max(0.0,dot( normalDirection, lightDirection ));
half fd90 = 0.1 + 1 * LdotH * LdotH * (1-gloss);
float nlPow5 = Pow5(1-NdotL);
float nvPow5 = Pow5(1-NdotV);
float3 directDiffuse = ((1 +(fd90 - 1)*nlPow5) * (1 + (fd90 - 1)*nvPow5) * NdotL) * attenColor;
float3 indirectDiffuse = float3(0,0,0);
indirectDiffuse += gi.indirect.diffuse;
float3 diffuse = (directDiffuse + indirectDiffuse) * diffuseColor;
/// Final Color:
float3 finalColor = diffuse + specular;
fixed4 finalRGBA = fixed4(finalColor,_MainTex_var.a);
UNITY_APPLY_FOG(i.fogCoord, finalRGBA);
return finalRGBA;
6.最后我们就能实现完美的贴图叠加效果了