對于用OpenGL繪制一個三角形的理解

繪制三角形大概的操作流程

  1. 初始化opengl可視化編程庫glut
  2. 窗口大小改變時,設(shè)置視口大小
  3. 視口環(huán)境的搭建
  4. 然后調(diào)用SetupRC初始化渲染環(huán)境進(jìn)行三角形渲染,這里用的是存儲著色器
  5. 期間glut會一直在內(nèi)部做一個消息的循環(huán),對相應(yīng)的響應(yīng)做出回調(diào)

對繪制三角形用到的代碼的一些解釋

GLBatch    triangleBatch;
GLShaderManager    shaderManager;

void ChangeSize(int w, int h)
{
    //窗口改變時,可視窗口也變化,這里的可視窗口和物理窗口一樣大
    glViewport(0, 0, w, h);
}

void SetupRC()
{
    //設(shè)置窗口清理的顏色
    glClearColor(0.0f, 0.0f, 1.0f, 1.0f );
    shaderManager.InitializeStockShaders();
    //設(shè)置三角形的笛卡爾坐標(biāo)
    GLfloat vVerts[] = { -0.5f, 0.0f, 0.0f,
        0.5f, 0.0f, 0.0f,
        0.0f, 0.5f, 0.0f };
    //gltools的存儲容器類,以供著色器渲染時使用
    triangleBatch.Begin(GL_TRIANGLES, 3);//設(shè)置哪種圖元,和頂點(diǎn)數(shù)
    triangleBatch.CopyVertexData3f(vVerts);//設(shè)置頂點(diǎn)坐標(biāo)
    triangleBatch.End();//結(jié)束存儲標(biāo)志
}

void RenderScene(void)
{
    //清理緩沖區(qū)顏色
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
    //設(shè)置一個紅色的顏色屬性
    GLfloat vRed[] = { 1.0f, 0.0f, 0.0f, 1.0f };
    //使用存儲的單位著色器進(jìn)行渲染
    shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vRed);
    //開始渲染
    triangleBatch.Draw();
    //由于用的雙緩沖區(qū)渲染,需要在后臺緩沖區(qū)渲染好的結(jié)果交換到前臺緩沖區(qū)這時候上回的前臺緩沖區(qū)就有在后臺進(jìn)行渲染以此類推,這個函數(shù)做的就是交換緩沖區(qū)的作用
    glutSwapBuffers();
}

int main(int argc, char* argv[])
{
    //指定工作目錄,將當(dāng)前文件夾設(shè)為應(yīng)用程序捆綁包Resource文件夾
    gltSetWorkingDirectory(argv[0]);
    glutInit(&argc, argv);
    //創(chuàng)建窗口使用的顯示模式
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL);
    //指定窗口大小
    glutInitWindowSize(800, 600);
    //設(shè)置窗口名
    glutCreateWindow("Triangle");
    //窗口改變時會回調(diào),第一次出現(xiàn)窗口也視為改變了一次窗口大小
    glutReshapeFunc(ChangeSize);
    //展示窗口時的回調(diào),這時調(diào)用了視口環(huán)境的搭建
    glutDisplayFunc(RenderScene);
    GLenum err = glewInit();
    if (GLEW_OK != err) {
        fprintf(stderr, "GLEW Error: %s\n", glewGetErrorString(err));
        return 1;
    }
    //初始化渲染環(huán)境的函數(shù)
    SetupRC();
    //主消息循環(huán),對于調(diào)用方法glut是一個內(nèi)部消息不斷循環(huán)的一個機(jī)制,當(dāng)有消息被攔截時,也就是當(dāng)某個響應(yīng)觸發(fā)時,就會通過響應(yīng)函數(shù)傳遞消息
    glutMainLoop();
    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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