現代OpenGL+Qt學習筆記之九:smooth和flat着色模式

現代OpenGL+Qt學習筆記之九:smooth和flat着色模式

主要內容

  介紹OpenGL中的着色模式的概念和在GLSL中的實現方式。

着色模式

  在傳統OpenGL的固定管線中,函數void glShadeModel ( GLenum mode)的作用是設置着色模式。

  參數mode可以是GL_SMOOTH(默認值)或GL_FLAT。採用flat着色時(即GL_FLAT),OpenGL將使用圖元中某個頂點的顏色來渲染整個圖元,通常情況下會選擇圖元的第一個或最後一個頂點的顏色作爲該圖元的顏色,可以通過glProvokingVertex()函數設置,其參數可以是GL_FIRST_VERTEX_CONVENTION(第一個頂點)或GL_LAST_VERTEX_CONVENTION(第二個頂點)。

  在使用smooth着色時(即GL_SMOOTH),OpenGL會獨立的處理圖元中各個頂點的顏色。對於線段圖元,線段上各點的顏色將根據兩個頂點的顏色通過插值得到。對於多邊形圖元,多邊形內部區域的顏色將根據所有頂點的顏色插值得到。

  在GLSL中,切換flat或者smooth模式非常簡單,只需要修改(添加)一個限定符(flat 或 smooth)即可。現在在現代OpenGL+Qt學習筆記之八:GLSL雙面渲染的程序基礎上進行修改。首先爲了讓兩種着色模式下的渲染結果差距更加明顯,我們採用更加稀疏的網格來表示茶壺模型。修改openglwidget.cpp中44行的代碼(初始化茶壺網格模型)如下:

teapot = new VBOTeapot(7, transform);

  運行程序,其結果就是默認的smooth着色模式的渲染結果:

smooth渲染模式

  要實現flat渲染模式也非常簡單,只需要將頂點着色器和片元着色器中頂點的輸入和輸出變量前加上限定符flat即可。如在頂點着色器中,輸出變量爲:

flat out vec3 FrontColor;
flat out vec3 BackColor;

  在片元着色器中,對應的輸入變量爲:

flat in vec3 FrontColor;
flat in vec3 BackColor;

  保存後運行程序的結果就是flat着色模式下的渲染結果:

flat着色模式

  實際上,在兩個着色器中,其輸入輸出變量前是有一個默認的限定符smooth的,如果要顯示的說明採用smooth着色模式對模型進行渲染,可以修改着色器中相關的輸入輸出變量聲明如下:

smooth out vec3 FrontColor;
smooth out vec3 BackColor;

smooth in vec3 FrontColor;
smooth in vec3 BackColor;

源碼地址:http://download.csdn.net/download/chaojiwudixiaofeixia/10003276

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章