openGL使用方法教程

 OpenGL是一個典型的、已經被接受的國際工業標準的三維圖形軟件包。嚴格地講,OpenGL被定義爲“圖形硬件的一種軟件接口”。從本質上說,它是一個3D圖形和模型庫,具有高度的可移植性,並且具有非常快的速度。OpenGL是API而不是編程語言。

        OpenGL特點:OpenGL是一個過程性的圖形API,它並不是描述性的。事實上,程序員並不需要描述場景的性質和外觀,而是事先確定實現一定的外觀或效果所需要的一些操作步驟。這些步驟涉及到許多OpenGL命令的調用。這些命令可以在三維空間中繪製各種圖元(點、直線和多邊形等)。還支持光照、紋理貼圖、混合、透明動畫以及其他許多特殊的效果和功能。

        OpenGL特點:OpenGL不支持任何用於窗口管理、用戶交互或文件I/O的函數。每個宿主環境(例如Microsoft indows)自己擁有一些函數,他們實現了這些功能,並且負責實現一些方法,向OpenGL遞交窗口繪圖的控制。

       OpenGL命令語法和規範:OpenGL包含了近200個函數,分爲5類:
      核心函數:115個,以gl開頭。 
      實用函數:43個,以glu開頭。
      輔助函數:31個,以aux開頭。
     專用函數:6個,以wgl開頭。
      Win32API函數:5個,無特定前綴。核心函數命名規則爲:以前綴gl開頭,組成命令名的每個字的開頭用大寫字母。例如:glClearColor()。
OpenGL命令語法和規範:OpenGL定義的符號常數以GL_開頭,全部用大寫字母,各個字之間用下劃線分割。例如:GL_COLOR_BUFFER_BIT

OpenGL定義的數據類型以GL開頭。

        字符數據類型相應與C的數據類型OpenGL中定義s 16位整數short GLshorti 32位整數int GLintf 32位浮點數float GLfloatd 64位浮點數double GLdouble。例如:void glVertex<n>{sifd}[v](TYPE x,type Y)TYPE 爲sifd數據類型中的一個。n 說明命令參數的個數,可以爲2或3。v 指定命令爲向量形式。Windows環境下OpenGL的編程方法在Windows環境下進行OpenGL的編程時,需要對Windows窗口進行專門的設置。設置方法有多種。使用輔助庫glaux的方法。使用GDI和WGL函數的方法。使用OpenGL實用函數庫glut的方法。

OpenGL與Windows的繪圖方式是不同的,其區別主要表現在以下三個方面:Windows用GDI繪圖。OpenGL用圖形操作描述表(着色描述表、繪製描述表)(Rendering Contexts)繪圖。OpenGL使用特殊的像素格式。

在Windows 95/98/NT下,窗口程序必須首先處理設備描述表(Device Contexts,簡稱DC),DC包括如何在窗口上顯示圖形的信息。OpenGL for Windows 的程序也必須使用DC,而且必須處理特殊的DC圖形操作描述表,這是DC中專爲OpenGL使用的一種功能。

一個OpenGL應用圖形操作描述表內有OpenGL與Windows 窗口系統相關的各種信息,必須先創建一個圖形操作描述表(Rendering Context),然後啓動它,按常規方式調用OpenGL的函數繪製圖形,最後銷燬它。

Windows提供了5個函數管理圖形操作描述表。這5個函數都有前綴“wgl”,各函數的功能如下所示。wglCreateContext() 建立一個圖形操作描述表wglDeleteContext() 刪除一個圖形操作描述表wglGetCurrentContext() 得到當前的圖形操作描述表
wglGetCurrentDC() 得到當前與圖形操作描述表相連的設備描述表wglMakeCurrent() 得到當前的設備描述表


HGLRC wglCreateContext(Hdc hdc)功能:建立一個新的圖形操作描述表。這個圖形操作描述表和設備描述表所指定的設備是一致的。參數說明:hdc:指定一個設備描述表。如果這個函數調用成功,則返回圖形操作。描述表;否則,返回NULL。

BOOL wglDeleteContext(HGLRC hglrc)功能:刪除一個圖形操作描述表。參數說明:hglrc:指定一個圖形操作描述表。
如果這個函數調用成功,返回TRUE;否則,返回FALSE。

HGLRC wglGetCurrentContext(void)功能:獲得當前的圖形操作描述表。如果這個函數調用成功,返回當前的圖形操作描述表;否則,返回NULL。

