1. 程式人生 > >OpenGL系統設計-2 第一個OpenGL程式

OpenGL系統設計-2 第一個OpenGL程式

1第一個OpenGL程式

俗話說,“工欲善其事,必先利其器”,一個好的開發工具能夠使你將注意力其中在程式設計本身,做到事半功倍,反之,可能經常需要解決開發工具的問題。我們建議使用微軟公司的Visual C++ 6.0,如果使用Visual C++ .NET也可以,當然使用Borland C++C++ Builder或者Watcom C++也完全可以,這也要看個人的愛好。

之所以把一個“Hello World”程式單獨算作一章,是因為在這一章很重要,我們要先奠定OpenGL應用程式的框架,以後的程式將使用這一框架。

1.1環境設定

Windows系統中,opengl32.dll

glu32.dll提供對OpenGL的支援,所以應該在編譯OpenGL程式時連結相應的庫檔案。

通常可以在程式的開頭加入以下程式碼來達到連結庫檔案的目的,如果用到了輔助函式,還需要連結輔助函式庫glaux.lib:

#pragma comment(lib, "opengl32.lib")

#pragma comment(lib, "glu32.lib")

#pragma comment(lib, "glaux.lib")

另一種辦法是在VC中設定好工程的引數如圖1-7所示通過選單Project->Settings...->Linkopengl32.libglu32.lib

glaux.lib如果需要的話三個檔案加入工程中。

1-7VC++靜態庫設定

1.2OpenGL應用框架

開發環境設定完畢後,我們開始第一個OpenGL程式“Hello World”。因為三維圖形通常對效能和速度要求比較高,我們就使用Win32 API來寫程式碼,而不使用MFC。實際上,真正的大型高效能三維圖形軟體和遊戲軟體是很少會使用MFC來寫的。

首先使用VC的Win32 Application Wizard建立一個Hello World的Win32程式,該工程一共包含9個檔案,Hello.cpp、Hello.rc、StdAfx.cpp、Hello.h、resource.h、StdAfx.h、Hello.ico、small.ico和Readme.txt。

把StdAfx.cpp、StdAfx.h兩個檔案刪除,再通過選單Project->Settings...->C/C++將Project Options編譯開關中的 /Yu"stdafx.h" 去掉,然後將Hello.cpp按照以下方式進行修改。

#include "windows.h"//Windows標準API的標頭檔案

#include "resource.h"//本程式資源定義檔案

//增加opengl的標頭檔案

#include "gl/gl.h"//OpenGL32庫的標頭檔案

#include "gl/glu.h"//glu32庫的標頭檔案

#include "gl/glaux.h"//輔助庫的標頭檔案

#define WIN32_LEAN_AND_MEAN//表示不使用MFC

#define WIDTH640//視窗的寬度

#define HEIGHT480//視窗的高度

#define BITS16//程式的畫素格式

然後定義幾個全域性變數

HGLRC hRC=NULL;//渲染描述表控制代碼

HDC hDC=NULL;//裝置描述表控制代碼

HWND hWnd=NULL;//當前視窗控制代碼

HINSTANCE hInst;//當前程式例項控制代碼

其中hDChWndhInst三個變數很容易理解重要的是第一個變數hRC它是OpenGL程式的特色表示渲染描述表Rendering Context。它將所有的OpenGL呼叫全部連線到對應的裝置描述表hDC上,hDC通過圖形裝置介面GDI將視窗聯結為一體,通過Windows系統完成顯示。

然後再定義一個表示應用是否啟用的標誌bActive:

BOOL bActive;//當前應用程式是否處於啟用狀態

下面幾行在原來的檔案中有,不用修改。

TCHAR szTitle[MAX_LOADSTRING];// The title bar text

TCHAR szWindowClass[MAX_LOADSTRING];// The title bar text

// Foward declarations of functions included in this code module:

ATOMMyRegisterClass(HINSTANCE hInstance);

BOOLInitInstance(int Width, int Height, int Bits);//這裡有變化

//原來的函式有兩個引數HINSTANCEnCmdShow,這裡改成更加有用的

