小菜學Chromium之OpenGL學習之二

在這個教程裏,咱們一塊兒來玩第一個OpenGL程序.它將顯示一個空的OpenGL窗口,能夠在窗口和全屏模式下切換,按ESC退出.它是咱們之後應用程序的框架.
在CodeBlock裏建立一個新的GLUT Win32程序(不是console控制檯程序)後,咱們還須要連接OpenGL庫文件。
代碼的前4行包括了咱們使用的每一個庫文件的頭文件。以下所示:

#include <windows.h> // Windows的頭文件
#include <glew.h>       // 包含最新的gl.h,glu.h庫
#include <glut.h> // 包含OpenGL實用庫
接下來須要設置使用的全部變量。本節中的例程將建立一個空的OpenGL窗口,所以咱們暫時還無需設置大堆的變量。餘下須要設置的變量很少,但十分重要。幾乎所寫的每個OpenGL程序中都會用到它們。
第一行設置的變量是Rendering Context(着色描述表)。每個OpenGL都被鏈接到一個着色描述表上。着色描述表將全部的OpenGL調用命令鏈接到Device Context(設備描述表)上。我將OpenGL的着色描述表定義爲 hRC 。要讓程序可以繪製窗口的話,還須要建立一個設備描述表,也就是第二行的內容。Windows的設備描述表被定義爲 hDC 。DC將窗口鏈接到GDI(Graphics Device Interface圖形設備接口)。而RC將OpenGL鏈接到DC。第三行的變量 hWnd 將保存由Windows給咱們的窗口指派的句柄。最後,第四行爲咱們的程序建立了一個Instance(實例)。
HGLRC           hRC=NULL;// 窗口着色描述表句柄
HDC             hDC=NULL;// OpenGL渲染描述表句柄
HWND            hWnd=NULL;// 保存咱們的窗口句柄
HINSTANCE       hInstance;// 保存程序的實例
bool keys[256];// 保存鍵盤按鍵的數組
bool active=TRUE;// 窗口的活動標誌,缺省爲TRUE
bool fullscreen=TRUE;// 全屏標誌缺省,缺省設定成全屏模式
下面的代碼的做用是從新設置OpenGL場景的大小,而無論窗口的大小是否已經改變(假定您沒有使用全屏模式)。OpenGL場景的尺寸將被設置成它顯示時所在窗口的大小。
GLvoid ReSizeGLScene(GLsizei width, GLsizei height){
if (height==0) // 防止被零除
{
height=1;// 將Height設爲1
}
glViewport(0, 0, width, height);// 重置當前的視口
glMatrixMode(GL_PROJECTION);// 選擇投影矩陣
glLoadIdentity();// 重置投影矩陣
// 設置視口的大小
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW);// 選擇模型觀察矩陣
glLoadIdentity();// 重置模型觀察矩陣}
接下的代碼段中,咱們將對OpenGL進行全部的設置。咱們將設置清除屏幕所用的顏色,打開深度緩存,啓用smooth shading(陰影平滑),等等。
int InitGL(GLvoid)// 此處開始對OpenGL進行全部設置{
glShadeModel(GL_SMOOTH);// 啓用陰影平滑
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // 黑色背景
glClearDepth(1.0f); // 設置深度緩存
glEnable(GL_DEPTH_TEST); // 啓用深度測試
glDepthFunc(GL_LEQUAL); // 所做深度測試的類型
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // 告訴系統對透視進行修正
return TRUE; // 初始化 OK
}
下一段包括了全部的繪圖代碼。任何所想在屏幕上顯示的東東都將在此段代碼中出現。
int DrawGLScene(GLvoid)// 從這裏開始進行全部的繪製
{ // 清除屏幕和深度緩存
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity(); // 重置當前的模型觀察矩陣
return TRUE; //  一切 OK
}
下面是咱們的Windows程序的入口。將會調用窗口建立例程,處理窗口消息,並監視人機交互。
int WINAPI WinMain(HINSTANCE hInstance,// 當前窗口實例
HINSTANCE hPrevInstance,// 前一個窗口實例
LPSTR lpCmdLine,// 命令行參數
int nCmdShow) // 窗口顯示狀態
{
建立OpenGL窗口
if (!CreateGLWindow("OpenGL程序框架",640,480,16,fullscreen))
{
return 0; // 失敗退出
}
下面是循環的開始。只要done保持FALSE,循環一直進行。
      保持循環直到 done=TRUE
while(!done)
{
咱們要作的第一件事是檢查是否有消息在等待。使用PeekMessage()能夠在不鎖住咱們的程序的前提下對消息進行檢查。許多程序使用GetMessage(),也能夠很好的工做。但使用GetMessage(),程序在收到paint消息或其餘別的什麼窗口消息以前不會作任何事。
       //有消息在等待嗎?
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
下面的代碼查看是否出現退出消息。若是當前的消息是由PostQuitMessage(0)引發的WM_QUIT,done變量被設爲TRUE,程序將退出。
               // 收到退出消息?
if (msg.message==WM_QUIT)
{
done=TRUE; // 是,則done=TRUE
}
else
{
               // 不是,處理窗口消息
若是不是退出消息,咱們翻譯消息,而後發送消息,使得WndProc() 或 Windows可以處理他們。
TranslateMessage(&msg); // 翻譯消息
DispatchMessage(&msg); // 發送消息
}
}
else // 若是沒有消息
{
若是沒有消息,繪製咱們的OpenGL場景。代碼的第一行查看窗口是否激活。若是按下ESC鍵,done變量被設爲TRUE,程序將會退出。
// 繪製場景。監視ESC鍵和來自DrawGLScene()的退出消息
if (active) // 程序激活的麼?
{
if (keys[VK_ESCAPE]) // ESC 按下了麼?
{
done=TRUE; // ESC 發出退出信號
}
else // 不是退出的時候,刷新屏幕
{
若是程序是激活的且ESC沒有按下,咱們繪製場景並交換緩存(使用雙緩存能夠實現無閃爍的動畫)。咱們實際上在另外一個看不見的"屏幕"上繪圖。當咱們交換緩存後,咱們當前的屏幕被隱藏,如今看到的是剛纔看不到的屏幕。這也是咱們看不到場景繪製過程的緣由。場景只是即時顯示。
            DrawGLScene(); // 繪製場景
SwapBuffers(hDC); // 交換緩存 (雙緩存)
}
}
}
若是done變量再也不是FALSE,程序退出。正常銷燬OpenGL窗口,將全部的內存釋放,退出程序。
// 關閉程序
KillGLWindow(); // 銷燬窗口
return (msg.wParam); // 退出程序
}
在這一課中,詳細解釋了全部的基本步驟。每一步都與設置有關,並建立了一個全屏OpenGL程序。這是框架,幾乎每一個OpenGL程序都會用到這些步驟。

歡迎你們繼續關注更多內容程序員

身爲一名IT技術人員磨練本身的技術是必不可少的,關注微信號coder_online,程序員互動聯盟,能夠與大牛在線隨時討論本身感興趣的話題,讓本身用最少的時間學到最多的東西,掃一掃下方二維碼或者搜索微信號coder_online便可關注。windows

                                       

參考資料:nehe的OpenGL教程http://www.yakergong.net/nehe/數組

相關文章
相關標籤/搜索