前言:在我們使用OpenGL進行繪制一些圖形的時候如果我們需要對特殊按鍵對圖形做一些 旋轉 切換等操作的時候 必須要在main函數值先進行注冊迹栓。
圖像繪制的流程: 首先我們要創(chuàng)建一個可視窗口?ChangeSize(int w, int h) 在這個方法中我們去創(chuàng)建視口的大小,投影矩陣鸥鹉,代碼如下:
2、其次我們要進行初始化即我們需要在SetUpRC()對顏色 著色器鸣皂,頂點坐標等進行設置飞袋,如圖所示
3、在我們初始化之后會進入到RednferScene()方法中秉扑。在RenderScene()方法中我們首先要對緩沖區(qū)進行清空操作(清空理念是 我們使用哪個就清空哪個。當然如果不知道的話 就全部清空):glClear(GL_COLOR_BUFFER_BIT(清空顏色) | GL_DEPTH_BUFFER_BIT(深度緩沖區(qū)) | GL_STENCIL_BUFFER_BIT(模板緩沖區(qū)));调限。清空緩沖區(qū)之后 我們就要進行壓棧(壓棧舟陆,那么什么是棧、棧是用來記錄狀態(tài)的我們可以通過棧記錄的狀態(tài)來進行撤回的操作耻矮,如果我們想要繼續(xù)保存狀態(tài)的時候可以繼續(xù)進行壓棧秦躯。如果回退了就不需要保存它的狀態(tài),那么就進行出棧):modelViewMatrix.PushMatrix(); 然后我們將觀察者矩陣和物體矩陣存放到模型視圖矩陣中裆装。 transformPipeline.GetModelViewProjectionMatrix() 通過調用這個方法我們可以直接獲取到矩陣相乘的結果具體代碼如下:
正背面剔除踱承。當我們再使用光源著色器繪制一些3D模型的時候。當我們移動觀察者視角的時候回出現BUG哨免。如圖所示
通過這個倆個圖的比較我們可以看出 我們繪制的這個“甜甜圈”有BUG 我們再繪制的時候只使用了紅色勾扭,那么這些黑色是怎么來的呢? 首先我們要了解 在我們觀察物體的時候 物體會有正面 和背面铁瞒。如果存在光源的情況下,光照的地方的顏色是紅色桅滋。光照不到的地方也就是背面是黑色慧耍。 這樣就解釋了 當我們對“甜甜圈”進行旋轉的時候 系統不知道我們那一塊是我們能夠看到的身辨。那一塊是我們不能看到的。所以就形成了圖2的這樣的問題芍碧。那么怎么解決這樣的問題煌珊。
我們可以對"甜甜圈"進行正背面剔除。什么是正背面剔除呢泌豆《ㄢ郑可以理解為,在我們觀察物體的時候 我們最多只能看到物體的三個面踪危。其他的面我們是看不到的蔬浙。這個時候我們就可以把其他看不到的面進行剔除。這樣的做法 不僅僅能提高繪制的效率 贞远,因為我們不需要把一個物體的全部面都繪制 只需要繪制我們能夠看到的面畴博。而且還能避免出現上圖的這種情況。
最后疑問 對“甜甜圈”進行了正背面剔除之后 我們就能獲得完整的“甜甜圈”了嗎蓝仲?