Unity Shader筆記

Mesh Filter : 存儲一個Mesh(網格,模型的網格,就是模型的由哪些三角面組成,組成一個什麼樣子的模型,三角面的一些頂點信息)
Mesh Renderer:用來渲染一個模型的外觀,就是樣子, 按照 mesh給它皮膚,給它顏色
    通過Material(材質)控制模型渲染的樣子

    Material
        貼圖(可以沒有,可以是一個單純的顏色)
        Shader

書籍
    unity shader 入門精要(樂樂程序猿)
    unity 3d shaderlab開發實戰詳解(第二版)
    unity 5.x shaders and effects cookbook(中文版 unity着色器和屏幕特效開發祕籍)
    
CG語言教程官網
    http://http.developer.nvidia.com/CgTutorial/cg_tutorial_frontmatter.html
    
一些網站
    www.shadertoy.com
    http://blog.csdn.net/poem_qianmo?viewmode=contents
    
數學函數在線演示
    http://zh.numberempire.com/graphingcalculator.php
    
UnityCG.cginc中一些常用的函數
    
    //攝像機方向(視角方向)
    float3 WorldSpaceViewDir(float4 v)      根據模型空間中的頂點座標 得到 (世界空間)從這個點到攝像機的觀察方向
    float3 UnityWorldSpaceViewDir(float4 v) 世界空間中的頂點座標==》世界空間從這個點到攝像機的觀察方向
    float3 ObjSpaceViewDir(float4 v)         模型空間中的頂點座標==》模型空間從這個點到攝像機的觀察方向
    //光源方向
    float3 WorldSpaceLightDir(float4 v)     模型空間中的頂點座標==》世界空間中從這個點到光源的方向
    float3 UnityWorldSpaceLightDir(float4 v)     世界空間中的頂點座標==》世界空間中從這個點到光源的方向
    float3 ObjSpaceLightDir(float4 v)     模型空間中的頂點座標==》模型空間中從這個點到光源的方向
    //方向轉換
    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,固定函數着色器 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"{}
        
從應用程序傳遞到頂點函數的語義有哪些a2v
POSITION 頂點座標(模型空間下的)
NORMAL 法線( 模型空間下)
TANGENT 切線(模型空間)
TEXCOORD0 ~n 紋理座標
COLOR 頂點顏色

從頂點函數傳遞給片元函數的時候可以使用的語義
SV_POSITION 剪裁空間中的頂點座標(一般是系統直接使用)
COLOR0 可以傳遞一組值 4個
COLOR1 可以傳遞一組值 4個
TEXCOORD0~7 傳遞紋理座標

片元函數傳遞給系統
SV_Target 顏色值,顯示到屏幕上的顏色

什麼是光照模型
光照模型就是一個公式,使用這個公式來計算在某個點的光照效果

標準光照模型
在標準光照模型裏面,我們把進入攝像機的光分爲下面四個部分
自發光
高光反射
Blinn光照模型
Specular=直射光  * pow( max(cosθ,0),10)  θ:是反射光方向和視野方向的夾角
Blinn-Phong光照模型
Specular=直射光  * pow( max(cosθ,0),10)  θ:是法線和x的夾角  x 是平行光和視野方向的平分線
漫反射 Diffuse = 直射光顏色 * max(0,cos夾角(光和法線的夾角) )  cosθ = 光方向· 法線方向
環境光

Tags{ "LightMode"="ForwardBase" }
只有定義了正確的LightMode才能得到一些Unity的內置光照變量
#include "Lighting.cginc"
包含unity的內置的文件,纔可以使用unity內置的一些變量

normalize() 用來把一個向量,單位化(原來方向保持不變,長度變爲1)
max() 用來取得函數中最大的一個
dot 用來取得兩個向量的點積
_WorldSpaceLightPos0 取得平行光的位置
_LightColor0取得平行光的顏色
UNITY_MATRIX_MVP 這個矩陣用來把一個座標從模型空間轉換到剪裁空間
_World2Object 這個矩陣用來把一個方向從世界空間轉換到模型空間
UNITY_LIGHTMODEL_AMBIENT用來獲取環境光

半蘭伯特光照模型
Diffuse = 直射光顏色 *( cosθ *0.5 +0.5 )
蘭伯特光照模型
Diffuse = 直射光顏色 * max(0,cos夾角(光和法線的夾角) )  cosθ = 光方向· 法線方向

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章