最近一段時間都忙于公司項目的開發(fā),也沒有對于自己的工作學(xué)習(xí)進行總結(jié),感覺個人發(fā)展陷入了一個泥沼期?,F(xiàn)在公司的項目也進入了一個收尾階段,之后一段時間會進行OpenGL的學(xué)習(xí),也會通過簡書進行學(xué)習(xí)記錄。文章不足之處,歡迎指正。(一段廢話,建議忽略 )
OpenGL的描述跟概念這里不做贅述,相信大家都了解,下面開始:
在開始進行OpenGL環(huán)境搭建之前,要先了解下這門語言的特點:
OpenGL是一個跨語言和跨平臺的圖形編程接口,與GPU進行交互,不同的顯卡廠商負(fù)責(zé)具體實現(xiàn)(特指安卓,蘋果是統(tǒng)一的顯卡廠商),因此實現(xiàn)的具體程序也不盡相同。不同的廠商實現(xiàn)的庫可能有所不同,有的函數(shù)可能沒有實現(xiàn),有的包含拓展的實現(xiàn),而且廠商的實現(xiàn)一般通過動態(tài)鏈接庫來提供。
這些細(xì)節(jié)比較繁瑣,所以我們在開發(fā)之前需要先搭建OpenGL環(huán)境(---種菜總得先犁個地吧---),導(dǎo)入第三方庫文件,來幫我們處理這些操作。
本文會在搭建成功環(huán)境之后實現(xiàn)一個三角形的繪制,附上成功的截圖:

一.前期資源準(zhǔn)備
GLFW
CLTools
libGLTools.a
方法一:從github上下載 glew、GLtools 兩個所需的庫文件。
1.安裝homebrew
打開終端,輸入命令行:
/usr/bin/ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)”
2.安裝cmake
執(zhí)行命令 :
brew install cmake
3.安裝glew
執(zhí)行命令:
brew install glew
安裝成功后可以去 /usl/local/Cellar/glew目錄下找到glew文件,把include頭文件和libGLEW.a準(zhǔn)備好放入項目中。
4.下載GLtools庫。
也可在終端,cd 到目的文件夾,使用git指令來進行下載。
git clone https://github.com/HazimGazov/GLTools.git
方法二:在本文的示例demo中有所需的glew、GLtools 庫文件了,可以直接從demo項目文件中拉取過去。
demo下載地址
二.開始配置openGL環(huán)境
1.打開XCode->macOS -> Cocoa App,創(chuàng)建一個mac項目

2.選中項目文件 Build Phases -> Link Binary With Libraries,添加OpenGL.framework、GLUT.framework兩個系統(tǒng)庫

3.添加CLTools.h、glew.h(在成功demo中都放置在include文件夾中,直接導(dǎo)入include文件夾即可)、libGLTools.a文件。同時在 Bulid Settings 搜索 Header Search path 直接拖入include文件夾生成路徑。


4.刪除系統(tǒng)生成的OC文件,AppDelegate.h、AppDelegate.m、main.m、ViewController.h、ViewController.m,創(chuàng)建main.cpp文件,同時把libGLTools.a文件拖入Framework文件夾中,便于管理。



至此,OpenGL環(huán)境已經(jīng)配置完成,下面開始在main.cpp文件里面寫代碼:
#include <stdio.h>
#include "GLShaderManager.h"
#include "GLTools.h"
#include <glut/glut.h>
GLBatch triangleBatch;
GLShaderManager shaderManager;
//窗口大小改變時接受新的寬度和高度,其中0,0代表窗口中視口的左下角坐標(biāo),w,h代表像素
void ChangeSize(int w,int h)
{
glViewport(0,0, w, h);
}
//為程序作一次性的設(shè)置
void SetupRC()
{
//設(shè)置背影顏色
glClearColor(0.0f,0.0f,1.0f,1.0f);
//初始化著色管理器
shaderManager.InitializeStockShaders();
//設(shè)置三角形,其中數(shù)組vVert包含所有3個頂點的x,y,笛卡爾坐標(biāo)對。
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)
{
//清除一個或一組特定的緩沖區(qū)
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
//設(shè)置一組浮點數(shù)來表示紅色
GLfloat vRed[] = {1.0f,0.0f,0.0f,1.0f};
//傳遞到存儲著色器,即GLT_SHADER_IDENTITY著色器,這個著色器只是使用指定顏色以默認(rèn)笛卡爾坐標(biāo)第在屏幕上渲染幾何圖形
shaderManager.UseStockShader(GLT_SHADER_IDENTITY,vRed);
//提交著色器
triangleBatch.Draw();
//將在后臺緩沖區(qū)進行渲染,然后在結(jié)束時交換到前臺
glutSwapBuffers();
}
int main(int argc,char* argv[])
{
//設(shè)置當(dāng)前工作目錄,針對MAC OS X
gltSetWorkingDirectory(argv[0]);
//初始化GLUT庫
glutInit(&argc, argv);
/*初始化雙緩沖窗口,其中標(biāo)志GLUT_DOUBLE、GLUT_RGBA、GLUT_DEPTH、GLUT_STENCIL分別指
雙緩沖窗口、RGBA顏色模式、深度測試、模板緩沖區(qū)*/
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH|GLUT_STENCIL);
//GLUT窗口大小,標(biāo)題窗口
glutInitWindowSize(800,600);
glutCreateWindow("Triangle");
//注冊回調(diào)函數(shù)
glutReshapeFunc(ChangeSize);
glutDisplayFunc(RenderScene);
//驅(qū)動程序的初始化中沒有出現(xiàn)任何問題。
GLenum err = glewInit();
if(GLEW_OK != err) {
fprintf(stderr,"glew error:%s\n",glewGetErrorString(err));
return 1;
}
//調(diào)用SetupRC
SetupRC();
glutMainLoop();
return 0;
}
運行代碼,完美運行。
三.運行錯誤的解決

如果出現(xiàn)了以上的錯誤,是因為.a文件的存放位置問題。include文件夾跟.a文件必須存放在同一個目錄層級下。

既然看到這里了,點了喜歡再走唄?。?!-