Mesh Filter : 存儲一個Mesh(網(wǎng)格,模型的網(wǎng)格,就是模型的由哪些三角面組成,組成一個什么樣子的模型,三角面的一些頂點信息)
Mesh Renderer:用來渲染一個模型的外觀,就是樣子, 按照 mesh給它皮膚,給它顏色
通過Material(材質(zhì))控制模型渲染的樣子
Material貼圖(可以沒有,可以是一個單純的顏色)
Shader書籍
unity shader 入門精要(樂樂程序猿)
unity 3d shaderlab開發(fā)實戰(zhàn)詳解(第二版)
unity 5.x shaders and effects cookbook(中文版 unity著色器和屏幕特效開發(fā)秘籍)
CG語言教程官網(wǎng)
http://http.developer.nvidia.com/CgTutorial/cg_tutorial_frontmatter.html
一些網(wǎng)站
www.shadertoy.com
http://blog.csdn.net/poem_qianmo?viewmode=contents
數(shù)學函數(shù)在線演示
http://zh.numberempire.com/graphingcalculator.php
UnityCG.cginc中一些常用的函數(shù)
//攝像機方向(視角方向)
float3 WorldSpaceViewDir(float4 v) 根據(jù)模型空間中的頂點坐標 得到 (世界空間)從這個點到攝像機的觀察方向
float3 UnityWorldSpaceViewDir(float4 v) 世界空間中的頂點坐標==》世界空間從這個點到攝像機的觀察方向
float3 ObjSpaceViewDir(float4 v) 模型空間中的頂點坐標==》模型空間從這個點到攝像機的觀察方向
//光源方向
float3 WorldSpaceLightDir(float4 v) 模型空間中的頂點坐標==》世界空間中從這個點到光源的方向
float3 UnityWorldSpaceLightDir(float4 v) 世界空間中的頂點坐標==》世界空間中從這個點到光源的方向
float3 ObjSpaceLightDir(float4 v) 模型空間中的頂點坐標==》模型空間中從這個點到光源的方向
//方向轉(zhuǎn)換
float3 UnityObjectToWorldNormal(float3 norm) 把法線方向 模型空間==》世界空間
float3 UnityObjectToWorldDir(float3 dir) 把方向 模型空間=》世界空間
float3 UnityWorldToObjectDir(float3 dir) 把方向 世界空間=》模型空間
什么是OpenGL、DirectX
shader可以認為是一種渲染命令 ,由opengl 或者dx進行解析,來控制渲染豐富多彩的圖形
OpenGL 使用GLSL 編寫shader
DirectX 使用HSSL 編寫shader
英偉達 CG 編寫shader(跨平臺)
Unity Shader的分類
使用的是ShaderLab編寫Unity中的Shader
1,表面著色器 Surface Shader
2,頂點/片元著色器 Vertex/Fragment Shader
3,固定函數(shù)著色器 Fixed Function Shader
Unityshader中屬性的類型有哪些
_Color("Color",Color)=(1,1,1,1)
_Vector("Vector",Vector)=(1,2,3,4)
_Int("Int",Int)= 34234
_Float("Float",Float) = 4.5
_Range("Range",Range(1,11))=6
_2D("Texture",2D) = "red"{}
_Cube("Cube",Cube) = "white"{}
_3D("Texure",3D) = "black"{}
從應(yīng)用程序傳遞到頂點函數(shù)的語義有哪些a2v
POSITION 頂點坐標(模型空間下的)
NORMAL 法線( 模型空間下)
TANGENT 切線(模型空間)
TEXCOORD0 ~n 紋理坐標
COLOR 頂點顏色
從頂點函數(shù)傳遞給片元函數(shù)的時候可以使用的語義
SV_POSITION 剪裁空間中的頂點坐標(一般是系統(tǒng)直接使用)
COLOR0 可以傳遞一組值 4個
COLOR1 可以傳遞一組值 4個
TEXCOORD0~7 傳遞紋理坐標
片元函數(shù)傳遞給系統(tǒng)
SV_Target 顏色值,顯示到屏幕上的顏色
shader中的各種空間坐標
http://blog.csdn.net/lyh916/article/details/50906272
什么是切線空間
http://blog.csdn.net/bonchoix/article/details/8619624
pixel = (normal+1)/2
normal = pixel*2 - 1
第一個Shader的編寫
Shader"Use Struct"{
properties{
//在這里編寫屬性
_Color("Color",Color) = (1,1,1,1)
}
//SubShader可以寫多個,顯卡運行效果的時候,從第一個SubShader開始,
//如果第一個SubShader里面的效果都可以實現(xiàn)那就使用第一個SubShader,如果顯卡發(fā)現(xiàn)這個SubShader里面效果它實現(xiàn)不了,
//那它會去運行下一個SubShader
SubShader{
//這里編寫的是渲染的代碼控制渲染的效果,不同的SubShader實現(xiàn)不同的渲染效果
Pass {//至少有一個Pass塊
//在這里編寫Shader代碼
CGPROGRAM
//使用CG語言編寫Shader代碼
//頂點函數(shù) 這里只是申明了頂點函數(shù)的函數(shù)名
//基本作用是 完成頂點坐標從模型空間到剪裁空間的轉(zhuǎn)換(從游戲環(huán)境轉(zhuǎn)換到視野相機屏幕上)
#pragma vertex vert
//片元函數(shù) 這里只是申明了片元函數(shù)的函數(shù)名
//基本作用 返回模型對應(yīng)的屏幕上的每一個像素的顏色值
#pragma fragment frag
//appllcation to vertex
//a2v 從應(yīng)用程序傳遞到頂點的函數(shù)的語義
//POSITION:頂點坐標(模型空間下的)
//NORMAL:法線(模型空間下)
//TANGENT:切線(模型空間下)
//TEXCOORD0~7 紋理坐標
//COLOR 頂點顏色
//結(jié)構(gòu)體
struct a2v {
float4 vertex:POSITION;//告訴unity 把模型空間下的頂點坐標填充給vertex;
float3 normal:NORMAL;//告訴unity把模型空間下的法線方向填充給normal;
float4 texcoord:TEXCOORD0;//告訴unity把第一套紋理坐標填充給texcoord;
};
//從頂點函數(shù)傳遞給片元函數(shù)的時候可以使用的語義
//SV_POSITION 剪裁空間中的頂點坐標(一般是系統(tǒng)直接使用)
//COLOR0 可以傳遞一組值 4個
//COLOR1 可以傳遞一組值 4個
//TEXCOORD0~7 傳遞紋理坐標
struct v2f {
//SV_POSITION:這個語義是用來解釋說明返回值,意思是返回值是剪裁空間下的頂點坐標
float4 position:SV_POSITION;
float3 temp:Color0;//Color0 這個語義可以由用戶定義,一般都存儲顏色 可以做數(shù)據(jù)的傳遞
};
//
v2f vert(a2v v) {
v2f f;
//這是把一個坐標跟一個矩陣相乘,使用一個宏,這是一個4*4的矩陣,這個矩陣是專門完成從模型空間到剪裁空間的轉(zhuǎn)換的
f.position = UnityObjectToClipPos(v.vertex);//矩陣的作用就是完成一個空間轉(zhuǎn)換的過程
f.temp = v.normal;
return f;
}
//片元函數(shù)傳遞給系統(tǒng)
//SV_Target 顏色值,顯示到屏幕上的顏色
fixed4 frag(v2f f) :SV_Target{
return fixed4(f.temp,1);
}
ENDCG
}
}
Fallback"VertexLit"http://備用,當前面的SubShader都無法使用的時候會調(diào)用這個
}
