您的位置:首页 > 移动开发 > Unity3D

Unity Shader 学习笔记 (七) 根据切线和法线方向设置模型颜色shader

2015-08-18 22:06 786 查看

Unity Shader 学习笔记 (七) 根据切线和法线方向设置模型颜色shader

法线方向颜色Shader

Shader代码

Shader "Custom/faxianColor" {
SubShader {

Pass {
Fog { Mode Off}
CGPROGRAM

//顶点着色函数入口
#pragma vertex vert
//片段着色函数入口
#pragma fragment frag

#include "UnityCG.cginc"

//定义顶点数据结构体
struct v2f
{
float4 pos : SV_POSITION ;
float3 color :COLOR0 ;
};
v2f vert (appdata_base appdata)
{
v2f outdata;
outdata.pos = mul (UNITY_MATRIX_MVP , appdata.vertex );
outdata.color = appdata.normal * 0.5 + 0.5 ;
return outdata;
}
fixed4 frag (v2f i) : COLOR0 {
//片段程序,直接返回顶点颜色
return half4(i.color,1);
}

ENDCG
}

}
FallBack "Diffuse"
}


注:这里使用了Unity预定义的输入结构体 appdata_base 其中包括了很多信息,可以直接用作为定点着色程序的输入
appdata.normal 表示当前位置的法向量
由于法向量的取值范围 (-1,-1,-1) 到 (1,1,1) , 而
outdata.color , 也就是最终显示出来的的颜色的取值范围是 (0,0,0) 到 (1,1,1)
, 超出这个范围就会显示黑色,

所以经过一个简单的转换 appdata.normal * 0.5 + 0.5 ;将法向量与颜色一一对应起来

UnityCG.cginc Unity内建的预定义输入结构体

所在目录 : Unity安装目录\Unity\Editor\Data\CGIncludes 例如 : D:\Program Files (x86)\Unity\Editor\Data\CGIncludes , 文件中定义好了几种Unity预定义好的输入结构体
分别为 appdata_base,appdata_tan , appdata_full

struct appdata_base {
float4 vertex : POSITION;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
};

struct appdata_tan {
float4 vertex : POSITION;
float4 tangent : TANGENT;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
};

struct appdata_full {
float4 vertex : POSITION;
float4 tangent : TANGENT;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
float4 texcoord1 : TEXCOORD1;
fixed4 color : COLOR;
#if defined(SHADER_API_XBOX360)
half4 texcoord2 : TEXCOORD2;
half4 texcoord3 : TEXCOORD3;
half4 texcoord4 : TEXCOORD4;
half4 texcoord5 : TEXCOORD5;
#endif
};


顶点着色器可以根据语义获取到的全部mesh信息有

float4 vertex : POSITION; //顶点坐标

float4 tangent : TANGENT; // tangent,三角函数的一种,缩写为tan我们很熟悉了,他的值是mesh到表面法线的正切值

float3 normal : NORMAL; //表面法向量,以对象的坐标系标准化至单位长度

float4 texcoord : TEXCOORD0;//纹理坐标系的第0个集合

float4 texcoord1 : TEXCOORD1; //纹理坐标系的第1个集合

fixed4 color : COLOR;//颜色,通常为常数


Shader效果



切线方向颜色Shader

Shader代码

Shader "Custom/qiexianColor" {
SubShader {

Pass {
Fog { Mode Off}
CGPROGRAM

//顶点着色函数入口
#pragma vertex vert
//片段着色函数入口
#pragma fragment frag
//输入位置和切线数据
struct appData
{
float4 vertex : POSITION ;
float4 tangent : TANGENT ;
};
//定义顶点数据结构体
struct v2f
{
float4 pos : SV_POSITION ;
float4 color :COLOR ;
};
v2f vert (appData appdata)
{
v2f outdata;
outdata.pos = mul (UNITY_MATRIX_MVP , appdata.vertex );
outdata.color = appdata.tangent * 0.5 + 0.5 ;
return outdata;
}
fixed4 frag (v2f i) : COLOR0 {
//片段程序,直接返回顶点颜色
return i.color;
}

ENDCG
}

}
FallBack "Diffuse"
}


注: 这里使用了自己定义的结构体appData,作为顶点着色程序的输入 , 其实也可以像上面一样是用Unity预定义好的结构体 appdata_tan 或者 appdata_full,在顶点着色程序中appdata.tangent 获取了当前法线的正切值, 这个值的取值范围也是 (-1,-1,-1) 到 (1,1,1) ,所以也要做和上面shader
相同的处理,将法线的正切值和颜色一一对应


Shader效果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: