标签:



dds是DirectDraw Surface的缩写,实际上,它是DirectX纹理压缩(DirectX Texture Compression,简称DXTC)的产物。DXTC减少了纹理内存消耗的50%甚至更多,有3种DXTC的格式可供使用,它们分别是DXT1,DXT3和DXT5。
float4 packedNormal = tex2D(_NormalMap, IN.uv_MainTex);
packedNormal.w对应A通道,即法线的x。
packedNormal.y对应G通道,即法线的y。
float3 expand(float3 v)
{
fixed3 normal;
normal.xy = v.wy * 2 - 1;
normal.z = sqrt(1 - normal.x*normal.x - normal.y * normal.y);
return normal;
}
inline fixed3 UnpackNormal(fixed4 packednormal)
{
#if defined(SHADER_API_GLES) && defined(SHADER_API_MOBILE)
return packednormal.xyz * 2 - 1;
#else
fixed3 normal;
normal.xy = packednormal.wy * 2 - 1;
normal.z = sqrt(1 - normal.x*normal.x - normal.y * normal.y);
return normal;
#endif
}
// Shader: 带法线贴图的Surface Shader
// Author: 风宇冲
Shader "Custom/3_NormalMap" {
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_NormalMap ("NormalMap", 2D) = "white" {}
}
Subshader
{
CGPROGRAM
#pragma surface surf BlinnPhong
struct Input
{
float2 uv_MainTex;
};
//法线范围转换:单位法线 float3(x,y,z),x,y,z的取值范围是 [-1,1]。在法线贴图中被压缩在颜色的范围[0,1]中,所以需要转换
//(1)RGB法线贴图
float3 expand(float3 v) { return (v - 0.5) * 2; }
//(2)DXT5nm法线贴图
float3 expand2(float4 v)
{
fixed3 normal;
normal.xy = v.wy * 2 - 1;
normal.z = sqrt(1 - normal.x*normal.x - normal.y * normal.y);
return normal;
}
sampler2D _MainTex;
sampler2D _NormalMap;
void surf(Input IN,inout SurfaceOutput o)
{
half4 c = tex2D(_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb;
o.Alpha = c.a;
//对法线贴图进行采样,取得压缩在颜色空间里的法线([0,1])
float4 packedNormal = tex2D(_NormalMap, IN.uv_MainTex);
//要将颜色空间里的法线[0,1],转换至真正3D空间里的法线范围[-1,1]
//注意:范围基本都是从[0,1]转换至[-1,1].主要是图的通道与法线xyz的对应关系要根据法线贴图格式而定
//UnpackNormal, UnityCG.cginc里的函数
//o.Normal = UnpackNormal(packedNormal);
//expand,标准法线解压函数
o.Normal = expand(packedNormal.xyz);
}
ENDCG
}
}
标签:
原文地址:http://www.cnblogs.com/zdlbbg/p/4329502.html