參考learnopengl着色器
着色器(shader)是運行在GPU上的小程序,相似於C語言,構造一個着色器在其開頭必須聲明版本。本質上來講,着色器是一個把輸入轉化爲輸出的程序。
着色器定義了in
和out
等關鍵字實現數據的輸入和輸出,從而實現數據的交流。若是從一個着色器向另外一個着色器發送數據,則必須在發送方聲明一個輸出,在接收方聲明一個相似的輸入。當類型和名字都相同的時候,便會自動連接在一塊兒,實現數據傳遞。
另外一種從cpu向gpu發送數據的方式是uniform
。uniform
是全局的,無需藉助其餘中介實現數據傳遞。在着色器程序中聲明uniform
變量,在主程序中經過glGetUniformLocation
得到其地址,從而設置着色器中uniform變量的值。git
如1中所述,GLSL運行在GPU,其經過接口實現和CPU之間的數據轉換。
opengl程序涉及到兩種類型的處理單元--CPU和GPU。opengl主程序由CPU調度運行,圖像處理部分經過GLSL交由GPU執行。CPU與GPU之間的數據傳遞分三個步驟:一,首先利用內置的OpenGL函數生成一個ID號碼;二,根據須要對該ID號碼進行內存類型的綁定;在通過上面兩個步驟以後,GPU中用於接收系統內存中數據的「標識符」就準備好了,第三部對這部份內存進行初始化,初始化的內容來自於系統內存中,這一部分功能利用glBufferData函數完成。
數據提交到GPU專用的內存中以後,須要根據應用場景對這些數據進行適當的分配。好比,有的數據當作頂點,有的是做爲顏色,有的用於控制光照等等
此外,因爲GPU具備高並行結構(heighly parallel structure),因此GPU在處理圖形和複雜算法方面計算效率較高。CPU大部分面積爲控制器和寄存器,而GPU擁有更多的ALU(Arithmetric Logic Unit,邏輯運算單雲)用於數據處理,而非數據的高速緩存和流控制。github
[1] 幀緩衝(frame buffer):幀緩衝是下面幾種緩衝的合集。經過幀緩衝能夠將你的場景渲染到一個不一樣的幀緩衝中,可使咱們可以在場景中建立鏡子這樣的效果,或者作出一些炫酷的特效,存放顯示用的數據的。
[2] 顏色緩衝(color buffer):存儲全部片斷的顏色:即視覺輸出的效果。
[3] 深度緩衝(depth buffer):根據緩衝的z值,肯定哪些面片被遮擋。由GLFW自動生成。
[4] 模板緩衝(stencil buffer):與深度測試相似,經過比較模板值和預設值,決定是否丟棄片斷。
數據在opengl中處理順序是: 頂點着色器 - 片斷着色器 - 模板測試 - 深度測試
參考連接:http://blog.csdn.net/silangqu...算法
Mipmap是多級漸遠紋理,也是目前應用最爲普遍的紋理映射(map)技術之一。簡單來講,就是實現 「實物(圖片)看起來近大遠小,近處清晰遠處模糊」的效果。它簡單來講就是一系列的紋理圖像,後一個紋理圖像是前一個的二分之一。多級漸遠紋理背後的理念很簡單:距觀察者的距離超過必定的閾值,OpenGL會使用不一樣的多級漸遠紋理,即最適合物體的距離的那個。因爲距離遠,解析度不高也不會被用戶注意到。同時,多級漸遠紋理另外一加分之處是它的性能很是好小程序
局部空間(local space):或稱爲 物體空間.指對象所在的座標空間
世界空間(world space):指頂點相對於(遊戲)世界的座標。物體變換到的最終空間就是世界座標系
觀察空間(view space):觀察空間(View Space)常常被人們稱之OpenGL的攝像機(Camera)(因此有時也稱爲攝像機空間(Camera Space)或視覺空間(Eye Space))。觀察空間就是將對象的世界空間的座標轉換爲觀察者視野前面的座標。所以觀察空間就是從攝像機的角度觀察到的空間
裁剪空間(clip sapce):或稱爲視覺空間.在一個頂點着色器運行的最後,OpenGL指望全部的座標都能落在一個給定的範圍內,且任何在這個範圍以外的點都應該被裁剪掉(Clipped)。被裁剪掉的座標就被忽略了,因此剩下的座標就將變爲屏幕上可見的片斷。這也就是裁剪空間(Clip Space)名字的由來。
屏幕空間(screen space):顧名思義,通常由glViewPort
設置。
參考連接:http://learnopengl-cn.readthe...緩存
model
:主要針對模型的平移、旋轉、縮放、錯切等功能,將模型由局部空間轉換到世界空間view
:視圖矩陣。攝像機/觀察者的位置等信息(設置鼠標移動、滾輪等效果),將全部世界座標轉換爲觀察座標。projection
:投影矩陣。裁剪座標 轉換到屏幕上函數
首先簡單瞭解一下什麼是"狀態機",好比咱們使用的電腦,接受各類輸入(鼠標,鍵盤,攝像頭等),而後改變本身當前的狀態,但卻並不知道狀態的改變是如何實現的。opengl相似,接受各類參數,而後參數的改變引發當前狀態的改變,達到一種新的狀態(如:顏色改變,紋理變化,光照強弱變化)。
opengl狀態機性能
馮式光照模型
:環境光照(Ambient)、漫反射(Diffuse)、鏡面(Specular)
光源:點光、定向光、手電筒(聚光燈)測試
主要是經過圖形渲染管線(管線:其實是指一堆原始圖像數據途徑一個輸送管道,期間通過通過各類變換處理,最終輸出在屏幕上的過程)
管理的,其被劃分爲兩個過程:1. 把3D座標轉換爲2D座標(主要是經過投影矩陣完成)。 2. 把2D座標轉換爲實際有顏色的像素。
2D座標和像素是不一樣的,2D座標精確表示一個點在空間的位置,而2D像素(好像都是整數)是這個點的近似值,2D像素受到我的屏幕/窗口 分辨率的限制。
由圖可知,傳入到片斷着色器的顏色值並非從頂點着色器傳入的的,而是:頂點着色階段(頂點、細分、幾何)以及片斷着色器之間有個光柵化階段(光柵化
:主要職責是判斷屏幕的哪一個部分被幾何體所覆蓋),也就是說傳入片斷着色器的結果是來自於光柵化的結果。
spa
投影
:在計算機圖形學中,投影能夠看作一種將三維座標變換爲二維座標的方法。經常使用的有:正投影和透視投影。透視投影
:是爲了得到接近真實的三維物體效果而在二維平面上繪製、渲染的方法。相似於現實中人對事物的認識(近大遠小,遠處模糊近期清晰)。正投影
:正射投影矩陣定義了一個相似立方體的平截頭箱,它定義了一個裁剪空間,在這空間以外的頂點都會被裁剪掉。攝像機
:觀察空間常常被人們稱之OpenGL的攝像機(Camera)(因此有時也稱爲攝像機空間(Camera Space)或視覺空間(Eye Space))。觀察空間是將世界空間座標轉化爲用戶視野前方的座標而產生的結果。所以觀察空間就是從攝像機的視角所觀察到的空間。而這一般是由一系列的位移和旋轉的組合來完成,平移/旋轉場景從而使得特定的對象被變換到攝像機的前方。這些組合在一塊兒的變換一般存儲在一個觀察矩陣(View Matrix)裏,它被用來將世界座標變換到觀察空間。
投影、攝像機、opengl座標系統.net