前言
之前學過一段時間的shader,但是是從看視頻學的,這樣會導致基礎知識不牢固,看了,就是看了而已,不從理解上去學習,
終究只是短時的記憶而已,很容易就忘記,因爲基礎知識的學習,就顯得更加重要了,以前實現shader需求,都是從網上抄抄shader,隨便改改,也沒有去理解每個實現的意義,結果就是知識上並沒有長進;因此呢,打算實打實的從基礎開始,鞏固鞏固;從理解上去學習新知識;好好啃書… 此篇作爲自己的學習筆記;
概念渲染流水線:
需要經歷四大階段:
應用階段,幾何階段,光柵階段,測試階段
測試階段分爲 模板測試,深度測試
概念流水線的完整描述
在ShaderLab中的關係
應用階段相對於shaderlba裏的 a2v (applydata to vertex);
指的是傳遞給頂點着色器的 模型的應用數據;
幾何階段相對於shaderlab裏的 vertex;
光柵化階段相對於 shaderlab裏的 frament;
關於Shader中應用階段中數據:
模型空間下的 頂點信息,法線信息,切線信息,紋理信息等等....
Unity裏有給內置的Struct appdata_full,它可以用於頂點着色器的輸入;
它是Unity的內置 cginc文件,路徑在 Editor\2018.1.9f2\Editor\Data\CGIncludes下,
下,可以看到很多內置的CG 文件;
中文完整解釋
截圖取的是UnityShader入門精要
以下的數據可以作爲 應用數據 傳遞給 頂點着色器,作爲 頂點着色器的輸入;
CPU與GPU之間的通信:
GPU流水線
Unity ShaderLab 結構
Shader "Custom/SpecularVertexLevel" {
Properties {
}
SubShader {
Tags{"xxx"="xxx"}
pass
{
Tags{"xxx"="xxx"}
CGPROGRAM
ENDCG
}
}
FallBack "Diffuse"
}
Properties
語義塊定義,屬性是來用作爲用戶輸入的一部分
屬性類型
變量關係
可以在CGPROGRAM 裏 聲明 取得該變量
Subshader
如果Subshader不能在目標平臺上使用,Unity就會 用備胎, 這個備胎就是FallBack “xxxx” 可以是 任意存在的ShaderName
Tags
用字符鍵值對來表示,中間用空格 隔開
狀態設置 (RenderStep)
以上的RenderStep 和Tags 如果不是在Pass裏寫的,那麼 它們將會應用到每個pass中
pass 可以 存在多個,有時候爲了適應 不同的平臺需要寫不同的pass
pass
CGPROGRAM
在CGPROGRAM 裏 經常要 定義一些 結構體,來存儲 應用傳遞給頂點着色器的數據,a2v , 以及 頂點着色器傳遞給片元着色器的 數據,v2f
這些結構體的聲明,必須要有個語義的聲明,它表達了這個參數的含義。
和 cg/hlsl 編程 裏的語義是 一樣的;
a2v 語義 , 應用數據
這裏的0 ,1 ,2… 可以被認爲是一個存儲該類型的 變量
v2f 頂點着色器傳遞給 片元作色器的 語義
片元作色器函數 用的語義;
SV_Target 這個語義表示 輸出值將會存儲到渲染目標 裏;