Opengl基本知識點(面試用)持續更新。。。
1. GLSL語言,概念,工作原理,及如何傳遞資料的
參考learnopengl著色器
著色器(shader)是執行在GPU上的小程式,類似於C語言,構造一個著色器在其開頭必須宣告版本。本質上來說,著色器是一個把輸入轉化為輸出的程式。
著色器定義了in
和out
等關鍵字實現資料的輸入和輸出,從而實現資料的交流。如果從一個著色器向另一個著色器傳送資料,則必須在傳送方宣告一個輸出,在接收方宣告一個類似的輸入。當型別和名字都相同的時候,便會自動連結在一起,實現資料傳遞。
另一種從cpu向gpu傳送資料的方式是uniform
。uniform
是全域性的,無需藉助其他中介實現資料傳遞。在著色器程式中宣告uniform
glGetUniformLocation
獲得其地址,從而設定著色器中uniform變數的值。
2. CPU和GPU之間如何排程的
如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,邏輯運算單雲)用於資料處理,而非資料的快取記憶體和流控制。
3. opengl中緩衝區的概念
[1] 幀緩衝(frame buffer):幀緩衝是下面幾種緩衝的合集。通過幀緩衝可以將你的場景渲染到一個不同的幀緩衝中,可以使我們能夠在場景中建立鏡子這樣的效果,或者做出一些炫酷的特效,存放顯示用的資料的。
[2] 顏色緩衝(color buffer):儲存所有片段的顏色:即視覺輸出的效果。
[3] 深度緩衝(depth buffer):根據緩衝的z值,確定哪些面片被遮擋。由GLFW自動生成。
[4] 模板緩衝(stencil buffer):與深度測試類似,通過比較模板值和預設值,決定是否丟棄片段。
資料在opengl中處理順序是: 頂點著色器 - 片段著色器 - 模板測試 - 深度測試
參考連結:http://blog.csdn.net/silangqu...
4. mipmap是怎麼回事
Mipmap是多級漸遠紋理,也是目前應用最為廣泛的紋理對映(map)技術之一。簡單來說,就是實現 “實物(圖片)看起來近大遠小,近處清晰遠處模糊”的效果。它簡單來說就是一系列的紋理影象,後一個紋理影象是前一個的二分之一。多級漸遠紋理背後的理念很簡單:距觀察者的距離超過一定的閾值,OpenGL會使用不同的多級漸遠紋理,即最適合物體的距離的那個。由於距離遠,解析度不高也不會被使用者注意到。同時,多級漸遠紋理另一加分之處是它的效能非常好
5. 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...
6. opengl中的常用矩陣,各有什麼作用
model
:主要針對模型的平移、旋轉、縮放、錯切等功能,將模型由區域性空間轉換到世界空間view
:檢視矩陣。攝像機/觀察者的位置等資訊(設定滑鼠移動、滾輪等效果),將所有世界座標轉換為觀察座標。projection
:投影矩陣。裁剪座標 轉換到螢幕上
7.為什麼說opengl是一個狀態機
首先簡單瞭解一下什麼是"狀態機",比如我們使用的電腦,接受各種輸入(滑鼠,鍵盤,攝像頭等),然後改變自己當前的狀態,但卻並不知道狀態的改變是如何實現的。opengl類似,接受各種引數,然後引數的改變引起當前狀態的改變,達到一種新的狀態(如:顏色改變,紋理變化,光照強弱變化)。
opengl狀態機
8. 光照
馮式光照模型
:環境光照(Ambient)、漫反射(Diffuse)、鏡面(Specular)
光源:點光、定向光、手電筒(聚光燈)
9. 顯示器是二維的,三維資料如何在二維螢幕上顯示的。
主要是通過圖形渲染管線(管線:實際上是指一堆原始影象資料途徑一個輸送管道,期間經過經過各種變換處理,最終輸出在螢幕上的過程)
管理的,其被劃分為兩個過程:1.
把3D座標轉換為2D座標。 2. 把2D座標轉換為實際有顏色的畫素。
2D座標和畫素是不同的,2D座標精確表示一個點在空間的位置,而2D畫素(好像都是整數)是這個點的近似值,2D畫素受到個人螢幕/視窗 解析度的限制。