1. 程式人生 > >OpenGL紅寶書8th第一個例子triangles

OpenGL紅寶書8th第一個例子triangles

年初用Qt涉及過OpenGL,當時只根據Qt自給的庫使用,按照Qt給的例子沒有出現啥問題,但是最近接觸計算機圖形學,嘗試編譯紅寶書8th(《OpenGL程式設計指南》(原書第8版)中文版)第一個例子,發現編譯不過去,開始以為是編譯環境沒有配置好,但是之後發現不是include和lib的問題,還有許多其他問題,所以在這就做點記錄。

從頭說起:

一.編譯環境配置.

到紅寶書的官網上下載8th的配置檔案(oglpg-8th-edition),如果要下載最新特性的還是到紅寶書官網下載。

由於要使用書上面的原碼到紅寶書官網下載example-master,裡面有一個src資料夾有部分原始碼,再使用VS新建空專案。


找到examples-master/src裡面的triangles.cpp,打開發現包含了

#include "vgl.h"
#include "LoadShaders.h"

還有 ShaderInfo shaders[] =
{
{ GL_VERTEX_SHADER, "media/shaders/triangles/triangles.vert" },
{ GL_FRAGMENT_SHADER, "media/shaders/triangles/triangles.frag" },
{ GL_NONE, NULL }
};

由於還有一個LoadShaders.cpp則需要找到vgl.h, LoadShaders.h/.cpp, triangles.vert, triangles.frag這五個檔案,在資料夾內搜尋即可.

最後將這幾個檔案放入到同一目錄。

如圖


然後在專案中新增這5個(2個頭檔案,3個原始檔)。

注意到vgl.h中,無法載入原始檔”GL/glew.h”,這是因為我們沒有設定附加包含檔案。於是再來新增include和lib。

選擇triangles解決方案>>右鍵>>屬性>>C/C++>>常規,修改附加包含目錄,如圖所示:


選擇triangles解決方案>>右鍵>>屬性>>連結器>>常規,修改附加包含目錄。


然後編譯執行這個專案,發現生成解決方案的時候有錯誤,但是提示說錯誤都是由預設庫“libcmtd.lib”與其他庫衝突造成的,因此我們必須要忽略這一個庫。


選擇triangles解決方案>>右鍵>>屬性>>連結器>>輸入,忽略特定預設庫,填入LIBCMT;LIBCMTD,這樣在debug或release編譯模式下都能把這個庫忽略掉。

然後編譯成功,但是開始執行(但不除錯),程式竟然崩潰。

然後斷點發現是遇到glGenVertexArrays呼叫時崩潰,網上給出的解決方法:呼叫glewInit前未進行如下設定:
glewExperimental = GL_TRUE.(參考地址)

這樣就執行成功了。

後來發現所設定的顏色是藍色但是顯示出來的卻是白色的。

並且除錯框提示"Incorrect GLSL vesion:430" ,表明版本號有問題,但是紅寶書8th確實提供的是OpenGL4.3的最新特性,所以庫肯定是支援的,那這樣只有可能我的硬體不支援了。

後來網上查閱到了許多先行者的腳印,發現紅寶書8th開篇對OpenGL的初步介紹確實略簡,以致於我們忽略了一些問題。

OpenGL與Windows作業系統的關係


OpenGL是一種應用程式程式設計介面(API),也是一種可以對圖形硬體裝置特性進行訪問的軟體庫。因而事實上,OpenGL其實與顯示卡的關係更密切一些,而對於支援OpenGL的顯示卡才能使用OpenGL庫。
由於OpenGL與顯示卡(硬體)有關,因而也與作業系統有關,所以Windows是自帶OpenGL的,因此Windows會包含OpenGL的標準庫,而在OpenGL官網是找不到下載的。
當我們安裝了編譯器(例如VS2012)後,編譯器會把OpenGL的相關標頭檔案和類庫複製入編譯器的相關資料夾中。
例如標頭檔案放在C:\Program Files (x86)\Windows Kits\8.0\Include\um\gl
庫檔案放在C:\Program Files (x86)\Windows Kits\8.0\Lib (這裡可能不同的WIN位置和VS版本不一致,筆者這裡是WIN7+VS2012)

Windows中OpenGL的版本過低怎麼辦?
這個不用擔心,用Windows自帶的OpenGL已經足夠了。OpenGL版本的限制其實是在於顯示卡支援的OpenGL版本而不是你本身的OpenGL庫的版本。

那怎麼檢視自己硬體所支援的OpenGL版本呢?這個OpenGLExtension Viewer可以為你幫助。


這裡我筆記本的核顯只能支援到OpenGL4.0,

所以我將.vert和.frag的Version版本改為了4.0,triangles.cpp中有一條語句glutInitContextVersion(4,3);指定OpengGL的版本為4.3,也修改為了4.0。

重新編譯後執行,最終顯示理想的的藍色結果。

在此感謝先行者的腳步。