//視窗大小和畫素格式

LRESULT CALLBACKWndProc(HWND, UINT, WPARAM, LPARAM);

接下來是我們自定義的函式原型說明,用於處理OpenGL的初始化,主流程和OpenGL的關閉。

void glMain(){};

void glShutdown(){};

void glInit(){};

然後進入我們程式的入口WinMain做一些改動。

int APIENTRY WinMain(HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPSTRlpCmdLine,

intnCmdShow)

{

// TODO: Place code here.

MSG msg;

//HACCEL hAccelTable;

// Initialize global strings

LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);

LoadString(hInstance, IDC_HELLO, szWindowClass, MAX_LOADSTRING);

MyRegisterClass(hInstance);

hInst = hInstance;

// Perform application initialization:

if (!InitInstance (WIDTH, HEIGHT, BITS))

{

return FALSE;

}

//hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_HELLO);

// 下面的訊息主迴圈有變化

//初始化OpenGL

glInit();

while(TRUE)

{

//檢查佇列是否有訊息,若有就取出。這裡使用PM_REMOVE表示取出後從佇列中刪除。

if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))

{

//如果是WM_QUIT訊息就停止

if (msg.message == WM_QUIT)

break;

TranslateMessage(&msg);

//將訊息傳送到視窗函式WndProc

DispatchMessage(&msg);

} // end if

//只有程式處於啟用狀態時才進入OpenGL的主程式進行繪製

if(bActive)

{

glMain();

}

} // end while

//程式結束前關閉OpenGL

glShutdown();

returnmsg.wParam;

} // end WinMain

WinMain函式中我們看到了增加兩個函式glMain()glShutdown()。其中對OpenGl的各種變換、處理、顯示都在glMain()中,它是我們的OpenGL應用真正的主函式。當程式收到退出訊息時,先關閉OpenGL,這些在glShutdown()中實現。

接下來我們看MyRegusterClass函式,該函式僅僅是註冊視窗函式,幾乎不用改變。

ATOM MyRegisterClass(HINSTANCE hInstance)

{

WNDCLASSEX wcex;

wcex.cbSize = sizeof(WNDCLASSEX);

wcex.style= CS_HREDRAW | CS_VREDRAW;

wcex.lpfnWndProc= (WNDPROC)WndProc;

wcex.cbClsExtra= 0;

wcex.cbWndExtra= 0;

wcex.hInstance= hInstance;

wcex.hIcon= LoadIcon(hInstance, (LPCTSTR)IDI_HELLO1);

wcex.hCursor= LoadCursor(NULL, IDC_ARROW);

wcex.hbrBackground= (HBRUSH)(COLOR_WINDOW+1);

wcex.lpszMenuName= NULL; //這裡不使用選單因此在對應的資源中

//選單資源和About對話方塊資源都可以刪除。

wcex.lpszClassName= szWindowClass;

wcex.hIconSm= LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);

return RegisterClassEx(&wcex);

}

再下來是InitInstance函式,這個函式很重要整個OpenGL就從這裡開始。它和VC生成的InitInstance()函式不同。原始的InitInstance有兩個引數:程式例項hInstance和視窗顯示方式nCmdShow。其中hInstance可以用全域性變數hInst代替,nCmdShow可以使用固定的方式來實現。因此可以使用三個引數來建立視窗,這三個引數就是視窗的寬、高以及程式的畫素格式。

在InitInstance中,首先根據設定大小使用CreateWindowEx建立一個帶有標題欄、可變大小邊框、可最大最小化的視窗。然後使用Win32提供的OpenGL擴充套件函式ChoosePixelFormat選擇畫素格式,再呼叫SetPixelFormat設定程式的畫素格式。接下來使用呼叫擴充套件函式wglMakeCurrent將當前的DC和OpenGL的RC連線起來。如果沒有問題,就呼叫ShowWindow顯示視窗。

