轉(zhuǎn)自:搭建Mac OpenGL開發(fā)環(huán)境 - 簡書??http://www.reibang.com/p/891d630e30af
(涉及到GLTools請參考:http://www.reibang.com/p/00642d9e83c5)
這是OpenGL基礎(chǔ)說明,我將每天學(xué)習(xí)的內(nèi)容碾局,遇到的問題分享給大家政供,如果想要看文檔請看這里 :https://learnopengl-cn.github.io
下邊就開始搭建環(huán)境均牢。
1.安裝brew
在終端輸入:(我是之前安裝過brew 這里只是大概的說明安裝流程崭倘,沒有安過的可以百度一下很多的)
$ gcc --versionruby -e"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"$ brew doctor$brew update
2桌吃、安裝GLEW和GLFW庫
$ brew install glew
$ brew install glfw3
3.下載GLAD庫
① 打開GLAD的在線服務(wù):http://glad.dav1d.de如圖設(shè)置 OpenGL使用的是3.3 版本 至于為什么使用3.3 請看https://learnopengl-cn.github.io這里鞋既。
5.png
點(diǎn)擊生成并下載 glad.zip 并解壓
包含兩個(gè)頭文件目錄鼓拧,和一個(gè)glad.c文件囊卜。將兩個(gè)頭文件目錄(glad和KHR)復(fù)制到Include文件夾中(路徑"/usr/local/include")(可以使用cmd + shift + g )娜扇。
4、新建一個(gè)工程
輸入Product Name边败,Organization Identifier也必須輸入(所填內(nèi)容為本人百度)
刪除相關(guān)文件如圖所示
image.png
5袱衷、設(shè)置
build setting 找到 header search paths(直接在搜索框中搜索Header Search Paths即可,然后雙擊后面空白處添加)
->添加“/usr/local/include”路徑到Header Search Paths
->添加“$(inherited)”
“/usr/local/Cellar/glfw/3.2.1/lib”
“/usr/local/Cellar/glew/2.2.0/lib”路徑到Header Search Paths
Build Phases 找到 Link Binary With Libraries? 增加如下內(nèi)容(最好還要加一下GLUT.framework)
將我們下載的glad.zip 解壓的glad.c 文件拖進(jìn)項(xiàng)目(后續(xù)選項(xiàng)默認(rèn)即可)
新建一個(gè)c++? main.cpp 程序 如圖(跳出的選項(xiàng)默認(rèn)即可):
#include<stdio.h>
//glad 一定要在 glfw 上邊
#include
#include
intmain(){
? ? return0;
}
cmd +B 編譯一下success 表示環(huán)境搭建完成笑窜。
測試一下: 注意全copy致燥!
#include<stdio.h>
#include
#include
#include
intmain(intargc,char**argv){
? ? usingstd::cout;? ? usingstd::endl;
? ? glfwInit();
? ? //? ? 主版本
? ? glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR,3);
? ? //? ? 次版本
? ? glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR,3);
? ? //? ? 告訴glfw 我們使用的是core_profile 核心模塊
? ? glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
? ? //? ? 向前兼容
? ? glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
? ? //? ? 創(chuàng)建一個(gè)GLFW 窗口? 寬 高? 窗口名字? 后邊兩個(gè)暫時(shí)不用管
? ? GLFWwindow* window = glfwCreateWindow(800,600,"LearnOpenGL",NULL,NULL);
? ? if(window ==NULL)
? ? {
? ? ? ? std::cout <<"Failed to create GLFW window"<< std::endl;
? ? ? ? glfwTerminate();
? ? ? ? return-1;
? ? }
? ? //? ? 通知GLFW將我們窗口的上下文設(shè)置為當(dāng)前線程的主上下文了
? ? glfwMakeContextCurrent(window);
? ? //? ? GLAD 是用來管理openGL 的函數(shù)指針的。所以在調(diào)用任何openGL函數(shù)之前我們都需要初始化GLAD排截。
? ? //? ? 我們給GLAD傳入了用來加載系統(tǒng)相關(guān)的OpenGL函數(shù)指針地址的函數(shù)嫌蚤。GLFW給我們的是glfwGetProcAddress,它根據(jù)我們編譯的系統(tǒng)定義了正確的函數(shù)断傲。
? ? if(!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
? ? {
? ? ? ? std::cout <<"Failed to initialize GLAD"<< std::endl;
? ? ? ? return-1;
? ? }
? ? //? ? 創(chuàng)建渲染的視口: 我們必須要告訴OpenGl 需要渲染的尺寸大小脱吱,即為視口 viewport(),這樣openGL 才能知道根據(jù)窗口大小顯示數(shù)據(jù)和坐標(biāo)。
? ? //? ? glViewport 前兩個(gè)參數(shù)控制視口左下角位置认罩,后兩個(gè)參數(shù)控制視口的寬和高
? ? //? ? openGL 幕后使用的是glViewport 定義的 位置和寬高進(jìn)行2D轉(zhuǎn)換
? ? glViewport(0,0,800,600);
? ? //? ? 窗口調(diào)整的時(shí)候 視口應(yīng)該也被調(diào)整? 對窗口注冊一個(gè)回調(diào)函數(shù)每次窗口大小被調(diào)整的時(shí)候會(huì)被調(diào)用
? ? voidframebuffer_size_callback(GLFWwindow *window,intwidth,intheight);
? ? //? 通過 glfwSetFramebufferSizeCallback glfw 函數(shù) 當(dāng)窗口frame 變化時(shí)會(huì)調(diào)用箱蝠。
? ? //? ? 對于視網(wǎng)膜屏 Retain 屏? 寬度和高度明顯比原輸入值更高一點(diǎn)。
? ? glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
? ? voidprocessInput(GLFWwindow *window);
? ? //? 為了防止 渲染的圖像一出現(xiàn)就退出 我們使用while 循環(huán) 垦垂。我們可以稱之為Render Loop
? ? //? ? glfwWindowShouldClose 每次循環(huán)開始前檢查一次GLFW 是否被要求退出 是true 的話渲染便結(jié)束了宦搬。
? ? while(!glfwWindowShouldClose(window))
? ? {
? ? ? ? //輸出控制
? ? ? ? processInput(window);
? ? ? ? //? ? ? ? glfwSwapBuffers 會(huì)交換顏色緩沖(他是存儲(chǔ)著GLFW 窗口每一個(gè)像素色值的大緩沖),將會(huì)作為輸出顯示在屏幕上
? ? ? ? //? ? ? ? 當(dāng)程序退出的時(shí)候 使用一個(gè)自定義的顏色清空屏幕? 在每個(gè)新的渲染迭代可是的時(shí)候我們總希望清屏否則總是看到上次渲染的結(jié)果劫拗。
? ? ? ? //? ? ? ? 我們可以使用glClear? GL_COLOR_BUFFER_BIT间校,GL_DEPTH_BUFFER_BIT和GL_STENCIL_BUFFER_BIT。 我們清空顏色 页慷。
? ? ? ? glClearColor(0.5f,0.1f,0.0f,1.0f);
? ? ? ? glClear(GL_COLOR_BUFFER_BIT);
? ? ? ? glfwSwapBuffers(window);
? ? ? ? //? ? ? ? glfwPollEvents 檢查函數(shù)有沒有觸發(fā)什么事件 鍵盤輸入 鼠標(biāo)移動(dòng) 并調(diào)用對應(yīng)函數(shù)
? ? ? ? glfwPollEvents();
? ? }
? ? glfwTerminate();
? ? return0;
}
voidframebuffer_size_callback(GLFWwindow* window,intwidth,intheight)
{
? ? glViewport(0,0, width, height);
}
voidprocessInput(GLFWwindow *window)
{
? ? //
? ? if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
? ? ? ? glfwSetWindowShouldClose(window,true);
}
出現(xiàn)下邊界面就表示我們的環(huán)境搭建完成
PS:
在學(xué)習(xí)《OpenGL超級寶典》時(shí)憔足, 其中的例子用到了GLTools庫胁附,需要自行安裝。MAC下GLTools的安裝方法如下:
1. git clone https://github.com/HazimGazov/GLTools
2. cd GLTools/build
3. cmake ..
4. make
5. sudo make install