OPENGL學習筆記整理(一)

2021-06-18 11:18:08 字數 2576 閱讀 3335

正式接觸opengl也已經超過一年了,自我感覺已經入門了,在菜鳥中也是乙隻老鳥了。或者也可以自大地說opengl太簡單了,就乙個狀態機而已。然而,這個狀態機,我又知多少呢。

撇開平台的關係,opengl整個程式涉及了那些函式呢。有點忘了,趕緊整理了一下。

首先,我們先不是物件導向程式設計,還是面向過程的。雖然物件導向程式設計很流行了,不過對於理解最簡單的opengl,用它就太麻煩了。

intmain(

intargc,

char

*argv)

這幾個函式接觸過opengl的人應該都會有印象的。但是習慣了mfc之後,很多函式沒有用過了,也已經忘得差不多了。還是把各個函式整理下吧。

glutinit這個函式,我從來沒有去改變過他,顧名思義,知道它是初始化的,就不管它了。

glutinitdisplaymode顯然是用來設定顯示模式的,正常情況下和上面設定的一樣,雙緩衝、使用rgba顏色模式、使用深度快取。當然想用其它快取的時候應該也要設定這個函式。至於可否在程式執行過程中改變設定,我就不知道了。

glutinitwindowsize,顯然只是用來設定視窗大小的,沒其它的作用了。

glutcreatewindow,建立乙個視窗,僅有乙個引數記錄視窗的顯示標題。

glutreshapefunc

void glutreshapefunc(void (*func)(int width, int height));

使用者可以自己寫乙個函式,然後接收兩個引數之後,做一定的工作。通常是為了避免在視窗大小變化的過程中顯示的內容扭曲失真。

glutkeyboardfunc

void glutkeyboardfunc(void (*func)(unsigned char key, int x, int y));

使用者可以自定義乙個鍵盤響應函式,它有三個引數,第乙個用來接收鍵盤按鍵的ascii值,後兩個是滑鼠在螢幕上的位置。

當然在glut庫裡面還有乙個響應滑鼠事件的函式glutmousefunc,void glutmousefunc(void (*func)(int button, int state, int x, int y))。還有滑鼠移動事件等等的響應函式。

glutdisplayfunc,void glutdisplayfunc(void (*func)(void));

這個函式就不用解釋了吧,在裡面隨便寫就好了。

setuprc,使用者在裡面自己對紋理啊什麼做設定的函式,稍微大點的程式都會有的。

glutmainloop這個函式的作用當然是啟動整個過程了,至於它底層是怎麼執行的,沒有去查過,我想也沒這個必要。

除了以func結尾的這幾個函式所呼叫的函式和setuprc需要使用者自己寫以外,其他的東西相對來說很固定了。

下面具體說一下 void glutreshapefunc(void (*func)(int width, int height));

通常情況,個人覺得,使用者在這裡自定義的函式做的工作主要有兩個,投影變換和視口變換。

void

changesize(

intw,

inth)

glviewport屬於視口變換,void glviewport(glint x, glint y, glsizei width, glsizei height); (x,y)引數指定了視口左下角,width 和 height 表示這個視口矩陣的寬度和高度。實際上用於視口變化的函式就兩個,除了這個之外,就是gldepthrange,這個我很少用,具體的影響到底是怎樣,我也沒察覺出來。個人覺得可以暫時忽略。

其他的都是和變換有關了。glmatrixmode,void glmatrixmode(glenum mode); 他有三種模式可以選擇,gl_modelview,gl_projection,gl_texture。在改變投影的時候,引數顯然是gl_projection。glloadindentity()這個函式在各種變換下都是可用的,主要就是把當前的matrix設定為單位矩陣,即初始狀態。只為投影變換設計的函式,這裡是glfrustum,void glfrustum(gldouble left, gldouble right, gldouble bottom, gldouble top, gldouble near, gldouble far),用來設定六個平行截頭,即六個面。這個函式的使用,個人覺得比較難,它應該要與glulookat這類函式配合使用,所以通常情況下,人們更經常使用gluperspective來進行投影變換。void gluperspective(gldouble fovy, gldouble aspect, gldouble near, gldouble far),fovy是yz平面上視野的角度,它的值必須在[0.0,180.0]的範圍之內。aspect是這個平截頭體的縱橫比,也就是它的寬度除以高度。

這個函式被呼叫完畢之後,當然,我們要把矩陣的模式設定成gl_modelview。然後就可以顯示我們自己「畫」的那些內容了。

「畫」就在glutdisplayfunc,void glutdisplayfunc(void (*func)(void)) 自定義的函式中,這裡就是renderscene

void

renderscene(

void)

程式在實際中的初始執行順序,main入口->setuprc->changesize->renderscene。

opengl學習整理

本人opengl學習是基於這是乙個非常好的學習opengl 本人碰到的學習問題會一點一點記錄在這個部落格裡,希望能對後來學習opengl的人提供一點微小的幫助。1.紋理顛倒問題 opengl裡所規定的紋理原點位於左下角,而團點位於上方,這就導致了,生成的紋理上下顛倒的情況,解決辦法有以下幾種 在sh...

OpenGL學習筆記(一)初識OpenGL

早期的opengl使用立即渲染模式 immediate mode,也就是固定渲染管線 從opengl3.2開始,規範文件開始廢棄立即渲染模式,並鼓勵開發者在opengl的核心模式 core profile 下進行開發。opengl的一大特性就是對擴充套件 extension 的支援。opengl自身...

OpenGL學習筆記(一)

opengl是一種在計算機上進行2d 3d圖形繪製的技術規範,嚴格上來說不能算作一種具體技術。不過,現在有opengl庫來提供了對這種規範的封裝,於是也演變為今天對opengl api的使用。opengl需要硬體支援的,就如同對微軟directx的支援一樣。上層應用軟體都是通過opengl的庫介面,...