Windows建立的視窗大小是包括了客戶區(Client Area),標題欄的。所以如果以指定的大小(例如640x480)呼叫CreateWindowEx,那麼OpenGL在繪圖時有可能會覆蓋到標題欄上,這是我們應該避免的。因此,在呼叫CreateWindowEx建立視窗前,可以先使用AdjustWindowRectEx對視窗的大小進行調整,將得到的大小作為CreateWindowEx的引數,這樣,得到的視窗本身已經比預設的值要大,其繪圖客戶區的大小就是預設的值。OpenGL在作圖時就只會在客戶區繪圖,這正是我們所期望的。

BOOL InitInstance(int width, int height, int bits)

{

uint PixelFormat;//畫素格式

DWORD dwExStyle; // 擴充套件視窗風格

DWORD dwStyle;// 視窗風格

//設定畫素格式

static PIXELFORMATDESCRIPTOR pfd=

{

sizeof(PIXELFORMATDESCRIPTOR),//本結構的大小

1,//畫素格式描述符的版本號

PFD_DRAW_TO_WINDOW |//該畫素格式需要支援視窗

PFD_SUPPORT_OPENGL |//該畫素格式需要支援OpenGL

PFD_DOUBLEBUFFER,//需要支援雙緩衝

PFD_TYPE_RGBA,//RGBA格式

bits,//畫素格式的顏色位數

0, //紅色位

0,//RedShift

0, //綠色位

0,//GreenShift

0,//藍色位

0,//BlueShift

0,//Alpha

0,//AlphaShift

0,//cAccumBits

0,//cAccumRedBits

0, //cAccumGreenBits

0, //cAccumBlueBits

0,//cAccumAlpha

16,//cDepthBits16Z-緩衝

0,//cStencilBits模板緩衝

0,//cAuxBuffers輔助緩衝

PFD_MAIN_PLANE,//iLayerType在主繪圖層繪圖

0,//

相關推薦

OpenGL系統設計-2 一個OpenGL程式

1第一個OpenGL程式 俗話說,“工欲善其事,必先利其器”,一個好的開發工具能夠使你將注意力其中在程式設計本身,做到事半功倍,反之,可能經常需要解決開發工具的問題。我們建議使用微軟公司的Visual C++ 6.0,如果使用Visual C++ .NET也可以,當

OpenGL】詳解一個OpenGL程式

/////////////////////////////////////////////////////////////////////// // // triangles.cpp // ////////////////////////////////////////////////////////////

New程式OpenGL全解析之—一個OpenGL程式解析

大家好!本期丹丹將給大家解析第一個OpenGL程式本期視訊的連結地址是:https://www.bilibili.com/video/av21319715大家也可以直接在bi站首頁搜尋:New程式媛 ,即可看到相應視訊本期的資源和程式碼下載連結是:連結:https://pan

opengl入門教程(二) 一個opengl程式

1. opengl簡介 按照慣例, 怎麼能少了opengl簡介呢。稍等,我去百度cv個簡介來。 OpenGL(全寫Open Graphics Library)是指定義了一個跨程式語言、跨平臺的程式設計介面規格的專業的圖形程式介面。它用於三維影象(二維也行),是

Python_從零開始學習_(2) 一個 Python 程式

目錄 1.  第一個 HelloPython 程式 1.1 Python 源程式的基本概念 Python 源程式就是一個特殊格式的文字檔案,  可以使用任意編輯軟體做 Python 的開發 Python 程式的 副檔名 通常都是 .py 1.2 演練步

CUDA學習筆記(2) 一個CUDA程式

  首先,我們用VisualStudio建立了CUDA的工程後,會出現一個數組對應位置元素求和的模版程式碼,我們可以先借此瞭解CUDA工程的主體結構,然後將他們全都刪掉,從頭開始練習。   假設我們現在要建立384個執行緒,並要知道他們具體屬於哪個執行緒束(W

【SignalR學習系列】2. 一個SignalR程式

新建專案 1.使用VisualStudio 2015 新建一個Web專案 2.選擇空模板 3.新增一個新的SignalR Hub Class (v2)類檔案,並修改類名為ChatHub   4.修改ChatHub程式碼 using System; using Sys

在vs2005下的一個OpenGL程式

原文http://www.cnblogs.com/songlotus/articles/965368.html 學習OpenGL前的準備工作 第一步,選擇一個編譯環境 選擇Visual Studio 2005作為學習OpenGL的環境。 第二步,配

用dev-c++寫自己的一個opengl程式

最近因為需要自己開始學習opengl,但是因為我用的是win7的作業系統,又不想為了學習這麼一個東西還要費勁的去下載安裝vs2008,所以選擇了dev-c++作為自己的開發工具。 但是由於對dev-c++不熟悉,在開始階段走了寫彎路,雖然解決了基本的問題,但是還有些問題自己沒

現代OpenGL(一):我的一個OpenGL程式

OpenGL簡介 OpenGL是一種應用程式程式設計介面(Application Programming Interface,API)它是一種可以對圖形硬體裝置特徵進行訪問的軟體庫。 在OpenGL 3.0以前的版本或者使用相容模式的OpenGL環境,Ope

一個Opengl程式

1. 學習網站: 3. 下載了sdk後,在vs中設定了庫檔案和包含檔案目錄後(可能還需把dll放到system32目錄下),新增程式碼如下: 注:下面的程式碼是從http://nehe.gamedev.net/下載來的,為lesson1的程式碼,同時增加些程式碼,不過

QT中一個OpenGL程式

學習QT已經有一段時間了,為了可以進一步的學習QT,並學習在QT在使用OpenGL。將定期按照Nehe的OpenGL教程,將功能在QT中全部實現。本部落格釋出的程式碼,在Window XP + Vis

第一課,編寫一個OpenGL程式

說起程式設計作圖,大概還有很多人想起TC的#include <graphics.h>吧?但是各位是否想過,那些畫面絢麗的PC遊戲是如何編寫出來的?就靠TC那可憐的640*480解析度、16色來做嗎?顯然是不行的。本帖的目的是讓大家放棄TC的老舊圖形介面,讓大家接

OpenGL用法暨一個OpenGL程式

//OpenGL的書寫規範 暨我的第一個OpenGL程式 //有了框架,其他就什麼都好說了 #include "..\H\glut.h"  #pragma comment(lib, "glut.lib") void init(void) {glClearColor(1.0,

OpenGL從1.0開始--一個OpenGL程式

OpenGL的最早版本OpenGL 1.0由Mark Segal和Kurt Akeley釋出於1992年1月,時至今日早已是蒼海滄田。筆者將一小步一小步帶領大家去領略計算機圖形學神奇的世界。 OpenGL的“Hello World”是一個線段繪製小程式。下面直接

OpenGL學習——第二課:一個OpenGL程式

第一個OpenGL程式一個簡單的OpenGL程式如下:(注意,如果需要編譯並執行,需要正確安裝GLUT,安裝方法如第一課) //  OpenGl.c  #include <GL/glut.h>void myDisplay(void){glClear(GL_COLOR_BUFFER_BIT);gl

android studio上一個opengl es程式

android上opengl es基礎知識            Google在Android2.2 以後支援 opengl es 2.2,在Android 4.3以後引入opengl es 3.0。Android中使用openGL會用到GLSurface

我的一個OpenGL 程式

// //  main.c //  opengl // //  Created bych_soft on 12-1-11. //  Copyright (c) 2012年 __MyCompanyName__. All rights reserved. // #inclu

【VS開發】【OpenGL開發】OpenGL---Windows下配置與一個OpenGL程式

面記錄一下Windows下配置OpenGL與我的第一個OpenGL程式。 第一步:選擇一個編譯環境 現在Windows系統的主流編譯環境有Visual Studio,Broland C++ Builder,Dev-C++等,它們都是支援OpenGL的。但這裡我選擇的是V

OpenGL入門(二):一個OpenGL程式

在上一篇中的環境配置沒有問題,估計程式出現了問題。 OpenGL實用庫函式:43個,以glu作為字首; OpenGL輔助庫函式:31個,以aux作為字首; Windows專用庫函式(WGL):6個,以wgl作為字首; win32API函式(WGL):5個