OpenGL編程逐步深刻(一)建立一個窗口

原文地址: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函數用於交互前臺緩存區和後臺緩存區,在下一輪渲染回調中後臺緩存區中的圖形會在屏幕中顯示出來。

編譯運行

編譯運行程序發現一個黑色背景的窗口建立成功。

這裏寫圖片描述

程序源碼下載:
http://download.csdn.net/detail/rongbo_j/8579603

相關文章
相關標籤/搜索