Mesh Filter : 存儲(chǔ)一個(gè)Mesh(網(wǎng)格遣总,模型的網(wǎng)格埃脏,就是模型的由哪些三角面組成诗赌,組成一個(gè)什么樣子的模型,三角面的一些頂點(diǎn)信息)
Mesh Renderer:用來(lái)渲染一個(gè)模型的外觀被饿,就是樣子四康, 按照 mesh給它皮膚,給它顏色
通過(guò)Material(材質(zhì))控制模型渲染的樣子
Material貼圖(可以沒(méi)有狭握,可以是一個(gè)單純的顏色)
Shader書(shū)籍
unity shader 入門(mén)精要(樂(lè)樂(lè)程序猿)
unity 3d shaderlab開(kāi)發(fā)實(shí)戰(zhàn)詳解(第二版)
unity 5.x shaders and effects cookbook(中文版 unity著色器和屏幕特效開(kāi)發(fā)秘籍)
CG語(yǔ)言教程官網(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ù)學(xué)函數(shù)在線演示
http://zh.numberempire.com/graphingcalculator.php
UnityCG.cginc中一些常用的函數(shù)
//攝像機(jī)方向(視角方向)
float3 WorldSpaceViewDir(float4 v) 根據(jù)模型空間中的頂點(diǎn)坐標(biāo) 得到 (世界空間)從這個(gè)點(diǎn)到攝像機(jī)的觀察方向
float3 UnityWorldSpaceViewDir(float4 v) 世界空間中的頂點(diǎn)坐標(biāo)==》世界空間從這個(gè)點(diǎn)到攝像機(jī)的觀察方向
float3 ObjSpaceViewDir(float4 v) 模型空間中的頂點(diǎn)坐標(biāo)==》模型空間從這個(gè)點(diǎn)到攝像機(jī)的觀察方向
//光源方向
float3 WorldSpaceLightDir(float4 v) 模型空間中的頂點(diǎn)坐標(biāo)==》世界空間中從這個(gè)點(diǎn)到光源的方向
float3 UnityWorldSpaceLightDir(float4 v) 世界空間中的頂點(diǎn)坐標(biāo)==》世界空間中從這個(gè)點(diǎn)到光源的方向
float3 ObjSpaceLightDir(float4 v) 模型空間中的頂點(diǎn)坐標(biāo)==》模型空間中從這個(gè)點(diǎn)到光源的方向
//方向轉(zhuǎn)換
float3 UnityObjectToWorldNormal(float3 norm) 把法線方向 模型空間==》世界空間
float3 UnityObjectToWorldDir(float3 dir) 把方向 模型空間=》世界空間
float3 UnityWorldToObjectDir(float3 dir) 把方向 世界空間=》模型空間
什么是OpenGL闪金、DirectX
shader可以認(rèn)為是一種渲染命令 ,由opengl 或者dx進(jìn)行解析哥牍,來(lái)控制渲染豐富多彩的圖形
OpenGL 使用GLSL 編寫(xiě)shader
DirectX 使用HSSL 編寫(xiě)shader
英偉達(dá) CG 編寫(xiě)shader(跨平臺(tái))
Unity Shader的分類
使用的是ShaderLab編寫(xiě)Unity中的Shader
1,表面著色器 Surface Shader
2,頂點(diǎn)/片元著色器 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)用程序傳遞到頂點(diǎn)函數(shù)的語(yǔ)義有哪些a2v
POSITION 頂點(diǎn)坐標(biāo)(模型空間下的)
NORMAL 法線( 模型空間下)
TANGENT 切線(模型空間)
TEXCOORD0 ~n 紋理坐標(biāo)
COLOR 頂點(diǎn)顏色
從頂點(diǎn)函數(shù)傳遞給片元函數(shù)的時(shí)候可以使用的語(yǔ)義
SV_POSITION 剪裁空間中的頂點(diǎn)坐標(biāo)(一般是系統(tǒng)直接使用)
COLOR0 可以傳遞一組值 4個(gè)
COLOR1 可以傳遞一組值 4個(gè)
TEXCOORD0~7 傳遞紋理坐標(biāo)
片元函數(shù)傳遞給系統(tǒng)
SV_Target 顏色值毕泌,顯示到屏幕上的顏色
shader中的各種空間坐標(biāo)
http://blog.csdn.net/lyh916/article/details/50906272
什么是切線空間
http://blog.csdn.net/bonchoix/article/details/8619624
pixel = (normal+1)/2
normal = pixel*2 - 1
第一個(gè)Shader的編寫(xiě)
Shader"Use Struct"{
properties{
//在這里編寫(xiě)屬性
_Color("Color",Color) = (1,1,1,1)
}
//SubShader可以寫(xiě)多個(gè),顯卡運(yùn)行效果的時(shí)候嗅辣,從第一個(gè)SubShader開(kāi)始撼泛,
//如果第一個(gè)SubShader里面的效果都可以實(shí)現(xiàn)那就使用第一個(gè)SubShader,如果顯卡發(fā)現(xiàn)這個(gè)SubShader里面效果它實(shí)現(xiàn)不了澡谭,
//那它會(huì)去運(yùn)行下一個(gè)SubShader
SubShader{
//這里編寫(xiě)的是渲染的代碼控制渲染的效果愿题,不同的SubShader實(shí)現(xiàn)不同的渲染效果
Pass {//至少有一個(gè)Pass塊
//在這里編寫(xiě)Shader代碼
CGPROGRAM
//使用CG語(yǔ)言編寫(xiě)Shader代碼
//頂點(diǎn)函數(shù) 這里只是申明了頂點(diǎn)函數(shù)的函數(shù)名
//基本作用是 完成頂點(diǎn)坐標(biāo)從模型空間到剪裁空間的轉(zhuǎn)換(從游戲環(huán)境轉(zhuǎn)換到視野相機(jī)屏幕上)
#pragma vertex vert
//片元函數(shù) 這里只是申明了片元函數(shù)的函數(shù)名
//基本作用 返回模型對(duì)應(yīng)的屏幕上的每一個(gè)像素的顏色值
#pragma fragment frag
//appllcation to vertex
//a2v 從應(yīng)用程序傳遞到頂點(diǎn)的函數(shù)的語(yǔ)義
//POSITION:頂點(diǎn)坐標(biāo)(模型空間下的)
//NORMAL:法線(模型空間下)
//TANGENT:切線(模型空間下)
//TEXCOORD0~7 紋理坐標(biāo)
//COLOR 頂點(diǎn)顏色
//結(jié)構(gòu)體
struct a2v {
float4 vertex:POSITION;//告訴unity 把模型空間下的頂點(diǎn)坐標(biāo)填充給vertex;
float3 normal:NORMAL;//告訴unity把模型空間下的法線方向填充給normal损俭;
float4 texcoord:TEXCOORD0;//告訴unity把第一套紋理坐標(biāo)填充給texcoord;
};
//從頂點(diǎn)函數(shù)傳遞給片元函數(shù)的時(shí)候可以使用的語(yǔ)義
//SV_POSITION 剪裁空間中的頂點(diǎn)坐標(biāo)(一般是系統(tǒng)直接使用)
//COLOR0 可以傳遞一組值 4個(gè)
//COLOR1 可以傳遞一組值 4個(gè)
//TEXCOORD0~7 傳遞紋理坐標(biāo)
struct v2f {
//SV_POSITION:這個(gè)語(yǔ)義是用來(lái)解釋說(shuō)明返回值,意思是返回值是剪裁空間下的頂點(diǎn)坐標(biāo)
float4 position:SV_POSITION;
float3 temp:Color0;//Color0 這個(gè)語(yǔ)義可以由用戶定義潘酗,一般都存儲(chǔ)顏色 可以做數(shù)據(jù)的傳遞
};
//
v2f vert(a2v v) {
v2f f;
//這是把一個(gè)坐標(biāo)跟一個(gè)矩陣相乘杆兵,使用一個(gè)宏,這是一個(gè)4*4的矩陣,這個(gè)矩陣是專門(mén)完成從模型空間到剪裁空間的轉(zhuǎn)換的
f.position = UnityObjectToClipPos(v.vertex);//矩陣的作用就是完成一個(gè)空間轉(zhuǎn)換的過(guò)程
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://備用琐脏,當(dāng)前面的SubShader都無(wú)法使用的時(shí)候會(huì)調(diào)用這個(gè)
}