宣告:抱歉大家,由於個人原因,本來打算月更的進度根本沒時間搞。這一次分享的內容很簡單,是在xcode中配置Open GL傻瓜式教程。先來個成功案例的展示圖:
那麼我們一步一步來搞:
準備資源
- xcode
- GLTools
- libGLTools.a
資源下載地址:下載地址
一、選擇macOS->Cocoa App(低版本xcode為Cocoa Application),然後點選Next,取名為OpenGLTest。
二、新增我們需要的系統庫,OpenGL.framework和GLUT.framework,如圖:
三、然後解壓資源包裡的資源,裡面會有一個include資料夾和一個libGLTools.a檔案。將include和libGLTools.a拖進工程,放到OpenGLTest目錄下,如圖所示:
完成後的目錄如下:
四、刪除AppDelegate.h,AppDelegate.m,ViewController.h,ViewController.m,main.m等檔案,選擇Move To Trash,如圖:
五、新建main.cpp檔案:
注意:將Also create a header file取消掉,它預設是勾選的。 然後com+b 一下,發現報了兩個錯: 這個時候不要慌,是因為我們沒有配置header search path,並且我們的main.cpp中也沒有main函式,然後我們配置一下,如圖: 然後我們在main.cpp中引入GLTools.h和glut.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();
//設定三角形,其中陣列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) {
//清除一個或一組特定的緩衝區
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
//設定一組浮點數來表示紅色
GLfloat vRed[] = {1.0f,0.0f,0.0f,1.0f};
//傳遞到儲存著色器,即GLT_SHADER_IDENTITY著色器,這個著色器只是使用指定顏色以預設笛卡爾座標第在螢幕上渲染幾何圖形
shaderManager.UseStockShader(GLT_SHADER_IDENTITY,vRed);
//提交著色器
triangleBatch.Draw();
//將在後臺緩衝區進行渲染,然後在結束時交換到前臺
glutSwapBuffers();
}
int main(int argc,char* argv[]) {
//設定當前工作目錄,針對MAC OS X
gltSetWorkingDirectory(argv[0]);
//初始化GLUT庫
glutInit(&argc, argv);
/*初始化雙緩衝視窗,其中標誌GLUT_DOUBLE、GLUT_RGBA、GLUT_DEPTH、GLUT_STENCIL分別指
雙緩衝視窗、RGBA顏色模式、深度測試、模板緩衝區*/
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH|GLUT_STENCIL);
//GLUT視窗大小,標題視窗
glutInitWindowSize(800,600);
glutCreateWindow("Triangle");
//註冊回撥函式(這兩個函式有一個不註冊,視窗就彈不起來,因為在啟動的一瞬間也是需要呼叫的,以後視窗或介面呼叫也會更改)
glutReshapeFunc(ChangeSize);
glutDisplayFunc(RenderScene);
//驅動程式的初始化中沒有出現任何問題。
GLenum err = glewInit();
if(GLEW_OK != err) {
fprintf(stderr,"glew error:%s\n",glewGetErrorString(err));
return 1;
}
//呼叫SetupRC
SetupRC();
glutMainLoop();
return 0;
}
複製程式碼
最後補充一下,如果大家按照步驟還是出現瞭如下情況: