現代opengl 設計入門 準備第乙個工程

2021-09-10 05:07:53 字數 3280 閱讀 5723

本文主要是現代opengl第乙個工程的準備,包括glfw, glad,工程屬性設定。

本文參照   和  學習而來,包含自己的學習體會和圖示在內。在visual studio 2010下完成**測試的。

在我們用opengl 畫出出色的效果之前,首先要做的就是建立乙個opengl上下文(context)和乙個用於顯示的視窗。然而,這些操作在每個系統上都是不一樣的,opengl有目的地從這些操作抽象(abstract)出去。這意味著我們不得不自己處理建立視窗,定義opengl上下文以及處理使用者輸入。

幸運的是,有一些庫已經提供了我們所需的功能,其中一部分是特別針對opengl的。這些庫節省了我們書寫作業系統相關**的時間,提供給我們乙個視窗和上下文用來渲染。最流行的幾個庫有glut,sdl,sfml和glfw。在教程裡我們將使用glfw

glfw是乙個專門針對opengl的c語言庫,它提供了一些渲染物體所需的最低限度的介面。它允許使用者建立opengl上下文,定義視窗引數以及處理使用者輸入,這正是我們需要的。

本節和下一節的目標是建立glfw環境,並保證它恰當地建立opengl上下文並顯示視窗。這篇教程會一步步從獲取、編譯、鏈結glfw庫講起。我們使用的是microsoft visual studio 2010 ide(操作過程在新版的visual studio都是相同的)。如果你用的不是visual studio(或者用的是它的舊版本)請不要擔心,大多數ide上的操作都是類似的。

解壓後目錄內容如下:

include 目錄是我們在include 裡需要的.h 檔案,lib-vc2010 是庫連線需要的檔案,當然你的vc 版本不同,選擇的庫也不同。

或者你可以選擇源**編譯,但記住我們需要的包含和庫連線需要的檔案。

首先,開啟visual studio,建立乙個新的專案。如果vs提供了多個選項,選擇visual c++,然後選擇empty project(空專案)(別忘了給你的專案起乙個合適的名字)。現在我們終於有乙個空的工作空間了,開始建立我們第乙個opengl程式吧!

鏈結為了使我們的程式使用glfw,我們需要把glfw庫鏈結(link)進工程。這可以通過在鏈結器的設定裡指定我們要使用glfw3.lib來完成,但是由於我們將第三方庫放在另外的目錄中,我們的工程還不知道在哪尋找這個檔案。於是我們首先需要將我們放第三方庫的目錄新增進設定。

要新增這些目錄(需要vs搜尋庫和include檔案的地方),我們首先進入project properties(工程屬性,在解決方案視窗裡右鍵專案),然後選擇vc++ directories(vc++ 目錄)選項卡(如下圖)。在下面的兩欄新增目錄:

我的情況是把include 下的glfw目錄複製到 d:\dxf\include 下,glfw3.lib 庫複製到d:\dxf\lib 下,然後是上面的設定。

現在vs可以找到所需的所有檔案了。最後需要在linker(鏈結器)選項卡裡的input(輸入)選項卡裡新增glfw3.lib這個檔案,我這裡debug 版本,庫名改為glfw3d.lib:

要鏈結乙個庫我們必須告訴鏈結器它的檔名。庫名字是glfw3.lib,我們把它加到additional dependencies(附加依賴項)欄位中(手動或者使用選項都可以)。這樣glfw在編譯的時候就會被鏈結進來了。除了glfw之外,你還需要新增乙個鏈結條目鏈結到opengl的庫,但是這個庫可能因為系統的不同而有一些差別。

windows上的opengl庫

如果你是windows平台,opengl32.lib已經包含在microsoft sdk裡了,它在visual studio安裝的時候就預設安裝了。由於這篇教程用的是vs編譯器,並且是在windows作業系統上,我們只需將opengl32.lib新增進聯結器設定裡就行了。

glfw的安裝與配置就到此為止。

到這裡還沒有結束,我們仍然還有一件事要做。因為opengl只是乙個標準/規範,具體的實現是由驅動開發商針對特定顯示卡實現的。由於opengl驅動版本眾多,它大多數函式的位置都無法在編譯時確定下來,需要在執行時查詢。所以任務就落在了開發者身上,開發者需要在執行時獲取函式位址並將其儲存在乙個函式指標中供以後使用。取得位址的方法因平台而異,在windows上會是類似這樣:

// 定義函式原型

typedef void (*gl_genbuffers) (glsizei, gluint*);

// 找到正確的函式並賦值給函式指標

gl_genbuffers glgenbuffers = (gl_genbuffers)wglgetprocaddress("glgenbuffers");

// 現在函式可以被正常呼叫了

gluint buffer;

glgenbuffers(1, &buffer);

你可以看到**非常複雜,而且很繁瑣,我們需要對每個可能使用的函式都要重複這個過程。幸運的是,有些庫能簡化此過程,其中glad是目前最新,也是最流行的庫。

glad現在應該提供給你了乙個zip壓縮檔案,包含兩個頭檔案目錄,和乙個glad.c檔案。將兩個頭檔案目錄(gladkhr)複製到你的include資料夾中(或者增加乙個額外的專案指向這些目錄),並新增glad.c檔案到你的工程中。

在這裡特別提醒是包含2個檔案目錄,glad.h 裡include khr 目錄下的內容了。比如 #include

經過前面的這些步驟之後,你就應該可以將以下的指令加到你的檔案頂部了:

#include

需求設計入門

我正式參加的第乙個專案是移動渠道運營,由於公司人手不夠,老大將渠道資源的大模組交給我乙個人來負責,由於之前的詳細設計極為粗略,庫表設計也沒有,所以一切就得自己來搞定了。開發過程中與客戶進行過2次粗略的互動,可由於我是新手,對移動業務很是不熟悉,他們的需求我難以全部消化。兩個月後一期開發完畢,昨天在現...

RESTful API 設計入門

前後端對接其實主要是面向 api 文件開發,而 api 的設計中,有一種 restful api 的設計,具有規範,從某一種角度,我覺得 restful api 可以很好的把後端 api 從繁雜的業務中抽象出來,更好地進行管理和編寫,同時也具有良好的可讀性。對於一些現代化的 mvc 框架,在腳手架階...

Hbase roekey設計入門

rowkey類似於主鍵,可以唯一的標識一行記錄 由於資料按照rowkey的字典序 byte order 排序儲存,因此hbase中的資料永遠都是有序的。rowkey可以由使用者自己指定,只要保證這個字串不重複就可以了。不可以 會被覆蓋 hbase main 006 0 put csdn emp rk...