Win32 OpenGL 程式設計(1)Win32下的OpenGL程式設計必須步驟
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
Win32 OpenGL 程式設計(1)Win32下的OpenGL程式設計必須步驟
write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie
一、 前言
人生在於折騰,繼續折騰吧。OpenGL程式設計的紅寶書《OpenGL Programming Guide》在舉例子的時候為了平臺無關,使用的都是GLUT來管理視窗,個人感覺不爽-_-! 要是針對Windows平臺,個人傾向使用Win32(MFC也行),要是跨平臺,我還會Qt嘛,Qt對OpenGL也有很好的支援的,為啥還折騰個新的視窗管理元件?雖然說GLUT比較簡單,但是還是不喜歡扭曲的適應之,何況我去看了下GLUT這個東西,最新的版本都是2001年釋出的了,什麼古董級的傢伙啊,更加不想用了,還是在Windows平臺上學習OpenGL
二、 提要
本文主要介紹Win32下的OpenGL程式設計需要的一些操作,以Andre LaMothe 的T3D Game Console為Win32框架實現一個Win32下的OpenGL遊戲程式設計框架,以參考資料2為藍本,實現一些OpenGL示例。以後的講解圍繞此框架展開。本文假設讀者已經具備基本的
三、 Win32下OpenGL程式設計需要的操作步驟
全部原始碼見我的放在Google Code上的blog-sample-code中2009-9-27/Win32OpenGLTemplate目錄。取回方式見本文最後的說明。
下面會用到的全域性變數:
// GLOBALS ////////////////////////////////////////////////
HWND ghWnd; // 視窗控制代碼
HINSTANCE ghInstance; // 程式例項控制代碼
HDC ghDC; // GDI裝置環境控制代碼
HGLRC ghRC; // 渲染環境控制代碼
1. 標頭檔案
#include <windows.h>
// OpenGL需要的標頭檔案
#include <GL/gl.h>
#include <GL/glu.h>
需要注意的就是,必須先包含Windows.h,然後才能包含gl.h和glu.h。因為gl.h與glu.h中可能包含Windows.h中定義的巨集。
2. 連結庫
此步完全可以通過功能配置來完成,需要包含的庫為opengl32.lib何glu32.lib,事實上,為了方便,可以通過如下語句來完成(VC++特有特性),但是我們討論的是Win32下的OpenGL,這樣也能接受了。
//定義程式連結時所需要呼叫的OpenGL程式庫,簡化工程配置
#pragma comment( lib, "opengl32.lib" )
#pragma comment( lib, "glu32.lib" )
3. 畫素格式(Pixel Format)設定
需要用到的函式的原型:
int ChoosePixelFormat(
HDC hdc, // device context to search for a best pixel format
// match
CONST PIXELFORMATDESCRIPTOR * ppfd
// pixel format for which a best match is sought
);
BOOL SetPixelFormat(
HDC hdc, // device context whose pixel format the function
// attempts to set
int iPixelFormat,
// pixel format index (one-based)
CONST PIXELFORMATDESCRIPTOR * ppfd
// pointer to logical pixel format specification
);
這是Win32下的OpenGL程式設計必做的事情之一,為DC設定畫素的格式。
//設定畫素格式
PIXELFORMATDESCRIPTOR pfd;
int iFormat;
ghDC = GetDC( ghWnd );
ZeroMemory( &pfd, sizeof( pfd ) );
pfd.nSize = sizeof( pfd );
pfd.nVersion = 1; //版本,一般設為
pfd.dwFlags = PFD_DRAW_TO_WINDOW | //一組表明象素緩衝特性的標誌位
PFD_SUPPORT_OPENGL;
pfd.iPixelType = PFD_TYPE_RGBA; //明象素資料型別是RGBA還是顏色索引;
pfd.cColorBits = 32; //每個顏色緩衝區中顏色位平面的數目,對顏色索引方式是緩衝區大小
pfd.iLayerType = PFD_MAIN_PLANE; //被忽略,為了一致性而包含的
iFormat = ChoosePixelFormat( ghDC, &pfd );//選擇一個畫素格式
SetPixelFormat( ghDC, iFormat, &pfd ); //設定到DC中
這樣的函式完成了畫素格式的設定,事實上還可以進行更多的操作,比如設定緩衝區等,下面的程式碼就是一個設定雙重緩衝區的程式碼。
PIXELFORMATDESCRIPTOR pfd;
ZeroMemory( &pfd, sizeof( pfd ) );
pfd.nSize = sizeof( pfd );
pfd.nVersion = 1;
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL |
PFD_DOUBLEBUFFER;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 32;
pfd.cDepthBits = 32;
pfd.iLayerType = PFD_MAIN_PLANE;
int iFormat = ChoosePixelFormat( hDC, &pfd );
SetPixelFormat( hDC, iFormat, &pfd );
具體的每個引數的意義,最好還是去查查MSDN啦,檢視PIXELFORMATDESCRIPTOR結構的解釋就行。
4. 渲染器環境(Render Context)建立
呼叫wglCreateContext與wglMakeCurrent函式,這兩個函式都是Windows下為了相容OpenGL而特別提供的介面,以wgl開頭。
函式原型:
HGLRC wglCreateContext(
HDC hdc // device context of device that the rendering context
// will be suitable for
);
BOOL wglMakeCurrent(
HDC hdc, // device context of device that OpenGL calls are
// to be drawn on
HGLRC hglrc // OpenGL rendering context to be made the calling
// thread's current rendering context
);
呼叫方式如下:
ghRC = wglCreateContext( ghDC ); //建立渲染環境
wglMakeCurrent( ghDC, ghRC ); //使之成為當前渲染環境
5. 實際繪製
這個部分就與一般的OpenGL一致,在後面慢慢展開講述。
6. 釋放資源
首先取消當前的渲染環境選中,然後依次刪除渲染環境與裝置環境。
需要呼叫的函式原型:
BOOL wglDeleteContext(
HGLRC hglrc // handle to the OpenGL rendering context to delete
);
// 取消OpenGL ,在程式結束前呼叫,釋放渲染環境,裝置環境以及最終視窗控制代碼。
void DisableOpenGL()
{
wglMakeCurrent( NULL, NULL );
wglDeleteContext( ghRC );
ReleaseDC( ghWnd, ghDC );
}
上述流程基本就是一個完整的Win32 OpenGL程式所需要的了。。。。。。實際上在參考5中,有較為詳細的論述,但是事實上,你也可以作為論文發表,見參考3.
四、 真正的OpenGL相關內容
1. 靜態圖形顯示演示:一個矩形
見參考2中(即所謂的OpenGL紅寶書The Red Book)中的例子
基本流程分兩部分,初始化和實際繪製:
//OpenGL初始化開始
void SceneInit(int w,int h)
{
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // 黑色背景
glMatrixMode(GL_PROJECTION);