1. 程式人生 > >【OpenGL】 建立視窗

【OpenGL】 建立視窗

使用 glut

opengl 標準並沒有提供用於建立和管理視窗的 api,各個主流作業系統都提供了支援 opengl 的介面,x 系統提供的介面叫做 GLX,windows 提供的介面叫 WGL,mac 系統提供的介面叫做 CGL。我們可以使用 opengl 的一個工具庫 glut(opengl utility toolkit)來管理視窗,處理事件,IO 控制和其它裝置管理。
首先,我們需要下載 glut 庫,下載地址
http://www.opengl.org/resources/libraries/glut/glutdlls37beta.zip
下載之後得到五個檔案,glut.h,glut.lib,glut32.lib,glut.dll 和 glut32.dll。接下來就是配置環境變量了,我使用的環境是 windows+visual studio。

  • 第一步,把 glut.h 放在 visual studio 安裝目錄下的 VC/include/gl 目錄中(預設沒有 gl 資料夾,自己建立一個)
  • 第二步,把 glut.lib 和 glut32.lib 放在 visual studio 安裝目錄下的 VC/lib 目錄下
  • 第三步,把 glut.dll 和 glut32.dll 放在系統目錄 c:\windows\system32 目錄下,64 位系統放在 c:\windows\syswow64 目錄下

第一個例子

新建一個 C++ 空專案,控制檯或 win32 都行,然後新增一個原始檔

#include <gl/glut.h>
#include <iostream> using namespace std; void renderPreFrame(); int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA); glutInitWindowPosition(100, 100); glutInitWindowSize(400, 400); glutCreateWindow("First Window"); glutDisplayFunc(renderPreFrame); glClearColor(0.0f
, 0.0f, 0.0f, 0.0f); glutMainLoop(); return 0; } void renderPreFrame() { glClear(GL_COLOR_BUFFER_BIT); glutSwapBuffers(); }

執行之後可以看到一個 400x400 的黑視窗,在距離左上角 (100,100) 的位置。
opengl 庫有三類函式,115 個以 gl 開頭的函式是 opengl 核心庫函式,43個以 glu 開頭的函式是 opengl 實用庫函式,31 個以 aux 開頭的函式是 opengl 輔助庫函式。另外在 windows 平臺下,有 6 個以 wgl 開頭的函式是 windows 專用庫函式,還有 5 個無字首的函式是 win32api 函式。opengl 核心庫,實用庫和輔助庫,windows 作業系統已經配置好了,所以這些函式都可以直接使用。我們下載的工具庫函式都是以 glut 開頭,平時最常用的函式就是核心庫函式(glFun),實用庫函式(gluFun)和工具庫函式(glutFun)。

  • glutInit 函式用於初始化 glut,其引數可以直接從命令列獲取,從命令列啟動程式可以帶一些有用的引數,比如 -sync 可以關閉 X 非同步性質,-gldebug 可以檢查 gl 錯誤並獨立地顯示它們
  • glutInitDisplayMode 配置 glut 選項,GLUT_DOUBLE 設定雙緩衝,即一個緩衝繪製,一個緩衝顯示,預設是單緩衝 GLUT_SINGLE;GLUT_RGBA 指定大多數渲染結束位置(比如螢幕)的顏色模式
  • glutInitWindowPosition 指定視窗的位置,glutInitWindowSize 指定視窗大小,glutCreateWindow 用於建立視窗,其引數是視窗的標題
  • glutDisplayFunc 為 opengl 的渲染主回撥函式,glut 提供了一些 opengl 與視窗系統互動的函式,glutDisplayFunc 就是其中一個,這個回撥函式完成一幀中的所有渲染工作,在 glut 內部迴圈中不斷呼叫。主回撥函式並不會每一幀都繪製,只有視窗發生變化需要重新繪製時才會呼叫
  • glClearColor 設定清除幀緩衝時所用的顏色,顏色有四個通道 RGBA,取值範圍為 0~1 之間。這是一個核心庫函式。在這裡我們首次接觸到 opengl 的狀態(state),渲染是一個複雜的過程,不能像普通函式一樣接受幾個引數就能完成功能,它需要指定 shaders,buffers 和其它各種屬性,另外幾個渲染操作可能使用同樣的屬性;因此 opengl 引入了 state,渲染命令只使用跟繪製頂點個數和初始化偏移值有關的個別屬性,其它屬性根據當前狀態設定;修改狀態後,它的值會一直維持不變直到下次修改
  • glutMainLoop 將程式控制權交給 glut 並開啟其內部迴圈;在這個迴圈中,它監聽來自視窗系統的事件並通過設定的回撥函式傳遞給 glut,最常見的就是我們設定的渲染主函式;glutMain 只會呼叫一次,呼叫之後視窗系統就在這裡阻塞,將控制權移交給 glut
  • 在渲染主回撥函式中,glClear 使用前面設定的顏色清除幀緩衝;在每次渲染之前,都得先將之前的幀緩衝進行清除
  • 在渲染主回撥函式中,glutSwapBuffers 將前置緩衝和後置緩衝進行交換,這是雙緩衝模式呼叫的函式,如果是單緩衝模式則使用 glFlush 函式

