OpenGL簡單介紹及實踐

weixin_34249678發表於2018-02-03

OpenGL簡單介紹及實踐

什麼是OpenGL (Open Graphics Library)

OpenGL 是一種應用程式程式設計介面(Application Programming Interface,API),
用於渲染2D、3D向量圖形。    

相關程式庫

OpenGL被設計為只有輸出的,所以它只提供渲染功能。核心API沒有視窗系統、音訊、列印、鍵盤/滑鼠或其他輸入裝置的概念。

幾個庫建立在OpenGL之上,提供了OpenGL本身沒有的功能:

  • GLU
  • GLUT (能夠以可移植的方式提供基本的視窗功能)
  • GLUI
  • GLEW (GLEW可以簡化獲取函式地址的過程,並且包含了可以跨平臺使用的其他一些OpenGL程式設計方法)
  • GLEE
  • FREEGLUT (GLUT已經於1998年不再更新了。於是就有了freeglut)
  • OpenGL Performer (可以建立實時視覺化模擬程式)
  • ......

當開發者需要使用最新的OpenGL擴充套件時,他們往往需要使用GLEW庫或者是GLEE庫提供的功能,可以在程式的執行期判斷當前硬體是否支援相關的擴充套件,防止程式崩潰甚至造成硬體損壞。這類庫利用動態載入技術(dlsym、GetProcAddress等函式)搜尋各種擴充套件的資訊。

實踐

  • GLUT 庫使用
int main(int argc,char *argv[]) {
    //1. 初始化一個GLUT庫
    glutInit(&argc, (char **)argv);
        
    //2. 建立一個視窗並定製視窗名
    glutCreateWindow("OpenGL_Demo");
        
    //3. 註冊一個繪圖函式,作業系統在必要的時刻就會對窗體進行重繪製操作
    //它設定了一個現實回撥(display callback),即GLUT沒在每次更新視窗內容時會自動呼叫改例程
    glutDisplayFunc(RenderScene);
        
        
    //這是一個無限執行的迴圈,它會負責一直處理視窗和作業系統的使用者輸入等操作。(
    //注意:不會執    行在glutMainLoop()之後的所有命令。)
    glutMainLoop();
        
        }
  • GLEW 庫使用

可在程式執行操作前進行使用,確保驅動程式的初始化過程中沒有任何問題

    /*
     初始化一個GLEW庫,確保OpenGL API對程式完全可用。
     在試圖做任何渲染之前,要檢查確定驅動程式的初始化過程中沒有任何問題
     */
    GLenum status = glewInit();
    if (GLEW_OK != status) {
        
        printf("GLEW Error:%s\n",glewGetErrorString(status));
        return 1;
        
    }
  • 詳細過程
int main(int argc,char *argv[])
{
    gltSetWorkingDirectory(argv[0]);//設定當前工作目錄,針對MAC OS X
    glutInit(&argc, argv);          //初始化一個GLUT庫
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH|GLUT_STENCIL);//顯示型別模式 
    glutInitWindowSize(800, 600);   //GLUT視窗大小、視窗標題
    glutCreateWindow("OpenGL_Demo");//建立一個視窗並定製視窗名
    glutReshapeFunc(changeSize);    //改變視窗大小
    glutDisplayFunc(RenderScene);   //繪圖函式
    glutSpecialFunc(SpeacialKeys);  //鍵盤操作
    
    //初始化一個GLEW庫,確保OpenGL API對程式完全可用
    GLenum status = glewInit();
    if (GLEW_OK != status) {
        printf("GLEW Error:%s\n",glewGetErrorString(status));
        return 1;
    }
    
    setupRC();//設定我們的渲染環境  
      
    glutMainLoop();//這是一個無限執行的迴圈,相當於RunLoop

    return  0;
    
}


/*
 在視窗大小改變時,接收新的寬度&高度。
 */
