OpenGL繪製方式

2021-09-20 15:38:23 字數 1630 閱讀 7884

opengl繪製方式

目標:辨別所有opengl中可用的渲染圖元

初始化和設定資料快取,用於幾何渲染

使用多例項渲染等高階技法對渲染優化

opengl的主要作用是將圖形渲染到幀快取中,為了實現這一要求,需要將複雜的物體分解成圖元的形式(包括點線三角形),當他們的密度足夠高時,就可以表達為2d和3d物體的形態。

opengl包含了很多渲染這種圖元的函式。這些函式描述圖元在記憶體的分布,渲染的數量和渲染採取的形式,甚至是同一**元在乙個函式中所複製的數量。這些函式幾乎成了opengl最為重要的函式組成。如果沒有他們的話我們可能除了清除螢幕之外無法完成其他任何事情了。

opengl可以支援多種圖元,不過最終歸結為三種型別中的一種,即點線三角形。線和三角形圖元型別再組合為條帶,迴圈體或者扇面。點線三角形也是大部分圖形硬體裝置支援的基礎圖元型別。

3.1.1 點

當渲染圖元時,opengl會通過一系列光柵化規則來判斷點所覆蓋的畫素位置。

預設點大小為1.0即螢幕上1畫素。如果點的大小增加那麼每個點的頂點都會佔據超過1畫素的值。在本質上每個點都是螢幕的方形區域,而每個畫素都可以使用不同的顏色來著色。我們可以在片元著色器中通過解析紋理圖來實現點的著色。

3.1.2 線、條帶和迴圈線

opengl中的線是一條線段,多段線也可以進行銜接來表示一系列的線段,首尾閉合的叫做迴圈線(line loop)開放的多線段叫做條帶線(line strip)

opengl對於模型三角形共享邊的光柵化過程不會產生任何裂縫,也不會產生重複的繪製。

多邊形可被渲染模式分為 點集、輪廓線和實體,實體分正面和背面

繪製三角形 按照逆時針方向環繞的為正面,反之為背面,為何做卻分呢?

1.這是因為正反面的反射顏色等屬性不同。

2.為了進行剔除,背面剔除能極大的提高效能。

深度測試是另一種消除隱藏表面的技術。原理是 給繪製的每乙個畫素分配乙個z值,表示它到觀察者的距離,當另外乙個畫素需要在螢幕相同位置進行繪製時,用新z值和舊z值比較,z值大的畫素覆蓋舊的畫素。

多邊形偏移

雖然深度測試能夠實現真實視覺並提高效能,但是也會帶一點麻煩。

比如我們需要繪製的兩個物體在同一z值上,或者繪製實心幾何體又要突出它的邊時,無法再利用畫素覆蓋來達到想要的效果了,這種現象叫做z-fighting(z衝突)。

我們可能會想,是不是可以通過第二次繪製相同位置時在z方向上稍微做一點偏移來解決問題,

這樣做確實能達到問題,不過我們需要很小心的移動z值,使它既能產生深度測試,又不至於移動的太多導致幾何圖層之間產生縫隙,我們想出了更好的方法。

調節片元的深度值,這樣能使深度值產生偏移而不實際改變3d空間的物理位置。

裁切另一種提高渲染效能的方法是只重新整理螢幕上變化的部分。

混合開啟混合功能,新的顏色會和已經存在的顏色值在顏色緩衝區進行組合。

混合的另乙個目的是抗鋸齒

抗鋸齒是平滑 點,直線和多邊形的邊

對於多邊形或者實心物體抗鋸齒效能消耗太大

此時引入新技術:多重取樣。

使用額外的緩衝區儲存取樣結果,當畫素更新時,緩衝區也更新。

這會消耗更多的記憶體和處理器開銷,有可能對效能造成影響。

還需要注意的是:

啟用多重取樣會關閉點線和多邊形的平滑特性;

所以在繪製點線時關閉多重取樣,繪製實心幾何圖形時再開啟它。

opengl繪製漢字

opengl本身並沒有繪製文字的功能,他只是乙個三維繪圖的api集和,很多東西都要 自己動手才可以實現。opengl繪製文字,網路上已經有很多成熟的方式方法,我這裡給 大家介紹的是我使用的方式,從繪製的效率上來說,速度上從已經達到我個人水平的最大值。首先介紹下網路上的一些繪製方式。一 將要繪製的文字...

OPENGL繪製文字

opengl沒有提供直接繪製文字的功能,需要借助於作業系統。用opengl繪製文字比較常見的方法是利用顯示列表。建立一系列顯示列表,每個字元對應乙個列表編號。例如,a 對應列表編號1000 a b 對應列表編號1000 b 以此類推。繪製乙個字串時,依次呼叫字串中每個字元所對應的列表編號。在wind...

OpenGL繪製地形

1.建立頂點緩衝區物件 vertexbuffer 2.建立索引緩衝區物件 indexbuffer 3.載入高度圖 heightmap 3.1把位影象素轉換為高度圖資料 頂點資料 高度圖在每個方向上都是1個單位寬,且其以x z平面上的位置 0,0 為中心,點陣圖的最上角將被對映到 0.5,0.5 右下...