至此,一個使用 opengl 的視窗就建立完成了,這裡使用了 2 個核心庫函式和 8 個工具庫函式,添加了一個回撥函式,處理每一幀的渲染工作,在這個回撥函式裡新增一些繪製圖元的函式,就可以在視窗中顯示圖形了,我們下一節就幹這件事。

相關推薦

OpenGL 建立視窗

使用 glut opengl 標準並沒有提供用於建立和管理視窗的 api,各個主流作業系統都提供了支援 opengl 的介面,x 系統提供的介面叫做 GLX,windows 提供的介面叫 WGL,mac 系統提供的介面叫做 CGL。我們可以使用 opengl

Modern OpenGL建立視窗

Hello Window 在這一次中讓我們首先測試上次配置的GLFW和GLEW是否能夠正常的執行。上次已經新建了一個空工程,但是其中並沒有任何源程式檔案。現在,我們向其中新增一個檔案,我新增的是main.cpp。在這個檔案中我們通過使用GLFW和GLEW相

windows應用程式建立視窗

我們在建立視窗時需要的過程  關於訊息迴圈 因為處理器同時只能執行一個程式 因此我們需要作業系統去排程程式 因此我們只是將訊息傳給作業系統 等待迴應從而由作業系統來顯示我們需要的視窗 wndproc() 視窗過程負責用來響應某一類視窗收到的各種Windows訊息

OpenGL-007 在視窗上顯示一個三角形

