OpenGL Mac環(huán)境搭建
配置環(huán)境的資源:
- GLTools
- glew
- libGLTools.a
我已經(jīng)把需要的資源文件放在百度云取劫,有需要的自行下載叨咖。
鏈接: https://pan.baidu.com/s/1VJJPAcP0istnfQGH9jyOKA 密碼: g43b像啼。
開始配置OpenGL環(huán)境
1. 首先先創(chuàng)建工程,打開Xcode -> macOS -> App
2.本地導入依賴庫和資源
-
添加OpenGL.framework 和 GLUT.framework 兩個系統(tǒng)庫
-
添加GLTools.h和glew.h掂铐,將下載的include文件夾拖入工程罕拂,在Bulid Settings輸入Header Search path,把工程目錄的include文件夾直接拖入生成路徑全陨。
-
libGLTools.a直接拖到工程Frameworks 文件夾里面爆班,另外刪除AppDelegate.h 、AppDelegate.m 辱姨、main.m 柿菩、ViewController.h 、ViewController.m這幾個文件雨涛,創(chuàng)建main.cpp文件(也可以直接把main.m文件后綴改成.cpp枢舶,不用刪文件,然后在main文件里清空所有代碼)替久。
3. 在main.cpp中復制一下代碼
#include "GLShaderManager.h"
#include "GLTools.h"
#include <glut/glut.h>
GLBatch triangleBatch;
GLShaderManager shaderManager;
//窗口大小改變時接受新的寬度和高度凉泄,其中0,0代表窗口中視口的左下角坐標,w蚯根,h代表像素
void ChangeSize(int w,int h)
{
glViewport(0,0, w, h);
}
//為程序作一次性的設置
void SetupRC()
{
//設置背影顏色
glClearColor(0.0f,0.0f,1.0f,1.0f);
//初始化著色管理器
shaderManager.InitializeStockShaders();
//設置三角形后众,其中數(shù)組vVert包含所有3個頂點的x,y,笛卡爾坐標對。
GLfloat vVerts[] = {
-0.5f,0.0f,0.0f,
0.5f,0.0f,0.0f,
0.0f,0.5f,0.0f,
};
//批次處理
triangleBatch.Begin(GL_TRIANGLES,3);
triangleBatch.CopyVertexData3f(vVerts);
triangleBatch.End();
}
//開始渲染
void RenderScene(void)
{
//1.清除一個或者一組特定的緩存區(qū)
/*
緩沖區(qū)是一塊存在圖像信息的儲存空間颅拦,紅色蒂誉、綠色、藍色和alpha分量通常一起分量通常一起作為顏色緩存區(qū)或像素緩存區(qū)引用距帅。
OpenGL 中不止一種緩沖區(qū)(顏色緩存區(qū)右锨、深度緩存區(qū)和模板緩存區(qū))
清除緩存區(qū)對數(shù)值進行預置
參數(shù):指定將要清除的緩存的
GL_COLOR_BUFFER_BIT :指示當前激活的用來進行顏色寫入緩沖區(qū)
GL_DEPTH_BUFFER_BIT :指示深度緩存區(qū)
GL_STENCIL_BUFFER_BIT:指示模板緩沖區(qū)
*/
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
//2.設置一組浮點數(shù)來表示紅色
GLfloat vRed[] = {1.0,0.0,0.0,1.0f};
//傳遞到存儲著色器,即GLT_SHADER_IDENTITY著色器碌秸,這個著色器只是使用指定顏色以默認笛卡爾坐標第在屏幕上渲染幾何圖形
shaderManager.UseStockShader(GLT_SHADER_IDENTITY,vRed);
//提交著色器
triangleBatch.Draw();
//在開始的設置openGL 窗口的時候绍移,我們指定要一個雙緩沖區(qū)的渲染環(huán)境。這就意味著將在后臺緩沖區(qū)進行渲染讥电,渲染結(jié)束后交換給前臺登夫。這種方式可以防止觀察者看到可能伴隨著動畫幀與動畫幀之間的閃爍的渲染過程。緩沖區(qū)交換平臺將以平臺特定的方式進行允趟。
//將后臺緩沖區(qū)進行渲染,然后結(jié)束后交換給前臺
glutSwapBuffers();
}
int main(int argc,char *argv[])
{
//初始化GLUT庫,這個函數(shù)只是傳說命令參數(shù)并且初始化glut庫
glutInit(&argc, argv);
/*
初始化雙緩沖窗口鸦致,其中標志GLUT_DOUBLE潮剪、GLUT_RGBA涣楷、GLUT_DEPTH、GLUT_STENCIL分別指
雙緩沖窗口抗碰、RGBA顏色模式狮斗、深度測試、模板緩沖區(qū)
--GLUT_DOUBLE`:雙緩存窗口弧蝇,是指繪圖命令實際上是離屏緩存區(qū)執(zhí)行的碳褒,然后迅速轉(zhuǎn)換成窗口視圖,這種方式看疗,經(jīng)常用來生成動畫效果沙峻;
--GLUT_DEPTH`:標志將一個深度緩存區(qū)分配為顯示的一部分,因此我們能夠執(zhí)行深度測試两芳;
--GLUT_STENCIL`:確保我們也會有一個可用的模板緩存區(qū)摔寨。
深度、模板測試后面會細致講到
*/
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH|GLUT_STENCIL);
//GLUT窗口大小怖辆、窗口標題
glutInitWindowSize(800, 600);
glutCreateWindow("Triangle");
/*
GLUT 內(nèi)部運行一個本地消息循環(huán)是复,攔截適當?shù)南ⅰH缓笳{(diào)用我們不同時間注冊的回調(diào)函數(shù)竖螃。我們一共注冊2個回調(diào)函數(shù):
1)為窗口改變大小而設置的一個回調(diào)函數(shù)
2)包含OpenGL 渲染的回調(diào)函數(shù)
*/
//注冊重塑函數(shù)
glutReshapeFunc(changeSize);
//注冊顯示函數(shù)
glutDisplayFunc(RenderScene);
/*
初始化一個GLEW庫,確保OpenGL API對程序完全可用淑廊。
在試圖做任何渲染之前,要檢查確定驅(qū)動程序的初始化過程中沒有任何問題
*/
GLenum status = glewInit();
if (GLEW_OK != status) {
printf("GLEW Error:%s\n",glewGetErrorString(status));
return 1;
}
//設置我們的渲染環(huán)境
setupRC();
glutMainLoop();
return 0;
}
最后run起來就可以看到示范圖形,如果編譯報錯特咆,就把文件<>系統(tǒng)引入季惩,改為""普通引入
-
如果有很多黃色警告??很不爽,可以通過下面方法關(guān)閉警告坚弱。