參考教程:https://learnopengl-cn.github.io/
這個教程已經給出了很詳細的資料,當然我這里是對細節的展示(在Windows上)。
首先,你需要准備
VS2017 : http://www.baidu.com [當然你也可以用別的,但我使用的是它!]
GLFW(源文件):https://www.glfw.org/download.html
CMake :https://cmake.org/download/
GLAD : 然后你還要去https://glad.dav1d.de/生成一個zip壓縮文件,你將它下載下來即可。
資料:
打開GLAD的在線服務,將語言(Language)設置為C/C++,
在API選項中,選擇3.3以上的OpenGL(gl)版本(我們的教程中將使用3.3版本,但更新的版本也能正常工作)。
之后將模式(Profile)設置為Core,並且保證生成加載器(Generate a loader)的選項是選中的。
現在可以先(暫時)忽略拓展(Extensions)中的內容。都選擇完之后,點擊生成(Generate)按鈕來生成庫文件。 GLAD現在應該提供給你了一個zip壓縮文件,包含兩個頭文件目錄,和一個glad.c文件。
1.構建GLFW
打開CMake,這里使用GUI的啟動程序。
點擊Browse Source... 選中GLFW解壓出來的文件夾
點擊Browse Build... 選中GLFW下的Build文件夾(沒有就自己去新建一個,或者不叫這名字也沒關系,這不重要)
點擊 Configure 按鈕,選中合適你的IDE環境,然后就按默認的選項就好,按Finish就好了。
【這里下面還有一個Optional platform for generator. | 我不知道是什么鬼,但是我選擇了64| 當然你可以使用默認的32】
再點擊 Generate 按鈕就會生成文件了,最后輸出的工程是在Build的文件夾里。
打開Build文件夾,再打開GLFW工程文件,生成編譯它即可。
打開輸出目錄,就是箭頭所指的這個東西。
接下來,我們要先新建一個C++項目,並在該項目的文件夾下新建兩個文件夾,一個include,一個libs.
把GLFW和GLAD的include下的文件夾復制到我們新建的include
把我們剛才的生成的glfw3.lib搬到libs文件夾。
把GLAD的include/src下的*.c文件復制到工程文件夾,添加到工程里。
【由於某些不可抗力的因素,我的VS居然沒有OpenGL32 !!!】
【所以我需要把從別人復制一份過來引用 這里用的是64位的。】 ps: 感謝冰棍分享給我OpenGL32.lib。
接下來配置兩個地方。
【請注意,如果你也和我一樣編譯了64位的glfw,那請注意 -- 在[本地Windows 調試器]的左邊有兩個下拉選擇,默認是x32,你要把它調整位x64,否則無法通過編譯。】
打開工程,在右邊(默認是這樣)的解決方案資源管理器,右鍵工程,選擇屬性。
找到圖里面的選項,然后輸入這兩項 glfw3.lib;opengl32.lib
這兩個要點擊右上角那個帶星星的文件夾按鈕,然后它會讓你選擇目錄。
包含目錄就選我們創建的include文件夾。
庫目錄就選我們創建的libs文件夾。
接下來我們輸入下面的代碼:
#include <glad/glad.h> #include <GLFW/glfw3.h> const unsigned int SCR_WIDTH = 800; const unsigned int SCR_HEIGHT = 600; int main() { glfwInit(); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "HelloWorld", NULL, NULL); //創建窗口 return 0; }
如果能夠通過,說明你的配置是正確的。
(會一閃而過,你也可以斷點,這時候你可以清楚的看到一個命令行窗口和另外一個我們新建的窗口)果沒有通過,請返回去檢查自己的屬性配置和百度自行解決。
接下來,輸入我打了一整天的代碼! (很煩,好久沒用VS了,上面這些步驟我用了半天的時間才弄完)
1 #include <glad/glad.h> 2 #include <GLFW/glfw3.h> 3 #include <iostream> 4 #include<windows.h> 5 int WINAPI MessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType); 6 7 void framebuffer_size_callback(GLFWwindow* window, int width, int height);//對窗口注冊一個回調函數(Callback Function),它會在每次窗口大小被調整的時候被調用 8 void processInput(GLFWwindow *window);//這個函數將會返回這個按鍵是否正在被按下。我們將創建一個processInput函數來讓所有的輸入代碼保持整潔。 9 const unsigned int SCR_WIDTH = 800; 10 const unsigned int SCR_HEIGHT = 600; 11 12 void processInput(GLFWwindow *window) 13 //通過glfwSetwindowShouldClose使用把WindowShouldClose屬性設置為true的方法關閉GLFW。 14 { 15 if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) { 16 if (MessageBox(NULL, L"你真的要拋棄我嗎 我可是你第一個孩子。", L"詢問:", MB_YESNO) == IDYES) { 17 glfwSetWindowShouldClose(window, true); 18 } 19 } 20 } 21 void framebuffer_size_callback(GLFWwindow* window, int width, int height) { 22 /*這個幀緩沖大小函數需要一個GLFWwindow作為它的第一個參數,以及兩個整數表示窗口的新維度。 23 每當窗口改變大小,GLFW會調用這個函數並填充相應的參數供你處理。*/ 24 glViewport(0, 0, width, height); 25 //嘗試在命令行窗口輸出寬度與高度 26 std::cout << "當前的窗口大小:" << "寬度: " << width << " 高度: " << height << std::endl; 27 } 28 int main(){ 29 glfwInit(); //初始化GLFW 30 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);//主版本號 31 glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 4);//次版本號 32 glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//使用核心模式 33 34 #ifdef __APPLE__ 35 glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // 如果是MAC,需要這一行 36 #endif 37 38 GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "HelloWorld", NULL, NULL); //創建窗口 39 40 if (window == NULL) {//如果失敗了的話 41 std::cout << "真是太失敗了,你沒能創建窗口成功。" << std::endl; //命令行提示創建失敗 42 glfwTerminate(); //滾蛋吧。 43 return -1; 44 } 45 glfwMakeContextCurrent(window);//綁定了Window 46 glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);//我們還需要注冊這個函數,告訴GLFW我們希望每當窗口調整大小的時候調用這個函數: 47 48 if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) { 49 std::cout << "真是太失敗了,GLAD沒能初始化成功。" << std::endl; 50 return -1; 51 } 52 53 while (!glfwWindowShouldClose(window)) { 54 //輸入控制 55 processInput(window); 56 57 //經過30秒的思考,我終於看懂了這是個什么鬼:這不就是rgba嘛! 58 //你看哦,最后一個值是1! 59 //說明a在后面 60 //如果在前面那就是argb(GDI+_32)那種了。 61 glClearColor(0.2f, 0.3f, 0.3f, 1.0f); 62 //渲染這個顏色 63 glClear(GL_COLOR_BUFFER_BIT); 64 65 glfwPollEvents(); 66 glfwSwapBuffers(window); 67 } 68 glfwTerminate(); //跳出循環后就結束進程 . 69 return 0; 70 }
最終運行圖:
補上一個內容:
查看你的顯卡對OpenGL的支持
軟件的名稱 OpenGL Extensions Viewer.
下載鏈接么,自己去百度吧。