HDC wglGetCurrentDC(void)功能:獲得和當前圖形操作描述表相聯繫的設備描述表。如果這個函數調用成功,返回和當前的圖形操作描述表相聯繫的設備描述表;否則,返回NULL。

BOOL wglMakeCurrent(HDC hdc,HGLRC hglrc)功能:使所指定的圖形操作描述表是當前的。這個函數調用以後,所有的OpenGL繪製操作是在被hdc指定的設備上進行的。參數說明:hdc:指定一個設備描述表。hglrc:指定一個圖形操作描述表。如果這個函數調用成功,返回TRUE;否則,返回FALSE。

圖形操作描述表相關函數在實例中的應用:HDC hdc;HGLRC hglrc;
hglrc=wglCreateContext(hdc);
wglMakeCurrent(hdc,hglrc);
Drawscence();
wglMakeCurrent(NULL,NULL);
wglDeleteContext(hglrc);
 
 

 

管理像素格式的函數

函數功能:ChoosePixelFormat() 返回與制定像素格式最相近的像素格式
DescribePixelFormat() 得到指定製定像素格式的信息
GetPixelFormat() 得到指定像素格式
SetPixelFormat() 設置像素格式

管理像素格式的函數之一
int ChoosePixelFormat(HDC hdc,CONST PIXELFORMATDESCRIPTOR *,pfd)功能:使一個設備描述表支持的合適像素格式與一個給定的像素格式定義相匹配。
參數說明:
hdc:指定一個設備描述表。
pfd:指定具體的像素格式。
如果這個函數調用成功,像素格式的索引值被返回;否則,返回零。

管理像素格式的函數之二
int DescribePixelFormat(HDC hdc,int pixelformat,UINT nBytes,LPPIXELFORMATDESCRIPTOR pfd)功能:這個函數獲得被pixelformat指定的像素格式的信息,pixelformat是和設備描述表hdc聯繫的。
參數說明: 
hdc:指定一個設備描述表。
pixelformat:指定像素格式的索引,該值只能是大於1的整數。
nBytes:結構pfd所使用內存空間的大小。
pfd:是一個PIXELFORMATDESCRIPTOR結構,在這個結構體中存放表示像素格式的相關數據。
如果這個函數調用成功,返回值是設備描述表的像素格式的最大索引;否則,返回零。

管理像素格式的函數之三

int GetPixelFomat(HDC hdc)功能:這個函數獲得指定的被選擇的當前像素格式的索引。
參數說明:
hdc:指定一個設備描述表。
如果這個函數調用成功,返回值是當前像素格式的索
引;否則,返回零。

管理像素格式的函數之四
BOOL SetPixelFormat(HDC hdc,int pixelformat,CONST PIXELFORMATDESCRIPTOR * pfd)功能:這個函數設置當前像素格式。參數說明:
hfd:指定設備描述表。
pixelformat:指定被設置像素格式的索引。
pfd:一個指針,指向一個PIXELFORMATDESCRIPTOR結構。
如果這個函數調用成功,返回TRUE,否則,返回 FALSE。

在對話框中繪製OpenGL圖形,其主要步驟與關鍵技術是:
       在對話框中建立OpenGL繪圖的窗口,並按OpenGL的要求設置好窗口的屬性和風格。在該窗口的創建過程中,設置好顯示的像素格式,並創建OpenGL繪製描述表。在窗口的創建過程中,首先獲得Windows設備描述表,然後將其與事先設置好的OpenGL繪製描述表聯繫起來。調用OpenGL命令進行圖形繪製。退出OpenGL圖形窗口時,釋放OpenGL繪製描述表RC和Windows設備描述表DC。

在單文檔中繪製OpenGL圖形,其主要步驟與關鍵技術是:

        在單文檔窗口的創建過程中,設置好顯示的像素格式,並按OpenGL的要求設置好窗口的屬性和風格。首先獲得Windows設備描述表,然後將其與事先設置好的OpenGL繪製描述表聯繫起來。調用OpenGL命令進行圖形繪製。退出OpenGL圖形窗口時,釋放OpenGL繪製描述表RC和Windows設備描述表DC。

在多文檔中繪製OpenGL圖形,相對比較複雜,其主要步驟與關鍵技術是:
        由於在多文檔中有多個窗口需要繪製,而當前的OpenGL繪製描述表只能有一個,因此,在窗口的圖形繪製完之
