源自CubeBlend
首先映入眼帘的是
稍微解释一下[NoScaleOffset]吧,就是在material的面板上没有tilling和offset控制部分的GUI显示。
然后我看到了
half4
_TexA_HDR;
half4
_TexB_HDR;
这个应该是unity声明的吧,比如想_MainTex_ST这样的规则
我搜了一大群,找到了一点点信息。
说如此声明的变量,它是一个float4类型的,所包含的信息是如何在所使用的颜色空间下解码一张疑似HDR的图片。如果你想看DecodeHDR这个方法呢,请移步UnityCG.cginc里查阅。
反正是第一遍通读unity的shader源码,那就顺藤摸瓜式的学习吧。
// Decodes HDR textures
// handles dLDR, RGBM formats
inline
half3
DecodeHDR
(
half4
data,
half4
decodeInstructions)
{
// Take into account texture alpha if decodeInstructions.w is true(the alpha value affects the RGB channels)
half
alpha = decodeInstructions.w * (data.a -
1.0
) +
1.0
;
// If Linear mode is not supported we can skip exponent part
#if
defined
(UNITY_COLORSPACE_GAMMA)
return
(decodeInstructions.x * alpha) * data.rgb;
#else
#
if
defined
(UNITY_USE_NATIVE_HDR)
return
decodeInstructions.x * data.rgb;
// Multiplier for future HDRI relative to absolute conversion.
#
else
return
(decodeInstructions.x *
pow
(alpha, decodeInstructions.y)) * data.rgb;
#
endif
#endif
}
目前阶段先看一下,后面单独研究一下cginc系列的库文件。
然后我们继续刚才源码的进度,有看到了
UNITY_DECLARE_TEXCUBE
(_TexA);
UNITY_DECLARE_TEXCUBE
(_TexB);
我们去HLSLSupport.cginc里查阅
#define
UNITY_DECLARE_TEXCUBE
(tex) TextureCube tex; SamplerState
sampler
##tex
他的意思很明确,一个宏定义。那么我们把shader里替换成下面这样也是没有错误的
TextureCube _TexA;
SamplerState sampler_TexA;
TextureCube _TexB;
SamplerState sampler_TexB;
看着SamplerState好眼熟,似乎他认识我。。。Max里的材质。。
那么这么写:
TextureCube _TexB;
SamplerState sampler_TexB
{
Filter = MIN_MAG_MIP_LINEAR;
AddressU = Wrap;
AddressV = Wrap;
};
窝了。。。unity也不报错。。
然后我突发奇想。开始了一个测试。
是不是这样,我就可以在shader里改掉Texture的Wrap Model呢。。。
天真的我付出了天真的代价。完全没有效果。好神奇的unity,也没有报错。响当当的容错能力。
是不是被Override了?我无从得知了。
继续。。。
half3
texA =
DecodeHDR
(
UNITY_SAMPLE_TEXCUBE_LOD
(_TexA, i.texcoord, _Level), _TexA_HDR);
half3
texB =
DecodeHDR
(
UNITY_SAMPLE_TEXCUBE_LOD
(_TexB, i.texcoord, _Level), _TexB_HDR);
这个UNITY_SAMPLE_TEXCUBE_LOD,也是个宏
#define
UNITY_SAMPLE_TEXCUBE_LOD
(tex,coord,lod) tex.
SampleLevel
(
sampler
##tex,coord, lod)
等价于
half3
texA =
DecodeHDR
(_TexA.
SampleLevel
(sampler_TexA,i.texcoord,_Level),_TexA_HDR);
最后就剩下这个了
half3
res =
lerp
(texA, texB, _value);
反正我不会解释lerp的,谁解释谁是小狗。。。。
lerp(a,b,x) = a*(1-x) + b*x;
汪汪汪。。。