OpenGL開發(fā)環(huán)境搭建教程

最近在學(xué)習(xí)OpenGL豁延,搭建環(huán)境的時(shí)候發(fā)現(xiàn)網(wǎng)絡(luò)上面的教程都太籠統(tǒng)了昙篙,而且跟著上面搭建最后各種報(bào)錯(cuò),這里我會(huì)一步一步詳細(xì)的教大家如何搭建OpenGL的開發(fā)環(huán)境诱咏。注意如果我教程里提供的鏈接打不開苔可,請找一些小辦法

準(zhǔn)備

需要的軟件

  • VS 2017(隨便什么版本都行,我這里用的是2017)
  • CMake

開發(fā)系統(tǒng)

  • Windows

配置GLFW

在我們畫出出色的效果之前袋狞,首先要做的就是創(chuàng)建一個(gè)OpenGL上下文(Context)和一個(gè)用于顯示的窗口焚辅。然而,這些操作在每個(gè)系統(tǒng)上都是不一樣的硕并,OpenGL有目的地從這些操作抽象(Abstract)出去法焰。這意味著我們不得不自己處理創(chuàng)建窗口,定義OpenGL上下文以及處理用戶輸入倔毙。
幸運(yùn)的是埃仪,有一些庫已經(jīng)提供了我們所需的功能,其中一部分是特別針對OpenGL的陕赃。這些庫節(jié)省了我們書寫操作系統(tǒng)相關(guān)代碼的時(shí)間卵蛉,提供給我們一個(gè)窗口和上下文用來渲染。最流行的幾個(gè)庫有GLUT么库,SDL傻丝,SFML和GLFW。在教程里我們將使用GLFW诉儒。

第一步

我們?nèi)LFW的官網(wǎng)上下載源碼包

這里下載

我們把下載好的源碼包解壓

第二步

這里我們需要用到CMake這個(gè)軟件把源碼編譯葡缰,這個(gè)軟件直接去百度下載就OK了,下載安裝好了打開軟件忱反,在where is the source code選擇我們解壓好的源碼存放的文件夾泛释,where is the build the binaries里面隨便選擇一個(gè)文件夾存放編譯好的文件。然后點(diǎn)擊configure然后選擇你對應(yīng)你所使用的VS版本温算,然后再點(diǎn)擊Generate怜校,等待編譯完成就行了,那些飄紅的東西完全可以無視了注竿。

第三步

完成后我們可以在文件夾里看見編譯生成的文件茄茁,這時(shí)候我們要用我們的VS來打開里面的GLFW.sln魂贬,來打開這個(gè)項(xiàng)目,然后直接點(diǎn)擊Build Solution(生成解決方案)按鈕裙顽,然后編譯的庫glfw3.lib(注意我們用的是第3版)就會(huì)出現(xiàn)在src/Debug文件夾內(nèi)付燥。然后我們創(chuàng)建一個(gè)文件夾命名為OpenGL,再在里面創(chuàng)建一個(gè)名字叫l(wèi)ib的文件夾锦庸,把我們剛才生成的glfw32.lib文件放進(jìn)去机蔗,再去我們一開始解壓GLFW的文件夾,把里面的include文件夾也復(fù)制到OpenGL文件里甘萧。

創(chuàng)建工程

現(xiàn)在我們就可以在我們的VS里面新建項(xiàng)目了萝嘁,我們新建一個(gè)空白的vc++的項(xiàng)目,新建完畢后扬卷,我們右擊我們的項(xiàng)目選擇屬性:



然后在VC++目錄這個(gè)選項(xiàng)里牙言,在包含目錄里添加我們創(chuàng)建好的OpenGL/include文件夾的位置,在庫目錄里添加OpenGL/ilb文件夾的位置


image.png



然后我們再在鏈接器選項(xiàng)里選擇輸入后編輯附加依賴項(xiàng)



在里面輸入
opengl32.lib
glfw3.lib

然后點(diǎn)確認(rèn)怪得,一定要記得所有選項(xiàng)都要點(diǎn)確定咱枉,不然都白忙活了。

GLAD

到這里還沒有結(jié)束徒恋,我們?nèi)匀贿€有一件事要做蚕断。因?yàn)镺penGL只是一個(gè)標(biāo)準(zhǔn)/規(guī)范,具體的實(shí)現(xiàn)是由驅(qū)動(dòng)開發(fā)商針對特定顯卡實(shí)現(xiàn)的入挣。由于OpenGL驅(qū)動(dòng)版本眾多亿乳,它大多數(shù)函數(shù)的位置都無法在編譯時(shí)確定下來,需要在運(yùn)行時(shí)查詢径筏。所以任務(wù)就落在了開發(fā)者身上葛假,開發(fā)者需要在運(yùn)行時(shí)獲取函數(shù)地址并將其保存在一個(gè)函數(shù)指針中供以后使用。你可以看到代碼非常復(fù)雜滋恬,而且很繁瑣聊训,我們需要對每個(gè)可能使用的函數(shù)都要重復(fù)這個(gè)過程。幸運(yùn)的是恢氯,有些庫能簡化此過程带斑,其中GLAD是目前最新,也是最流行的庫勋拟。
首先我們要去[官網(wǎng)]下載遏暴,這里我們隨便選一個(gè)GL的版本然后點(diǎn)擊GENERATE,然后下載生成的壓縮包指黎,然后解壓。



