著色器的渲染流程? ? (先過一遍流程椭员,有個概念)
頂點數(shù)據(jù) -> 頂點著色器 -> 細(xì)分著色器 -> 集合著色器 -> 圖元設(shè)置(裝配)-> 根據(jù)投影剪切 -> 光柵化 -> 片元著色器 -> 效果
上下文 【Context】
? ? ????context從本質(zhì)上來講是一個巨大的狀態(tài)機永淌,它記錄了關(guān)于圖形的各種狀態(tài)胆数,類比PS的話怒允,狀態(tài)機記錄了畫筆的顏色砰嘁,畫筆的像素點大小淑蔚,畫筆的種類市殷,當(dāng)點擊畫筆的時候,畫筆的屬性會自動被設(shè)置成狀態(tài)機所記錄下的屬性刹衫,從狹義上來說醋寝,狀態(tài)機就是記錄著很多工具的各種屬性。而OpenGL則有非常多的狀態(tài)带迟,保存這些狀態(tài)的狀態(tài)機就是context
? ? ? ? OpenGL的函數(shù)類似于C語言音羞,都是面向過程的函數(shù),對OpenGL對操作實際上是對OpenGL對某個狀態(tài)或某個工具進(jìn)行的操作仓犬,在后續(xù)開發(fā)中嗅绰,可以基于一定的環(huán)境,對OpenGL指令集進(jìn)行封裝搀继,便可以轉(zhuǎn)花紋面對對象對操作窘面,但OpenGL本身仍是面向過程的
渲染
????????將一張圖片或者控件或視頻顯示到屏幕上的過程,這個過程被稱為‘渲染’
頂點數(shù)組
? ? ? ? 在OpenGL中律歼,所有圖形都是由若干個三角形組成民镜,每個三角形會有三個頂點,每個頂點會有(x,y,z)3個坐標(biāo)
? ? ? ? OpenGL坐標(biāo)系中险毁,每個軸最大值為1制圈,最小值為-1们童,分別對應(yīng)屏幕的一端到另一端,屏幕正中心的坐標(biāo)為(0,0)
? ? ? ? 頂點數(shù)組是存儲于內(nèi)存中的
頂點緩沖區(qū)
? ? ? ? 為了使GPU更高效的工作鲸鹦,會將即將使用的頂點數(shù)組復(fù)制到GPU顯存中慧库,以便于GPU快速處理數(shù)據(jù),而存放這些頂點數(shù)據(jù)的區(qū)域則稱之為‘頂點緩沖區(qū)’
位圖
? ? ? ? 內(nèi)存并不能直接處理圖片(png\jepg)本身馋嗜,而是通過將圖片的每一個像素點的RGBA值進(jìn)行儲存齐板,以這種形式進(jìn)行儲存的圖片數(shù)據(jù)稱之為‘位圖’
? ? ? ? 位圖本身過于龐大,例如一張100*100像素位圖葛菇,會占用10000個像素點甘磨,每個像素點會占用R,G,B,A也就是4*8bit=4B(FF -> 1111 1111),10000個像素點會占用40000B(40KB)的內(nèi)存眯停,一張100*100的png一般在1kb~15kb(我把一張4k圖片暴力壓縮到100*100济舆,最后是14kb,png圖片會比jpg圖片更大一點)之間莺债,可見滋觉,位圖不適合用于儲存,因此齐邦,則需要壓縮后再進(jìn)行儲存椎侠,而再編程中若要使用圖片,則需要先解碼措拇,再渲染我纪。
? ? ? ? 一般所說的png或jpg是通過壓縮而來的。
映射
? ? ? ? 例如:由png轉(zhuǎn)換為位圖的過程中丐吓,會將圖片上的一個像素點轉(zhuǎn)換為屏幕上的像素點宣羊,這個過程稱之為 ‘映射’ (實際上,是頂點坐標(biāo)與紋理坐標(biāo)的映射)
管線
? ? ? ? 無論是png轉(zhuǎn)換為位圖后渲染汰蜘,或是位圖轉(zhuǎn)換為png進(jìn)行儲存,都有一條固定的流程之宿,這個過程是線性切不可逆的族操,那些特定的流程稱之為 ‘管線’
固定管線
? ? ? ? 在管線中,會有很多特定的流程比被,有些流程是可以進(jìn)行干預(yù)甚至修改內(nèi)部操作的(定制)色难,有些是不可以進(jìn)行操作的,這些不可以操作(只能傳入符合條件的值等缀,并得到特定的值枷莉,是不可修改的庫)的流程稱之為 ‘固定管線’,又稱之為 ‘固定著色器’
?可編程管線
? ? ? ? ? 相對于固定管線尺迂,那些可以進(jìn)行操作(編程笤妙、定制)的管線稱為 ‘固定管線’
著色器? 【Shader】
? ? ? ? 在編程中冒掌,一般我們所寫的 函數(shù)/方法 是CPU來進(jìn)行調(diào)用的,還有一些代碼是專門用于GPU來調(diào)用的蹲盘,這些代碼稱之為 ‘著色器’股毫,見百度詞條<著色器>
固定著色器
? ? ? ? OpenGL所提供的不可編程的著色器
自定義著色器
? ? ? ? 程序員基于GLSL語法來進(jìn)行開發(fā)(定制)的著色器
? ? ? ? 頂點著色器:用來處理頂點相關(guān)的著色器 1.確定位置,2.縮放/平移/旋轉(zhuǎn)召衔,3.3D圖形轉(zhuǎn)換為2D圖形投影換算
? ? ? ? 片元著色器(像素著色器):片元(其實是像素點)铃诬,用來處理片元相關(guān)的著色器,在CPU中是串行渲染片元苍凛,GPU中并行渲染像素點 (圖片的飽和度趣席、明度之類的效果變化是通過修改片元著色器來實現(xiàn)的)
GLSL (OpenGL Shading Language)
? ? ? ? GPU僅能識別由符合OpenGl標(biāo)準(zhǔn)的語言,這種語言稱之為GLSL? ? ? ??
? ? ? ? Metal并非基于OpenGL醇蝴,GLSL并不通用于Metal
光柵化
? ? ? ? 頂點著色器完成映射后宣肚,片元著色器開始工作(兩個頂點匯成線,三個頂點匯成三角形哑蔫,這個過程稱為 ‘圖元裝配’ )钉寝,而OpenGL僅支持點、線闸迷、三角形的映射嵌纲,映射完成后,可以確定線或者三角形區(qū)域中的像素點腥沽,這個過程稱之為光柵化逮走,之后由片元著色器對每個像素的顏色進(jìn)行計算臼勉,再通過光柵化將顏色附著上去
? ? 因此艰额,光柵化有兩個目的顿涣,1.確定片元像素點的位置每窖,2.附著顏色
? ? 光柵化是不可以進(jìn)行編程的? ? ? ??
?紋理
? ? ? ? 大多數(shù)情況下赐纱,紋理為位圖淮菠,其格式為.tga紋理文件
? ? ? ? 在OpenGL ES中衅金,圖片會直接轉(zhuǎn)換為位圖核芽,而不是紋理
混合
? ? ? ? 在圖片進(jìn)行疊加時妖谴,對疊加區(qū)域會有一個顯示的計算窿锉,這個計算行為稱之為 ‘混合’,這個計算是由OpenGL完成的
變換矩陣
? ? ? ? 在圖形進(jìn)行旋轉(zhuǎn)膝舅、縮放嗡载、平移時,主要是頂點數(shù)據(jù)的變化仍稀,而頂點數(shù)據(jù)的變化是根據(jù)線性代數(shù)來進(jìn)行的洼滚,基本公式為 點 * 矩陣 ,這里的矩陣稱之為 ‘變換矩陣’
? ? ? ? 變換矩陣主要針對頂點數(shù)組的變化
投影矩陣
? ? ? ? ?在3D圖形顯示在2D屏幕上時技潘,需要將3D坐標(biāo)轉(zhuǎn)換為2D坐標(biāo)遥巴,這個變換也是根據(jù)線性代數(shù)來進(jìn)行的千康,基本公式為 點*矩陣 , 這里的矩陣稱之為 ‘投影矩陣’
? ? ? ? 投影矩陣會涉及到3D效果轉(zhuǎn)2D時所有的像素點
坐標(biāo)系
? ? ? ? 2D笛卡爾坐標(biāo)系 x-y 坐標(biāo)系 百度百科<笛卡爾坐標(biāo)系>
? ? ? ? 3D笛卡爾坐標(biāo)系 x-y-z 坐標(biāo)系?百度百科<笛卡爾坐標(biāo)系>
視口
? ? ? ? 坐標(biāo)系對應(yīng)屏幕區(qū)域的范圍 百度百科<視口>
? ? ? ? 對于macos而言挪哄,視口為分辨率吧秕,分辨率越小,顯示的內(nèi)容越少迹炼,內(nèi)容越大
投影方式
? ? ? ? 1.正投影
? ? ? ? ? ? 標(biāo)準(zhǔn)正投影為 1.正視圖砸彬,2.側(cè)視圖, 3.俯視圖
? ? ? ? ? ? 具體效果為:遠(yuǎn)近一樣大
? ? ? ? ? ? 一般用來顯示2D效果的
? ? ? ? 2.透視投影
? ? ? ? ? ? 具體效果為:遠(yuǎn)小近大
? ? ? ? ? ? 一般用來顯示3D效果的
其他坐標(biāo)系
? ? ? ? 觀察者坐標(biāo)系 將人眼作為Camera斯入,人眼機位觀察者坐標(biāo)系的原點
? ? ? ? 物體坐標(biāo)系 物體本身具有各種屬性砂碉,用來表達(dá)這些屬性的匯總即為物體坐標(biāo)系
? ? ? ? 世界坐標(biāo)系 將地球比做世界,經(jīng)緯度即地底深度及海拔即為世界坐標(biāo)系
著色器的渲染流程 (最后溫習(xí)一下)
? ? ? ? 頂點數(shù)據(jù) -> 頂點著色器 -> 細(xì)分著色器 -> 集合著色器 -> 圖元設(shè)置(裝配)-> 根據(jù)投影剪切 -> 光柵化 -> 片元著色器 -> 效果
(還不完善刻两,后續(xù)涉及到相關(guān)專業(yè)名詞時進(jìn)行調(diào)整及補充...)