这里写目录标题
添加纹理映射(坐标和偏移)
总结
tex2D():融合纹理坐标和贴图坐标点的像素
Shader "StudyShader/SpecularReflection" //Blinn-Phong
{
Properties
{
_Diffuse("Diffuse",Color) = (1,1,1,1)
_SpecularColor("SpecularColor",Color) = (1,1,1,1)
_Gloss("Gloss",Range(8,200)) = 10
_MainTexture("MainTexture",2D) = "while"{}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// make fog work
#pragma multi_compile_fog
#include "UnityCG.cginc"
#include "Lighting.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
float3 normal:NORMAL;
};
struct v2f
{
float2 uv : TEXCOORD0;
UNITY_FOG_COORDS(1)
float4 vertex : SV_POSITION;
fixed3 color:COLOR;
};
fixed4 _Diffuse;
fixed4 _SpecularColor;
half _Gloss;
sampler2D _MainTexture;
float4 _MainTexture_ST;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex); //模型空间顶点到剪裁空间顶点的转换
o.uv = v.uv;
fixed3 normalDir = normalize(UnityObjectToWorldNormal(v.normal));
o.color = normalDir;
return o;
}
fixed4 frag (v2f i) : SV_Target
{
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb; //Unity内置宏,获取环境光
fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz); //平行光方向
fixed3 texColor = tex2D(_MainTexture,i.uv.xy*_MainTexture_ST.xy+_MainTexture_ST.zw); //融合纹理坐标
fixed3 diffuse = _LightColor0.rgb *texColor* max(0,dot(i.color,lightDir)*0.5+0.5); // 漫反射
fixed3 reflectDir = normalize(reflect(-lightDir,i.color)); //求得反射光的方向
fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz-WorldSpaceViewDir(i.vertex)); //视野方向
fixed3 bisector = normalize(viewDir+lightDir); //平分线方向 相加即可
fixed3 specular = _LightColor0.rgb*_SpecularColor.rgb*pow(max(dot(i.color,bisector),0),_Gloss);
return fixed4(diffuse+ambient*texColor+specular,1);
}
ENDCG
}
}
}
添加法线贴图(凹凸控制)
总结
-
切线空间:是由模型空间下切线和法线决定的
-
TANGENT_SPACE_ROTATION:调用后会得到一个矩阵rotation 这个矩阵用来把模型空间的方向转换成切线空间下的
-
mul(rotation,ObjSpaceLightDir(v.vertex));//得到模型空间下的平行光方向,并转换到切线空间下(平行光有一个_WorldSpaceLightPos0.xyz属于世界空间下)
-
UnpackNormal:贴图颜色信息转换为高度值(2*x+1)
-
控制凹凸值乘的是xy: tangentNormal.xy = tangentNormal.xy *_BumpScale;
Shader "StudyShader/SpecularReflection" //Blinn-Phong
{
Properties
{
_Diffuse("Diffuse",Color) = (1,1,1,1)
_SpecularColor("SpecularColor",Color) = (1,1,1,1)
_Gloss("Gloss",Range(8,200)) = 10
_MainTexture("MainTexture",2D) = "while"{}
_NormalMap("NormalMap",2D) = "bump"{}
_BumpScale("bump Scale",Float) = 1
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// make fog work
#pragma multi_compile_fog
#include "UnityCG.cginc"
#include "Lighting.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
float3 normal:NORMAL; //切线空间的确定是通过法线和切线确定的
float4 tangent:TANGENT; //TANGENT.w是用来确定切线空间坐标轴的方向的
};
struct v2f
{
float4 uv : TEXCOORD0;
float3 lightDir:TEXCOORD1;
UNITY_FOG_COORDS(1)
float4 vertex : SV_POSITION;
fixed3 color:COLOR;
};
fixed4 _Diffuse;
fixed4 _SpecularColor;
half _Gloss;
sampler2D _MainTexture;
float4 _MainTexture_ST;
sampler2D _NormalMap;
float4 _NormalMap_ST;
float _BumpScale;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex); //模型空间顶点到剪裁空间顶点的转换
o.uv.xy = v.uv.xy*_MainTexture_ST.xy+_MainTexture_ST.zw;
o.uv.zw = v.uv.xy * _NormalMap_ST.xy+_NormalMap_ST.zw;
fixed3 normalDir = normalize(UnityObjectToWorldNormal(v.normal));
TANGENT_SPACE_ROTATION; //调用后会得到一个矩阵rotation 这个矩阵用来把模型空间的方向转换成切线空间下的
o.lightDir = mul(rotation,ObjSpaceLightDir(v.vertex));//得到模型空间下的平行光方向,并转换到切线空间下
o.color = normalDir;
return o;
}
fixed4 frag (v2f i) : SV_Target
{
fixed4 normalColor = tex2D(_NormalMap,i.uv.zw); //发现贴图的颜色信息
fixed3 tangentNormal = UnpackNormal(normalColor);//UnpackNormal 贴图颜色信息转换为高度值
tangentNormal.xy = tangentNormal.xy *_BumpScale;
tangentNormal = normalize(tangentNormal);
fixed3 lightDir = normalize(i.lightDir);
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb; //Unity内置宏,获取环境光
//fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz); //平行光方向
fixed3 texColor = tex2D(_MainTexture,i.uv.xy); //融合纹理坐标
fixed3 diffuse = _LightColor0.rgb *texColor* max(0,dot(tangentNormal,lightDir)*0.5+0.5); // 漫反射
fixed3 reflectDir = normalize(reflect(-lightDir,i.color)); //求得反射光的方向
fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz-WorldSpaceViewDir(i.vertex)); //视野方向
fixed3 bisector = normalize(viewDir+lightDir); //平分线方向 相加即可
fixed3 specular = _LightColor0.rgb*_SpecularColor.rgb*pow(max(dot(i.color,bisector),0),_Gloss);
return fixed4(diffuse+ambient*texColor+specular,1);
}
ENDCG
}
}
}
透明度
总结
-
“Queue”=“Transparent”:渲染队列,透明物体放在最后渲染
-
“IngnoreProjector”=“True” :忽视阴影
-
“RenderType”=“Transparent”
-
ZWrite off :关深度读值
-
Blend SrcAlpha OneMinusSrcAlpha:混合渲染
Shader "StudyShader/SpecularReflection" //Blinn-Phong
{
Properties
{
_Diffuse("Diffuse",Color) = (1,1,1,1)
_SpecularColor("SpecularColor",Color) = (1,1,1,1)
_Gloss("Gloss",Range(8,200)) = 10
_MainTexture("MainTexture",2D) = "while"{}
_NormalMap("NormalMap",2D) = "bump"{}
_BumpScale("bump Scale",Float) = 1
_Alpha("Alpha",Float) = 1
}
SubShader
{
Tags { "RenderType"="Opaque" "Queue"="Transparent" "IngnoreProjector"="True" "RenderType"="Transparent" }
//队列 忽视阴影
LOD 100
Pass
{
ZWrite off//关闭深度值
Blend SrcAlpha OneMinusSrcAlpha//混合渲染
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// make fog work
#pragma multi_compile_fog
#include "UnityCG.cginc"
#include "Lighting.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
float3 normal:NORMAL; //切线空间的确定是通过法线和切线确定的
float4 tangent:TANGENT; //TANGENT.w是用来确定切线空间坐标轴的方向的
};
struct v2f
{
float4 uv : TEXCOORD0;
float3 lightDir:TEXCOORD1;
UNITY_FOG_COORDS(1)
float4 vertex : SV_POSITION;
fixed3 color:COLOR;
};
fixed4 _Diffuse;
fixed4 _SpecularColor;
half _Gloss;
sampler2D _MainTexture;
float4 _MainTexture_ST;
sampler2D _NormalMap;
float4 _NormalMap_ST;
float _BumpScale;
float _Alpha;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex); //模型空间顶点到剪裁空间顶点的转换
o.uv.xy = v.uv.xy*_MainTexture_ST.xy+_MainTexture_ST.zw;
o.uv.zw = v.uv.xy * _NormalMap_ST.xy+_NormalMap_ST.zw;
fixed3 normalDir = normalize(UnityObjectToWorldNormal(v.normal));
TANGENT_SPACE_ROTATION; //调用后会得到一个矩阵rotation 这个矩阵用来把模型空间的方向转换成切线空间下的
o.lightDir = mul(rotation,ObjSpaceLightDir(v.vertex));//得到模型空间下的平行光方向,并转换到切线空间下
o.color = normalDir;
return o;
}
fixed4 frag (v2f i) : SV_Target
{
fixed4 normalColor = tex2D(_NormalMap,i.uv.zw); //发现贴图的颜色信息
fixed3 tangentNormal = UnpackNormal(normalColor);//UnpackNormal 贴图颜色信息转换为高度值
tangentNormal.xy = tangentNormal.xy *_BumpScale;
tangentNormal = normalize(tangentNormal);
fixed3 lightDir = normalize(i.lightDir);
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb; //Unity内置宏,获取环境光
//fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz); //平行光方向
fixed3 texColor = tex2D(_MainTexture,i.uv.xy); //融合纹理坐标
fixed3 diffuse = _LightColor0.rgb *texColor* max(0,dot(tangentNormal,lightDir)*0.5+0.5); // 漫反射
fixed3 reflectDir = normalize(reflect(-lightDir,i.color)); //求得反射光的方向
fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz-WorldSpaceViewDir(i.vertex)); //视野方向
fixed3 bisector = normalize(viewDir+lightDir); //平分线方向 相加即可
fixed3 specular = _LightColor0.rgb*_SpecularColor.rgb*pow(max(dot(i.color,bisector),0),_Gloss);
return fixed4(diffuse+ambient*texColor+specular,_Alpha);
}
ENDCG
}
}
}