void changeSize(int w,int h)
{
    /*
     x,y 引數代表視窗中檢視的左下角座標,而寬度、高度是畫素為表示,通常x,y 都是為0
     */
    glViewport(0, 0, w, h);

}

/*
    繪製介面
*/
void RenderScene(void)
{    
     //清除一個或者一組特定的快取區
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);

    //2.設定一組浮點數來表示紅色
    GLfloat vRed[] = {1.0,0.0,0.0,1.0f};

    //單元著色器(型別,顏色)
    //shaderManager.UseStockShader(GLT_SHADER_IDENTITY,vRed);

    //提交著色器
    triangleBatch.Draw();

    //將後臺緩衝區進行渲染,然後結束後交換給前臺
    glutSwapBuffers();

}


/*
    移動圖形 -- 修改圖形座標!
*/
void SpeacialKeys(int key,int x,int y) {
    
    // ...
    
    glutPostRedisplay();//重新繪製
}


/*
    設定我們的渲染環境 
*/
void setupRC()
{
    //設定清屏顏色(背景顏色)
    glClearColor(0.2f, 0.40f, 0.7f, 1);

    //初始化一個渲染管理器,沒有著色器,在OpenGL 核心框架中是無法進行任何渲染的。
    shaderManager.InitializeStockShaders();

    //指定頂點
    //矩形
    GLfloat blockSize = 0.1f;
    GLfloat vVerts[] = {
        -blockSize,-blockSize,0.0f,
        blockSize,-blockSize,0.0f,
        blockSize,blockSize,0.0f,
        -blockSize,blockSize,0.0f
    };

    triangleBatch.Begin(GL_TRIANGLE_FAN, 4);
    triangleBatch.CopyVertexData3f(vVerts);//複製頂點資料到批處理中  
    triangleBatch.End();

}

Demo地址

    /*
     GLUT_RGBA:RGBA顏色值模式
     GLUT_DOUBLE:雙快取視窗
     GLUT_DEPTH:
     GLUT_STENCIL:
     */
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH|GLUT_STENCIL);
    /* 清除一個或者一組特定的快取區
     緩衝區是一塊存在影象資訊的儲存空間,紅色、綠色、藍色和alpha分量通常一起分量通常一起作為顏色快取區或畫素快取區引用。
     OpenGL 中不止一種緩衝區(顏色快取區、深度快取區和模板快取區)
     清除快取區對數值進行預置
     引數:指定將要清除的快取的
     GL_COLOR_BUFFER_BIT :指示當前啟用的用來進行顏色寫入緩衝區
     GL_DEPTH_BUFFER_BIT :指示深度快取區
     GL_STENCIL_BUFFER_BIT:指示模板緩衝區
     */
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);

    
    /* 平面著色器
     0.傳遞到儲存著色器,即GLT_SHADER_IDENTITY著色器,
     這個著色器只是使用指定顏色以預設笛卡爾座標第在螢幕上渲染幾何圖形
     1.平移矩陣 mTransformMatrix 與 每個頂點 相乘 -> 新頂點 (頂點著色器)
     2.將片元著色紅色 (片元著色器)
     */
     shaderManager.UseStockShader(GLT_SHADER_IDENTITY,vRed);
     
     
     //單元著色器(型別,顏色)---第一種方法用到的
     shaderManager.UseStockShader(GLT_SHADER_IDENTITY,vRed);
    //在開始的設定openGL 視窗的時候,我們指定要一個雙緩衝區的渲染環境。
    //這就意味著將在後臺緩衝區進行渲染,渲染結束後交換給前臺。
    //這種方式可以防止觀察者看到可能伴隨著動畫幀與動畫幀之間的閃爍的渲染過程。
    //緩衝區交換平臺將以平臺特定的方式進行。
    //將後臺緩衝區進行渲染,然後結束後交換給前臺
    glutSwapBuffers();
1804437-7d259e25acbc3b5c.jpg
--

相關文章