後,必須將OpenGL繪製描述表釋放,以備其他窗口所用。必須新建一個視圖類,在該視圖類中對Windows設備描述表和OpenGL的繪製描述表進行管理,而應用程序中的其他各視圖均從該類中派生。在該新建的視圖類定義一個OpenGL繪圖的虛函數,在其派生的類中可以對其進行重載,也就可以在應用程序中的視圖類直接調用OpenGL命令繪圖。必須取消派生的視圖類的WM_DRAW消息處理函數和PreCreateWindow函數。

要求:
在Visual C++ 6.0環境下,用OpenGL在屏幕上
畫點。(基於單文檔)

         建立新項目。在VC中,選擇File|New,在彈出的對話中選擇Projects面板,再在列表框中選擇MFCAppWizard(exe),建立一個MFC單文檔視圖結構的應用程序。添加頭文件。在項目的視圖頭文件中添加如下代碼#include <gl/gl.h> #include <gl/glu.h>添加靜態庫。選擇Project|Settings 命令,在Link面板的Object/Library Modules 文本框輸入opengl32.lib和glu32.lib,中間用空格隔開。

選擇View|Class Wizard 命令,在Message Map 面板中爲視圖類添加以下消息函數
OnDestroy(); //對應WM_DESTROY消息
OnSize(); //對應WM_SIZE 消息
OnCreate(); //對應WM_CREATE消息

在視圖類中添加的三個新函數爲
void CExam1View::Draw();
void CExam1View::gl_Init();
void CExam1View::gl_Point(GLint x,GLint y)

添加保護型變量
HDC m_hDC; //設備描述表
HGLRC m_hRC; //圖形操作描述表
在CExam1View的成員函數OnDraw()中加入對Draw()
的調用。編譯並執行程序

void CExam1View::OnDestroy()
{
CView::OnDestroy();
::wglMakeCurrent(NULL,NULL); //設置當前圖形操作描述表爲空
::wglDeleteContext(m_hRC); //刪除圖形操作描述表
}

 

int CExam1View::OnCreate(LPCREATESTRUCT lpCreateStruct) 字串4
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
gl_Init(); //初始化OpenGL繪圖環

return 0;
}

void CExam1View::OnSize(UINT nType, int cx, int cy)

{
CView::OnSize(nType, cx, cy);
glViewport(0,0,cx,cy);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-cx/2,cx/2,-cy/2,cy/2,-10,10);
}

void CExam1View::Draw()
{
glClearColor(1.0f,1.0f,1.0f,1.0f);
glClear(GL_COLOR_BUFFER_BIT); //置窗口底色爲白色
glColor3f(0.0f,0.0f,0.0f); //設置繪圖顏色爲黑色
for(int i=0;i<=200;i++) gl_Point(i,0);
glFlush(); //顯示上述OpenGL命令的執行效果

}

void CExam1View::gl_Init()

{ //下面的結構說明繪圖設備的像素格式

PIXELFORMATDESCRIPTOR pfd={

sizeof(PIXELFORMATDESCRIPTOR), //數據結構大小

1,
數據結構版本號

PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER,

PFD_TYPE_RGBA,//緩衝區可以在窗口上繪圖,支持OpenGL繪圖

24, //深度顏色緩衝區位數

0,0,0,0,0,0, //忽略顏色位

0,0,0, //沒有非透明度緩存,忽略移位位,無累加緩存

0,0,0,0, //忽略累加位

32, //32位深度緩存

0, //無模板緩存

0, //無輔助緩存

PFD_MAIN_PLANE, // 主層

0, //保留

0,0,0, //忽略層,可見性和損毀掩膜

};

OpenGL 使用介紹第34頁
OpenGL 使用介紹第35頁
OpenGL編程舉例
m_hDC=GetDC()->GetSafeHdc();
int nPixelFormat=::ChoosePixelFormat(m_hDC,&pfd);
::SetPixelFormat(m_hDC,nPixelFormat,&pfd);

m_hRC=::wglCreateContext(m_hDC);
/*指定OpenGL的圖形操作設備表是m_hRC,並且建立它與當前繪圖設備
m_hDC間的連接,下列函數執行後,所有繪圖命令的結果都出現在設
備m_hDC上*/
::wglMakeCurrent(m_hDC,m_hRC);
}

OpenGL 使用介紹第36頁
OpenGL編程舉例
void CExam1View::gl_Point(GLint x, GLint y)
{
glBegin(GL_POINTS); //畫一個點
glVertex2d(x,y); //默認顏色爲黑色
glEnd();
}

發佈了15 篇原創文章 · 獲贊 13 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章