OpenGL 在Mac上環(huán)境搭建

1.準(zhǔn)備資源

2.創(chuàng)建工程(開發(fā)工具:Xcode)

B5141296-3FC2-4C3D-BAA4-C9CB45B5725C.png

3.把資源包整合到項目中

  • 這里要是手動把資源包拖進項目中需要添加以下二個庫:


    2B383278-EE5F-44D1-A7E0-8FC44FDBCF4A.png
  • 把資源包中的相關(guān)資源拖入相對應(yīng)的地方


    477D92EE-E9A0-4FE0-AF73-6F8C59DC8213.png
55922A6C-9CAC-48B7-A527-66C23F29FCE7.png
  • 創(chuàng)建程序類


    E564434B-9C24-4D14-A05D-1B1DA38A99BA.png
    307A802E-190F-4AF7-A923-7B9C1D3BE064.png

4.在main.cpp加入以下代碼

#include "GLShaderManager.h"
/*
 `#include<GLShaderManager.h>` 移入了GLTool 著色器管理器(shader Mananger)類。沒有著色器,我們就不能在OpenGL(核心框架)進行著色。著色器管理器不僅允許我們創(chuàng)建并管理著色器,還提供一組“存儲著色器”,他們能夠進行一些初步?基本的渲染操作。
 */

#include "GLTools.h"
/*
 `#include<GLTools.h>`  GLTool.h頭文件包含了大部分GLTool中類似C語言的獨立函數(shù)
*/

 
#include <GLUT/GLUT.h>
/*
 在Mac 系統(tǒng)下,`#include<glut/glut.h>`
 在Windows 和 Linux上,我們使用freeglut的靜態(tài)庫版本并且需要添加一個宏
*/

//定義一個,著色管理器
GLShaderManager shaderManager;

//簡單的批次容器,是GLTools的一個簡單的容器類。
GLBatch triangleBatch;

/*
 在窗口大小改變時,接收新的寬度&高度。
 */
void changeSize(int w,int h)
{
    /*
      x,y 參數(shù)代表窗口中視圖的左下角坐標(biāo),而寬度、高度是像素為表示,通常x,y 都是為0
     */
    glViewport(0, 0, w, h);
    
}

void RenderScene(void)
{

    //1.清除一個或者一組特定的緩存區(qū)
    /*
     緩沖區(qū)是一塊存在圖像信息的儲存空間,紅色、綠色、藍(lán)色和alpha分量通常一起分量通常一起作為顏色緩存區(qū)或像素緩存區(qū)引用。
     OpenGL 中不止一種緩沖區(qū)(顏色緩存區(qū)、深度緩存區(qū)和模板緩存區(qū))
      清除緩存區(qū)對數(shù)值進行預(yù)置
     參數(shù):指定將要清除的緩存的
     GL_COLOR_BUFFER_BIT :指示當(dāng)前激活的用來進行顏色寫入緩沖區(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è)置一組浮點數(shù)來表示紅色
    GLfloat vRed[] = {1.0,0.5,0.0,0.5f};
    
    //傳遞到存儲著色器,即GLT_SHADER_IDENTITY著色器,這個著色器只是使用指定顏色以默認(rèn)笛卡爾坐標(biāo)第在屏幕上渲染幾何圖形
    shaderManager.UseStockShader(GLT_SHADER_IDENTITY,vRed);
    
    //提交著色器
    triangleBatch.Draw();
    
    //在開始的設(shè)置openGL 窗口的時候,我們指定要一個雙緩沖區(qū)的渲染環(huán)境。這就意味著將在后臺緩沖區(qū)進行渲染,渲染結(jié)束后交換給前臺。這種方式可以防止觀察者看到可能伴隨著動畫幀與動畫幀之間的閃爍的渲染過程。緩沖區(qū)交換平臺將以平臺特定的方式進行。
    //將后臺緩沖區(qū)進行渲染,然后結(jié)束后交換給前臺
    glutSwapBuffers();
    
}

void setupRC()
{
    //設(shè)置清屏顏色(背景顏色)
    glClearColor(0.98f, 0.60f, 0.7f, 1);
    
    
    //沒有著色器,在OpenGL 核心框架中是無法進行任何渲染的。初始化一個渲染管理器。
    //在前面的課程,我們會采用固管線渲染,后面會學(xué)著用OpenGL著色語言來寫著色器
    shaderManager.InitializeStockShaders();
    
    
    //指定頂點
    //在OpenGL中,三角形是一種基本的3D圖元繪圖原素。
    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();
    
}

int main(int argc,char *argv[])
{

    //初始化GLUT庫,這個函數(shù)只是傳說命令參數(shù)并且初始化glut庫
    glutInit(&argc, argv);
    
    /*
     初始化雙緩沖窗口,其中標(biāo)志GLUT_DOUBLE、GLUT_RGBA、GLUT_DEPTH、GLUT_STENCIL分別指
     雙緩沖窗口、RGBA顏色模式、深度測試、模板緩沖區(qū)
     
     --GLUT_DOUBLE`:雙緩存窗口,是指繪圖命令實際上是離屏緩存區(qū)執(zhí)行的,然后迅速轉(zhuǎn)換成窗口視圖,這種方式,經(jīng)常用來生成動畫效果;
     --GLUT_DEPTH`:標(biāo)志將一個深度緩存區(qū)分配為顯示的一部分,因此我們能夠執(zhí)行深度測試;
     --GLUT_STENCIL`:確保我們也會有一個可用的模板緩存區(qū)。
     深度、模板測試后面會細(xì)致講到
     */
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH|GLUT_STENCIL);
    
    //GLUT窗口大小、窗口標(biāo)題
    glutInitWindowSize(800, 600);
    glutCreateWindow("Triangle");
    
    /*
     GLUT 內(nèi)部運行一個本地消息循環(huán),攔截適當(dāng)?shù)南?。然后調(diào)用我們不同時間注冊的回調(diào)函數(shù)。我們一共注冊2個回調(diào)函數(shù):
     1)為窗口改變大小而設(shè)置的一個回調(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;
        
    }
    
    //設(shè)置我們的渲染環(huán)境
    setupRC();
    glutMainLoop();
 
    return  0;
    
}

demo:代碼傳送門

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容