OpenGL學習05 繪製實心物體

2021-06-27 14:01:09 字數 2201 閱讀 6061

使用三角形或者多邊形結合在一起,我們可以繪製實心物體(3d物體)。本篇中使用三角形繪製圓錐形。

下面測試第乙個opengl程式:

void renderscene(void)  

glend();

glpopmatrix();

glutswapbuffers();

}

執行結果,如下圖:

(1)設定多邊形顏色

顏色實際上是以頂點為單位指定的,而不是以多邊形為單位。著色模式決定了多邊形是單調著色(最後乙個頂點的顏色就是作為整個多邊形的填充顏色)還是漸變著色的(根據每個頂點的顏色進行平滑著色)。

glshademodel(gl_flat);

告訴opengl用當前顏色(也就是這個多邊形的最後乙個頂點的顏色)填充這個多邊形。這就是我們三角形扇中指定下乙個頂點前簡單的將顏色修改為紅色或則綠色的原因。

glshademodel(gl_smooth);

告訴opengl根據每乙個頂點對三角形進行漸變著色,相鄰頂點顏色進行均和。

使用gl_smooth著色方案效果,如下圖:

(2)隱藏表面消除

之所以出現來回擺動現象的原因是圓錐的底面是在圓錐邊花完後才進行繪製的,不管這個圓錐的方向如何,它的底總是出現在最前面,從而產生了來回擺動的幻覺。可以使用一種稱為深度測試的特性來消除這種現象。

深度測試:當乙個畫素被繪製時,它將被設定乙個值(z值),以表示它和觀察者之間的距離。以後,當這個螢幕位置需要繪製另外乙個畫素時,新畫素的z值就會和原先已經存在畫素的z值比較;如果新畫素的z值更高,他就更靠經觀察者,因此位於以前那個畫素的前面;反之,就不能遮住前面的畫素。

啟動深度測試:

glenable(gl_depth_test);

關閉深度測試:

gldisable(gl_depth_test);

在內部,深度測試的任務是由深度緩衝區實現的,它儲存螢幕上每個畫素的深度值,故每次渲染前需要清空深度快取區,如下:

glclear(gl_color_buffer_bit | gl_depth_buffer_bit);

gl_depth_buffer_bit代表的是深度快取區。

(3)剔除隱藏表面,提高效能

如果乙個表面被隱藏,就不應該繪製這個表面。這樣可以獲得更好的視覺效果;還能提高渲染的效能,因為每個被繪製的畫素必須與以前的畫素進行z值比較,如果知道乙個表面不需要繪製,就不向硬體傳送這個幾何圖形,就可以顯著的提高效能。我們可以使用的剔除技巧之一是背面剔除,它用於消除乙個便面的背面。

啟動背面剔除:

glenable(gl_cull_face);

關閉背面剔除:

gldisable(gl_cull_face);

效果如下圖,左邊開啟了背面剔除,右邊未開啟背面剔除

當然為了更好的使用背面剔除功能,需要設定環繞方式,預設逆時針方向為正面,順時針方向為背面;在程式中使用了繪圖方式與預設方式相反(程式中三角扇形都是順時針環繞的),故需要將順時針設定為正面:

glfrontface(gl_cw);

在繪製閉合物體或者實心物體時,背面剔除是非常有用的。

(4)多邊形模式

多邊形並不一定要用當前顏色進行填充。在預設情況下,多邊形被繪製成實心的。但是,也可以改變這個行為,指定只繪製多邊形外框,甚至只繪製點(只有頂點被繪製)。

void glpolygonmode (glenum face, glenum mode);

glpolygonmode 函式允許多邊形作為實心圖形、外框或者點進行渲染。另外,可以對多邊形的兩個面都應用這個渲染模式,也可以只對多邊形的正面或則背面應用這個模式。

在上面程式中使用glpolygonmode(gl_back, gl_line);

執行結果,如下圖:

OpenGL學習筆記(三)OpenGL繪製方式

1 opengl圖元 點 void glpointsize 線 條帶 迴圈線 void gllinewidth 三角形 條帶 扇面 將多邊形渲染為點集 輪廓或者實體 p68 正反面採用不同的方式繪製 glpolygonmode glenum face,glenum mode face必須是gl fr...

openGL學習筆記02 繪製頂點

tutorial2.cpp 定義控制台應用程式的入口點。這裡一定要注意include的順序 include stdafx.h 一定要放在最頂端!include 一定要放在 include 之前!include stdafx.h pragma comment lib,glew32.lib includ...

OpenGL學習 一 簡單視窗繪製

opengl open graphics library 通常可以認為是api,其包含了一系列可以操作圖形 影象的函式。但深究下來,它是由khronos組織制定並維護的規範,即規定了每個函式該如何執行,以及它們的輸出值。根據該opengl的規範,開發者可編寫各類擴充套件庫 核心模式 core pro...