前言
現在是OpenGL 4.5的時代,相對于 GLUT,GLEW 和 GLFW 顯得更加的友善強大,但是如何實作配置和配置後出現BUG都是讓人頭疼的事情。筆者經過兩天的不斷嘗試與查找資料,終于配置成功了。由于筆者也沒有完全了解,是以我不確定這種方法适合于所有情況,隻是希望給更多學習OpenGL的朋友提供一種方法。
開始工作
一.
首先:筆者建議你先檢視你的顯示卡是否支援OpenGL 4.5版本
方法:百度下載下傳GPU Caps Viewer
輕按兩下打開![]()
WIN7 + VS2015環境下關于GLEW和GLFW的配置
點選上方紅色圓圈中可看到OpenGL的支援資訊(黃色方框内容),如果你可支援的版本較低,筆者建議你更新驅動
二.
下載下傳GLEW和GLFW源碼,下載下傳位址分别為
http://glew.sourceforge.net/
http://www.glfw.org/
下載下傳CMake
https://cmake.org/
三.
cmake子目錄bin中有一個cmake-gui.exe,輕按兩下打開得到以下界面![]()
WIN7 + VS2015環境下關于GLEW和GLFW的配置 ![]()
WIN7 + VS2015環境下關于GLEW和GLFW的配置 第一步,點選“Browsw source…”選擇GLFW的根目錄
第二步,點選“Browse build…”任意選取一個建立的檔案夾作為輸出目錄
第三步,點選“Configure“,出現以下選擇
選擇Visual Studio 14 2015
第四步,出現以下界面時,點選“Generate”
稍等幾秒,便可關閉CMake
四.
打開剛剛指定的Build目錄(即你指定存放CMake輸出的目錄),用VS2015打開GLFW.sln檔案
進行編譯(需知:筆者在配置時這一步是不成功的,但是也得到了我想要的連結庫檔案)在你的\bulid\src\Debug中會有一個lib檔案。同時,你下載下傳的glfw檔案中有一個include檔案夾,其中有一個存放着頭檔案的GLFW檔案夾。至此配置GLFW的準備工作算是完成了
如果你實在不想動用CMake去做這麼麻煩的工作的話,你也可以直接在網上下載下傳glfw3.lib(此處滑稽:))
五.
進行glew的配置準備工作實際上是非常類似的,此處不再贅述,當然你還是可以直接在網上下載下傳glew32.lib。需要注意的是:還需要一個glew32.dll檔案,記得一同下載下傳。重要的事情說三遍,注意 x 3 !
然後把glew32.dll檔案拷貝到C:\Windows\SysWOW64目錄下。
筆者建議建立一個獨立檔案夾,裡面建立兩個檔案夾include(A)和lib(B)。把glfw中的include檔案夾裡面的GLFW 和 glew中的include檔案夾裡面的GL都拷貝到A中,然後把glfw3.lib 和 glew32.lib放在B中。至此是以準備工作完成了,開始配置了
六.
①打開VS2015,建立項目,選擇Win32控制台
②選擇空項目
③項目->屬性->VC++目錄。 包含目錄中添加上剛才準備的A(見第五步),庫目錄中添加上剛才準備的B(見第五步)
④項目->屬性->連結器->輸入。附加依賴項中添加上 glew32.lib ; glfw3.lib ; opengl32.lib 。由于是手寫的,是以注意拼寫。當然你直接複制上去也行。
⑤最後點選确定便配置完成了
七.最終測試.
建立一個cpp檔案,把以下代碼拷貝到檔案中。代碼來自Anton’s OpenGL 4 Tutorials
#include "stdafx.h"
#include <GL/glew.h>
//#define GLFW_DLL
#include <GLFW/glfw3.h>
int main(int argc, _TCHAR* argv[])
{
// start GL context and O/S window using the GLFW helper library
if (!glfwInit ()) {
fprintf (stderr, "ERROR: could not start GLFW3\n");
return ;
}
GLFWwindow* window = glfwCreateWindow (, , "Hello Triangle", NULL, NULL);
if (!window) {
fprintf (stderr, "ERROR: could not open window with GLFW3\n");
glfwTerminate();
return ;
}
glfwMakeContextCurrent (window);
// start GLEW extension handler
glewExperimental = GL_TRUE;
glewInit ();
// get version info
const GLubyte* renderer = glGetString (GL_RENDERER); // get renderer string
const GLubyte* version = glGetString (GL_VERSION); // version as a string
printf ("Renderer: %s\n", renderer);
printf ("OpenGL version supported %s\n", version);
// tell GL to only draw onto a pixel if the shape is closer to the viewer
glEnable (GL_DEPTH_TEST); // enable depth-testing
glDepthFunc (GL_LESS); // depth-testing interprets a smaller value as "closer"
float points[] = {
, , ,
, -, ,
-, -,
};
GLuint vbo = ;
glGenBuffers (, &vbo);
glBindBuffer (GL_ARRAY_BUFFER, vbo);
glBufferData (GL_ARRAY_BUFFER, * sizeof (float), points, GL_STATIC_DRAW);
GLuint vao = ;
glGenVertexArrays (, &vao);
glBindVertexArray (vao);
glEnableVertexAttribArray ();
glBindBuffer (GL_ARRAY_BUFFER, vbo);
glVertexAttribPointer (, , GL_FLOAT, GL_FALSE, , NULL);
const char* vertex_shader =
"#version 400\n"
"in vec3 vp;"
"void main () {"
" gl_Position = vec4 (vp, 1.0);"
"}";
const char* fragment_shader =
"#version 400\n"
"out vec4 frag_colour;"
"void main () {"
" frag_colour = vec4 (0.5, 0.0, 0.5, 1.0);"
"}";
GLuint vs = glCreateShader (GL_VERTEX_SHADER);
glShaderSource (vs, , &vertex_shader, NULL);
glCompileShader (vs);
GLuint fs = glCreateShader (GL_FRAGMENT_SHADER);
glShaderSource (fs, , &fragment_shader, NULL);
glCompileShader (fs);
GLuint shader_programme = glCreateProgram ();
glAttachShader (shader_programme, fs);
glAttachShader (shader_programme, vs);
glLinkProgram (shader_programme);
// Loop until the user closes the window
while (!glfwWindowShouldClose(window))
{
// wipe the drawing surface clear
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUseProgram (shader_programme);
glBindVertexArray (vao);
// draw points 0-3 from the currently bound VAO with current in-use shader
glDrawArrays (GL_TRIANGLES, , );
// update other events like input handling
glfwPollEvents ();
// put the stuff we've been drawing onto the display
glfwSwapBuffers (window);
}
// close GL context and any other GLFW resources
glfwTerminate();
return ;
}
編譯運作,成功的話,會實作以下視窗
第一行有可能報錯,筆者上網查詢後,把第一行代碼删掉是可以的。
至此,如果你跟着所有步驟來做,一切順利,沒有意外的情況,且代碼測試成功,那麼恭喜你,完美配置成功。
不過……
對嘛,生活很難一帆風順,吃個雞蛋都有可能吃到蛋殼碎,這個程式有可能報許多錯誤,筆者來分享下個人的慘痛經曆
第一種:一大堆錯誤如下
觀察錯誤提示,你會發現不少glew,glfw,gl的字眼或字首,這說明和我們的庫有關。解決方法如下,添加最上面的3行代碼
第二種:無法打開glew32.lib檔案
出現這個情況一定要確定三點:
①項目配置時,庫目錄添加的檔案夾中是否有glew32.lib
②項目配置時,附加依賴項是否有添加glew32.lib
③glew32.dll是否有拷貝到C:\Windows\SysWOW64目錄下
再者glew32.lib檔案是否損壞(這種情況一般都不會發生),如果確定了以上3點并重新開機過VS2015仍然報錯,可嘗試更換glew32.lib和glew32.dll檔案
總結
這篇教程是我在網上查了許多資料,看了許多前輩的部落格,再結合自身經曆所寫出來的,其中有許多知識筆者也是一知半解,也許存在着許多錯誤,不能保證每個人都可以成功配置,畢竟大家的計算機環境不盡相同。如果你在閱讀過程中發現了錯誤,希望你能給我指正,互相學習。如果你按這個教程成功配置,那麼說明我的努力是有一定價值的。最後希望各位想要學習OpenGL童鞋都能有一個好的開頭。
夢不可怕,可怕的是沒有夢