《OpenGL超級寶典第5版》學習筆記(一)—— 第一個OpenGL程序

 

// GLTools庫包含了一個用於操做矩陣和向量的3D數學庫,並依靠GLEW得到OpenGL3.3中用來產生和渲染一些簡單3D對象的函數,
// 以及對視覺平截頭體、相機類和變換矩陣進行管理的函數的充分支持。
#include <GLTools.h>

// GLShaderManager爲GLTools的着色器管理器類。沒有着色器,咱們就不能再OpenGL(核心架構)中進行着色。着色器管理器類不只容許咱們建立並管理着色器,
// 還提供一組「存儲着色器」(Stock Shader),它們可以進行一些初步和基本的渲染操做。
#include <GLShaderManager.h>

// 判斷程序是在Mac上仍是在Windows上創建,並選擇對應的函數庫。
#ifdef _APPLE_
#include <glut/glut.h>
#else
#define FREEGLUT_STATIC
#include <GL/glut.h>
#endif

GLBatch trangleBatch;
GLShaderManager shaderManager;



void ChangeSize(int w, int h)
{
    // 設置視口大小。
    glViewport(0, 0, w, h);
}

void SetupRc()
{
    // 用當前顏色清除窗口
    glClearColor(0.0f, 0.0f, 1.0f, 1.0f);

    // 初始化着色器
    shaderManager.InitializeStockShaders();

    // 在笛卡爾座標系中指定三角形三個頂點的座標。
    GLfloat vVerts[] = { -0.5f, 0.0f, 0.0f,
                          0.5f, 0.0f, 0.0f,
                          0.0f, 0.5f, 0.0f, };

    // 創建三角形的批次。
    trangleBatch.Begin(GL_TRIANGLES, 3);
    trangleBatch.CopyVertexData3f(vVerts);
    trangleBatch.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);

    // 指示將幾何圖形提交到着色器。
    trangleBatch.Draw();

    // 啓用雙緩衝進行繪製。
    glutSwapBuffers();

}

int main(int argc, char* argv[])
{
    // 設置當前工做目錄,在Windows中並非必要的。
    gltSetWorkingDirectory(argv[0]);

    // 初始化GLUT庫。
    glutInit(&argc, argv);

    // 在建立窗口時使用下列類型的顯示模式:使用雙緩衝窗口、RGBA顏色模式、啓用深度測試以及模板測試。
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL);

    // 設置窗口大小。
    glutInitWindowSize(800, 600);

    //  建立一個以「Triangle」爲標題的窗口。
    glutCreateWindow("Triangle");

    // 窗口大小改變的回調函數。
    glutReshapeFunc(ChangeSize);

    // 窗口重繪的回調函數。
    glutDisplayFunc(RenderScene);

    // 從新調用GLEW庫初始化OpenGL驅動程序中全部丟失的入口點,以確保OpenGL API對咱們來講徹底可用。
    GLenum err = glewInit();
    if (GLEW_OK != err)
    {
        fprintf(stderr, "GLEW Error: %s\n", glewGetErrorString(err));
        return -1;
    }

    // 建立並初始化渲染環境。
    SetupRc();

    // 啓用主循環。
    glutMainLoop();

    return 0 ;
    
}
View Code

程序運行結果:架構

相關文章
相關標籤/搜索