原文地址:http://ogldev.atspace.co.uk/
原文中使用gnu make進行項目管理,本系列文章使用visual studio2012。在翻譯過程當中並不是直譯,加入了一些筆者我的觀點。css
OpenGl官方使用規範中並無提供建立和操做窗口的API,目前像window、linux等支持圖形化界面的操做系統都支持OpenGl,提供一個與OpenGl上下文綁定的窗口系統。例如在X window中可使用GLX建立窗口,Windows平臺和MacOS平臺則能夠分別使用WGL、CGL。直接使用這些接口建立窗口並顯示圖形是很是繁瑣的,一般第三方庫來建立圖形應用,在此係列文章中咱們使用的是GLUT(OpenGl utility libray),它提供的API可以很方便的進行窗口管理、事件處理、輸入輸出控制等。另外GLUT的跨平臺特性使得程序具備更好的移植性。linux
freeglut爲開源庫,採用cmake進行項目管理,讀者須要本身編譯得到庫文件,筆者將所須要的資源文件和庫都整理好了。
下載地址:
http://download.csdn.net/detail/rongbo_j/8578357
http://download.csdn.net/detail/rongbo_j/8578385
http://download.csdn.net/detail/rongbo_j/8578405c++
1.新建控制檯應用程序,將項目所需的庫文件和資源拷貝到解決方案根目錄下。
2.在項目上點擊右鍵,打開屬性頁在vc++目錄中的包含目錄中添加$(SolutionDir)Include
路徑;在庫目錄中添加$(SolutionDir)Lib
路徑。在連接器->輸入->附加依賴項中添加freeglut.lib。redis
/* Copyright 2010 Etay Meiri This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. Tutorial 01 - Hello Window! */
#include "stdafx.h"
#include <GL/freeglut.h>
static void RenderSceneCB()
{
glClear(GL_COLOR_BUFFER_BIT);
glutSwapBuffers();
}
static void InitializeGlutCallbacks()
{
glutDisplayFunc(RenderSceneCB);
}
int _tmain(int argc, _TCHAR* argv[])
{
//初始化glut
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA);
//設置窗口尺寸
glutInitWindowSize(1024, 768);
//設置窗口位置
glutInitWindowPosition(100, 100);
//建立窗口並顯示,標題爲Tutorial 01
glutCreateWindow("Tutorial 01");
InitializeGlutCallbacks();
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glutMainLoop();
return 0;
}
glutInit(&argc, argv);
緩存
該函數用於初始化GLUT,能夠經過控制檯命令行向glut傳遞參數,調試程序時能夠輸入’-gldebug’參數,還能夠用來控制GLUT的一些屬性,例如’-sync’。markdown
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
函數
經過這個函數咱們能夠配置GLUT的一些選項,GLUT_DOUBLE表示使用雙緩存機制(上一幀圖形顯示時,下一幀圖形先在緩存區中繪製), GLUT_RGBA指定使用RGBA模式的窗口。oop
glutInitWindowSize(1024, 768);
glutInitWindowPosition(100, 100);
glutCreateWindow("Tutorial 01");
這一組函數用於說明窗口建立的參數,分別指定窗口的尺寸,位置,標題。this
glutDisplayFunc(RenderSceneCB);
因爲工做在窗口系統中,大部分和程序的交互都是經過事件回調函數來完成。GLUT較爲注重和底層窗口系統交互,併爲咱們提供了一些回調的選擇,在這裏咱們僅僅使用一個主回調方法來完成因此的渲染工做。spa
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
在這裏咱們將會第一次接觸OpenGl狀態的概念。渲染是一項很是複雜的任務,沒法經過調用函數,多接收幾個參數就能完成,還要指定着色器,緩衝區和一些相關的標誌位。並且,有時候多個渲染操做須要保持相同的配置。這就是爲何大多數渲染操做的配置都是經過設置OpenGl狀態機中標誌位的值來完成的緣由。在調用改變狀態的函數以後,一些相關配置的值保持不變,直到下一次調用改變該配置值的函數。
此函數設置的顏色會在清除幀緩存時使用,該顏色有四個通道(RGBA),值必須在0.0和1.0之間。
glutMainLoop();
調用該函數開始GLUT內部循環,監聽Windows系統事件,調用用戶指定的回調函數。在本案例中,咱們經過glutDisplayFunc註冊了RenderSceneCB函數進行渲染。
glClear(GL_COLOR_BUFFER_BIT);
glutSwapBuffers();
在渲染函數中咱們所作的僅僅是調用glClear函數清除幀緩存(使用glClearColor指定的顏色),glutSwapBuffers函數用於交互前臺緩存區和後臺緩存區,在下一輪渲染回調中後臺緩存區中的圖形會在屏幕中顯示出來。
編譯運行程序發現一個黑色背景的窗口建立成功。