歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> OpenGL的FLAT與SMOOTH繪制的區別

OpenGL的FLAT與SMOOTH繪制的區別

日期:2017/3/1 10:05:19   编辑:Linux編程

利用OPENGL可以繪制三維模型,在指定繪制模式的時候要通過指定光照,以及材質才能使物體看上去有三維的效果,否則,物體看上去就像是一張二維的圖片一樣。但是除了指定光照跟材質,還需要有一個非常重要的東西,那就是模型上頂點的法線。

一個曲面上的頂點的法線是指經過這一點並且與該點的切平面相垂直的那條直線。然而由於我們的三維模型是用頂點以及幾個頂點(一般是三個)所組成的多邊形來表示的(我們下面的描述都用三角形來表示),所以一個頂點可能同時屬於N個相鄰的三角形,每一個三角形有一個垂直它的法線向量,所以一個頂點的法線就可能有很多個。

在OPENGL繪制三角形的時候是通過指定三角形的三個三維頂點的坐標來實現的,如果在指定三個頂點的三維坐標的時候同時指定了該點的法線,那麼繪制出來的模型看上去就有三維效果了。然而由於一個頂點的法線有可能有很多個,那麼不同的法線指定方式,就會產生不同的繪制效果。

第一種:FLAT方式

FLAT指的是把三角形的三個頂點的發現向量都指定為該三角形所在平面的法線向量,繪制該三角形的代碼如下:

glBegin(GL_TRIANGLES);

for (i = 0; i < group->numtriangles; i++) {

triangle = &T(group->triangles[i]);

glNormal3fv(&model->facetnorms[3 * triangle->findex]); //關鍵語句,將三個頂點的法線同時指定為三角面片的法線

glVertex3fv(&model->vertices[3 * triangle->vindices[0]]);

glVertex3fv(&model->vertices[3 * triangle->vindices[1]]);

glVertex3fv(&model->vertices[3 * triangle->vindices[2]]);

}

glEnd();

這種方式繪制出來的效果能清楚地看到模型上的三角面片,如下圖所示:

Copyright © Linux教程網 All Rights Reserved