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
通常可以在程式的開頭加入以下程式碼來達到連結庫檔案的目的,如果用到了輔助函式,還需要連結輔助函式庫glaux.lib:
#pragma comment(lib, "opengl32.lib")
#pragma comment(lib, "glu32.lib")
#pragma comment(lib, "glaux.lib")
另一種辦法是在VC中設定好工程的引數,如圖1-7所示,通過選單Project->Settings...->Link將opengl32.lib、glu32.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;//當前程式例項控制代碼
其中hDC、hWnd、hInst三個變數很容易理解,重要的是第一個變數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);//這裡有變化
//原來的函式有兩個引數HINSTANCE和nCmdShow,這裡改成更加有用的
//視窗大小和畫素格式
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,//cDepthBits,16位Z-緩衝
0,//cStencilBits,模板緩衝
0,//cAuxBuffers,輔助緩衝
PFD_MAIN_PLANE,//iLayerType,在主繪圖層繪圖
0,//
1第一個OpenGL程式
俗話說,“工欲善其事,必先利其器”,一個好的開發工具能夠使你將注意力其中在程式設計本身,做到事半功倍,反之,可能經常需要解決開發工具的問題。我們建議使用微軟公司的Visual C++ 6.0,如果使用Visual C++ .NET也可以,當 ///////////////////////////////////////////////////////////////////////
//
// triangles.cpp
//
////////////////////////////////////////////////////////////
大家好!本期丹丹將給大家解析第一個OpenGL程式本期視訊的連結地址是:https://www.bilibili.com/video/av21319715大家也可以直接在bi站首頁搜尋:New程式媛 ,即可看到相應視訊本期的資源和程式碼下載連結是:連結:https://pan
1. opengl簡介
按照慣例, 怎麼能少了opengl簡介呢。稍等,我去百度cv個簡介來。
OpenGL(全寫Open Graphics Library)是指定義了一個跨程式語言、跨平臺的程式設計介面規格的專業的圖形程式介面。它用於三維影象(二維也行),是
目錄
1. 第一個 HelloPython 程式
1.1 Python 源程式的基本概念
Python 源程式就是一個特殊格式的文字檔案, 可以使用任意編輯軟體做 Python 的開發
Python 程式的 副檔名 通常都是 .py
1.2 演練步
首先,我們用VisualStudio建立了CUDA的工程後,會出現一個數組對應位置元素求和的模版程式碼,我們可以先借此瞭解CUDA工程的主體結構,然後將他們全都刪掉,從頭開始練習。
假設我們現在要建立384個執行緒,並要知道他們具體屬於哪個執行緒束(W
新建專案
1.使用VisualStudio 2015 新建一個Web專案
2.選擇空模板
3.新增一個新的SignalR Hub Class (v2)類檔案,並修改類名為ChatHub
4.修改ChatHub程式碼
using System;
using Sys
原文http://www.cnblogs.com/songlotus/articles/965368.html
學習OpenGL前的準備工作
第一步,選擇一個編譯環境
選擇Visual Studio 2005作為學習OpenGL的環境。
第二步,配
最近因為需要自己開始學習opengl,但是因為我用的是win7的作業系統,又不想為了學習這麼一個東西還要費勁的去下載安裝vs2008,所以選擇了dev-c++作為自己的開發工具。
但是由於對dev-c++不熟悉,在開始階段走了寫彎路,雖然解決了基本的問題,但是還有些問題自己沒
OpenGL簡介
OpenGL是一種應用程式程式設計介面(Application Programming Interface,API)它是一種可以對圖形硬體裝置特徵進行訪問的軟體庫。
在OpenGL 3.0以前的版本或者使用相容模式的OpenGL環境,Ope
1. 學習網站:
3. 下載了sdk後,在vs中設定了庫檔案和包含檔案目錄後(可能還需把dll放到system32目錄下),新增程式碼如下:
注:下面的程式碼是從http://nehe.gamedev.net/下載來的,為lesson1的程式碼,同時增加些程式碼,不過
學習QT已經有一段時間了,為了可以進一步的學習QT,並學習在QT在使用OpenGL。將定期按照Nehe的OpenGL教程,將功能在QT中全部實現。本部落格釋出的程式碼,在Window XP + Vis
說起程式設計作圖,大概還有很多人想起TC的#include <graphics.h>吧?但是各位是否想過,那些畫面絢麗的PC遊戲是如何編寫出來的?就靠TC那可憐的640*480解析度、16色來做嗎?顯然是不行的。本帖的目的是讓大家放棄TC的老舊圖形介面,讓大家接
//OpenGL的書寫規範 暨我的第一個OpenGL程式
//有了框架,其他就什麼都好說了
#include "..\H\glut.h"
#pragma comment(lib, "glut.lib")
void init(void)
{glClearColor(1.0,
OpenGL的最早版本OpenGL 1.0由Mark Segal和Kurt Akeley釋出於1992年1月,時至今日早已是蒼海滄田。筆者將一小步一小步帶領大家去領略計算機圖形學神奇的世界。
OpenGL的“Hello World”是一個線段繪製小程式。下面直接
第一個OpenGL程式一個簡單的OpenGL程式如下:(注意,如果需要編譯並執行,需要正確安裝GLUT,安裝方法如第一課)
// OpenGl.c #include <GL/glut.h>void myDisplay(void){glClear(GL_COLOR_BUFFER_BIT);gl
android上opengl es基礎知識
Google在Android2.2 以後支援 opengl es 2.2,在Android 4.3以後引入opengl es 3.0。Android中使用openGL會用到GLSurface
//
// main.c
// opengl
//
// Created bych_soft on 12-1-11.
// Copyright (c) 2012年 __MyCompanyName__. All rights reserved.
//
#inclu
面記錄一下Windows下配置OpenGL與我的第一個OpenGL程式。
第一步:選擇一個編譯環境
現在Windows系統的主流編譯環境有Visual Studio,Broland C++ Builder,Dev-C++等,它們都是支援OpenGL的。但這裡我選擇的是V
在上一篇中的環境配置沒有問題,估計程式出現了問題。
OpenGL實用庫函式:43個,以glu作為字首;
OpenGL輔助庫函式:31個,以aux作為字首;
Windows專用庫函式(WGL):6個,以wgl作為字首;
win32API函式(WGL):5個 相關推薦
OpenGL系統設計-2 第一個OpenGL程式
【OpenGL】詳解第一個OpenGL程式
New程式媛OpenGL全解析之—第一個OpenGL程式解析
opengl入門教程(二) 第一個opengl程式
Python_從零開始學習_(2) 第一個 Python 程式
CUDA學習筆記(2) 第一個CUDA程式
【SignalR學習系列】2. 第一個SignalR程式
在vs2005下的第一個OpenGL程式。
用dev-c++寫自己的第一個opengl程式
現代OpenGL(一):我的第一個OpenGL程式
第一個Opengl程式
QT中第一個OpenGL程式
第一課,編寫第一個OpenGL程式
OpenGL用法暨第一個OpenGL程式
OpenGL從1.0開始--第一個OpenGL程式
OpenGL學習——第二課:第一個OpenGL程式
android studio上第一個opengl es程式
我的第一個OpenGL 程式
【VS開發】【OpenGL開發】OpenGL---Windows下配置與第一個OpenGL程式
OpenGL入門(二):第一個OpenGL程式