【OpenGL】-007 在視窗上顯示一個三角形 文章目錄 【OpenGL】-007 在視窗上顯示一個三角形 1. 在視窗上顯示一個三角形 2. 效果 3. 備註 1. 在視窗上顯示一個三角形 /* Fi

OpenGLShader實例分析(七)- 雪花飄落效果

mouse llb cto 接下來 pix lan details effect art 轉發請保持地址:http://blog.csdn.net/stalendp/article/details/40624603 研究了一個雪花飄落效果。感覺挺不錯的。分享給大家,效

OPenGLopengl 64位 配置

技術 添加 os x 源代碼 lar ebs 庫文件 定義 software 1.GLEW The OpenGL Extension Wrangler Library (GLEW) is a cross-platform open-source C/C++ extensio

OpenGLShader實例分析(九)- AngryBots中的主角受傷特效

spa 2.7 imp ttext pro tint shader 作用 負責 轉發請保持地址:http://blog.csdn.net/stalendp/article/details/40859441 AngryBots是Unity官方的一個非常棒的樣例。非常有研究

Shell建立一個腳本統計當前登錄用戶數

得出 pla 用戶信息 shell splay col ont char image who命令who命令是顯示目前登陸系統的用戶信息,執行who命令可以得知目前哪些用戶登入系統,單獨執行who命令會列出登入賬號,使用的終端機,登入的時間以及從何處登入或正在使用哪個顯示器。

OpenGLLNK1104 無法打開文件“freeglutd.lib”

lease 編譯 idt pen spa bubuko 預處理器 無法打開 解決 新建的OpenGL程序編譯時經常會出現[LNK1104 無法打開文件“freeglutd.lib”]問題,如果freeglutd.lib確實放到了正確的路徑下,通常可以通過添加“NDEBUG”

OpenGL平移變換矩陣

AC pan sel .com light alt style 分享圖片 平移 摘自:http://ogldev.atspace.co.uk/www/tutorial06/tutorial06.html 以下等式計算平移:等式左邊,左項為旋轉平移矩陣M,右項為原坐標P,

練習滑動視窗

 P1886 滑動視窗 單調佇列經典題目直接上程式碼 1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 using namespace std; 5 const

OpenGL-010 使用shader

【OpenGL】-010 使用shader 文章目錄 【OpenGL】-010 使用shader 1. OpenGL中的shader 2. 示例 2. shader的使用流程 1. OpenGL中的shade

OpenGL-009 GLUT中處理鍵盤滑鼠事件

【OpenGL】-009 GLUT中處理鍵盤滑鼠事件   鍵盤和滑鼠是GUI程式獲取使用者輸入的重要方式,在windows程式中,通過WM_KEY_DOWN/WM_KEY_UP/WM_LBUTTONDOWN/WM_RBUTTONDOWN等訊息的響應,使用者可以方便的處理鍵盤滑鼠的輸入。在

OpenGL-008 GLUT中的定時器

【OpenGL】-008 GLUT中的定時器   定時器是視窗程式中的一個重要功能,用於按照固定的時間間隔之後執行某些特定動作。在window程式中,有WM_TIMER訊息進行響應。在使用GLUT進行視窗管理的程式中,如何進行定時器操作? 文章目錄 【OpenG

10python視窗控制[隱藏,移動]

    步驟一:下載小軟體,如下圖 該軟體用於提取需要控制程式視窗的具體資訊 二、程式程式碼 #__author:"**佳" #date: 2018/10/20 0020 #function:QQ圖示繫結python檔案 ,執行快捷方式即啟動該程式 import

最簡單的 UBO(Uniform Buffer Object) OpenGLGLSL

一、引入 Uniform Buffer Object / Uniform Block 的 原因 1)  如果程式涉及了多個 Shader 程式,而且它們使用同一個Uniform變數,那麼你就需要為每個 Shader 程式單獨管理它們。當一個程式被連結時,OpenGL 會自動生成

WPF建立文字字串的路徑PathGeometry

/// <summary> /// 建立文字路徑 /// </summary> /// <param name="word">文字字串</param> /// <para

ROS建立Publisher和Subscriber過程中遇到的問題和解決方案

Tutorial連結:http://wiki.ros.org/ROS/Tutorials/WritingPublisherSubscriber%28c%2B%2B%29   1. 寫好並儲存好了talker.cpp和listener.cpp卻無法建立 檢查~/catkin

QtWebSocket建立一個簡單的websocket連線

1、使用說明 pro檔案中: QT += websockets C++類檔案中: #include <QWebSocket> 2、客戶端的demo 該demo實現的功能: 1、建立webSocket連線; 2、連線中斷後,自動發起重連,週期為3秒。 這裡新建一個類,類

cocos2dx建立ios專案

1.開啟終端 2.將下載的3.6版本中的setup.py拖進終端,這時候會提醒做一些環境變數的配置資訊,如果不需要搭建安卓的開發環境這些東西就不需要配置 3.關閉一下重新開啟,進入到cocos2dx的版本目錄下,直接可以拖進去 cd 拖動版本資料夾 4.輸入cocos new 專案名