解壓后把里面的include的文件夾同樣復(fù)制到我們前面建立的OpenGL文件夾里州丹,把src文件夾里的glad.c文件放到我們項(xiàng)目的源文件里


開始OpenGL

到這里我們的環(huán)境就搭建好了醋安,我們可以建個(gè)窗體來測試一下杂彭,首先我們先新建一個(gè)cpp文件
在里面寫入代碼

#include <glad/glad.h>
#include <GLFW/glfw3.h>

#include <iostream>

void framebuffer_size_callback(GLFWwindow* window, int width, int height);
void processInput(GLFWwindow *window);

// settings
const unsigned int SCR_WIDTH = 800;
const unsigned int SCR_HEIGHT = 600;

int main()
{
    // glfw: initialize and configure
    // ------------------------------
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

#ifdef __APPLE__
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // uncomment this statement to fix compilation on OS X
#endif

    // glfw window creation
    // --------------------
    GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "LearnOpenGL", NULL, NULL);
    if (window == NULL)
    {
        std::cout << "Failed to create GLFW window" << std::endl;
        glfwTerminate();
        return -1;
    }
    glfwMakeContextCurrent(window);
    glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);

    // glad: load all OpenGL function pointers
    // ---------------------------------------
    if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
    {
        std::cout << "Failed to initialize GLAD" << std::endl;
        return -1;
    }

    // render loop
    // -----------
    while (!glfwWindowShouldClose(window))
    {
        // input
        // -----
        processInput(window);

        // glfw: swap buffers and poll IO events (keys pressed/released, mouse moved etc.)
        // -------------------------------------------------------------------------------
        glfwSwapBuffers(window);
        glfwPollEvents();
    }

    // glfw: terminate, clearing all previously allocated GLFW resources.
    // ------------------------------------------------------------------
    glfwTerminate();
    return 0;
}

// process all input: query GLFW whether relevant keys are pressed/released this frame and react accordingly
// ---------------------------------------------------------------------------------------------------------
void processInput(GLFWwindow *window)
{
    if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
        glfwSetWindowShouldClose(window, true);
}

// glfw: whenever the window size changed (by OS or user resize) this callback function executes
// ---------------------------------------------------------------------------------------------
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
    // make sure the viewport matches the new window dimensions; note that width and 
    // height will be significantly larger than specified on retina displays.
    glViewport(0, 0, width, height);
}

然后點(diǎn)擊本地Windows調(diào)試器,就可以看到我們創(chuàng)建的窗體了吓揪,也就代表著我們OpenGL環(huán)境搭建大成功G椎 !柠辞!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末团秽,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子叭首,更是在濱河造成了極大的恐慌习勤,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件焙格,死亡現(xiàn)場離奇詭異图毕,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)眷唉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門予颤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人冬阳,你說我怎么就攤上這事蛤虐。” “怎么了肝陪?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵驳庭,是天一觀的道長。 經(jīng)常有香客問我见坑,道長嚷掠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任荞驴,我火速辦了婚禮不皆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘熊楼。我一直安慰自己霹娄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布鲫骗。 她就那樣靜靜地躺著犬耻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪执泰。 梳的紋絲不亂的頭發(fā)上枕磁,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機(jī)與錄音术吝,去河邊找鬼计济。 笑死茸苇,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的沦寂。 我是一名探鬼主播学密,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼传藏!你這毒婦竟也來了腻暮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤毯侦,失蹤者是張志新(化名)和其女友劉穎哭靖,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體叫惊,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡款青,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了霍狰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抡草。...
    茶點(diǎn)故事閱讀 38,617評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蔗坯,靈堂內(nèi)的尸體忽然破棺而出康震,到底是詐尸還是另有隱情,我是刑警寧澤宾濒,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布腿短,位于F島的核電站,受9級特大地震影響绘梦,放射性物質(zhì)發(fā)生泄漏橘忱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一卸奉、第九天 我趴在偏房一處隱蔽的房頂上張望钝诚。 院中可真熱鬧,春花似錦榄棵、人聲如沸凝颇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拧略。三九已至,卻和暖如春瘪弓,著一層夾襖步出監(jiān)牢的瞬間垫蛆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留月褥,地道東北人弛随。 一個(gè)月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像宁赤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子栓票,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容