1. 程式人生 > >OpenGl面試題(持續更新)

OpenGl面試題(持續更新)

1.什麼是model,view,project矩陣?

世界矩陣(World Matrix)、檢視矩陣(View Matrix)以及投影矩陣(Projection Matirx); 
世界矩陣確定一個統一的世界座標,用於組織獨立的物體形成一個完整的場景; 
檢視矩陣就是我們能看到的那部分場景,由虛擬攝像機負責拍攝; 
投影矩陣就是3維物體的平面影射.把三維場景在一個二維的平面上顯示.

2.說一下新OpenGL和老版本OpenGL的區別。

主要是固定流水線轉變成了可程式設計流水線。




可程式設計流水線帶來了極大的靈活性,通過Shader語言,可以在GPU上進行計算,釋放CPU。而Shader的層次越越來越高,從Suerface級別的Vertexshader和Freagment Shader 到Shape級別的 Geometry shader和Tesselation shader。

3.OpenGL中要用到哪幾種Buffer?

幀緩衝(Frame Buffer) 

顏色緩衝(Color Buffer) 

模板緩衝(Stencil Buffer) 

頂點緩衝(Vertice Buffer)

 深度緩衝(Depth Buffer)

4.請介紹你所有知道的紋理Alpha混合方式,原理(公式).

假設一種不透明東西的顏色是A,另一種透明的東西的顏色是B,那麼透過B去看A,看上去的顏色C就是B和A的混合顏色,可以用這個式子來近似,設B物體的透明度為alpha(取值為0-1,0為完全透明,1為完全不透明)

R(C)=alpha*R(B)+(1-alpha)*R(A)
G(C)=alpha*G(B)+(1-alpha)*G(A)
B(C)=alpha*B(B)+(1-alpha)*B(A)

  R(x)、G(x)、B(x)分別指顏色x的RGB分量。看起來這個東西這麼簡單,可是用它實現的效果絕對不簡單,應用alpha混合技術,可以實現出最眩目的火光、煙霧、陰影、動態光源等等一切你可以想象的出來的半透明效果。

5.GLSL的shader如何使用?

首先當然是glewint().

講Shader檔案讀取進來。

初始化shader...


6.GLSL的如何傳遞資料?

uniform變數

uniform變數是外部application程式傳遞給(vertex和fragment)shader的變數。因此它是application通過函式glUniform**()函式賦值的。在(vertex和fragment)shader程式內部,uniform變數就像是C語言裡面的常量(const ),它不能被shader程式修改。

attribute變數
attribute變數是隻能在vertex shader中使用的變數。(它不能在fragment shader中宣告attribute變數,也不能被fragment shader中使用)
一般用attribute變數來表示一些頂點的資料,如:頂點座標,法線,紋理座標,頂點顏色等。
在application中,一般用函式glBindAttribLocation()來繫結每個attribute變數的位置,然後用函式glVertexAttribPointer()為每個attribute變數賦值。

varying變數
varying變數是vertex和fragment shader之間做資料傳遞用的。一般vertex shader修改varying變數的值,然後fragment shader使用該varying變數的值。因此varying變數在vertex和fragment shader二者之間的宣告必須是一致的。application不能使用此變數。

7.兩圓相交,只有2交點A、B,過A點做線段CAD,CA、AD為兩圓的弦,問什麼情況下CAD最長,並證明。提示圓心角和圓周角的兩倍關係。


如圖分別連線BC,BD。當CAD不斷的變化的時候,可以得到個無數個三角形CBD,這些三角形的夾BCA和角BDA都是相同的,分別是BA對應的圓心角的一半。

則這些三角形都是相似的。

那麼當BD最大的時候,也就是三角形最大的時候,也就是CAD最長的時候。

BD最大的時候就是BD為圓的直徑,則BAD為直角,同理,BAC也是直角=>BA 垂直CAD。

8.平面上N個點,每兩個點都確定一條直線, 求出斜率最大的那條直線所通過的兩個點(斜率不存在的情況不考慮)時間效率越高越好。

程式的基本步驟就是:
1.把N個點按x座標排序。
2.遍歷,求相鄰的兩個點的斜率,找最大值。
時間複雜度Nlog(N)

9.頂點法線和麵法線的作用。

面法線,垂直於平面,位於中央,經常用於flat著色。

點的法線是在使用Phone或Gouraud模型時計算光照使用。如果一個面上的所有法線都一樣,他們的光照也就一樣,就會產生 flatness 效果;而如果把每個頂點的法向設定不同,則更平滑。

********************************

問題1:大概說下著色器是怎麼工作的
對這個問題我就說了一下管線的處理流程。
問題2:cpu和gpu之間的排程
這個問題我當時答錯了,回來後查了下,網上有明確的答案
問題3:opengl的一些概念,如矩陣變換,矩陣變換的原理。怎麼對頂點進行的變換,有多少個矩陣,分別是什麼作用
這個問題感到有點模糊,我當時只說出了有3個矩陣,也就是投影矩陣、模型檢視矩陣、紋理矩陣,投影矩陣作用是規劃投影範圍、模型檢視矩陣作用是指定模型的位置、紋理矩陣作用這個沒答出來。
問題4:opengl緩衝區的概念如深度緩衝區,後面還問了一個模板緩衝區
我就回答了這兩個緩衝區的工作原理。
問題5:mipmap是怎麼回事
我的回答是根據圖元的深度位置的不同,使用不同的紋理,當然不能只是這一句話