9.2 OpenGL中的消隱處理
多邊形剔除
在多邊形表面模型中,一個面包括正面和反面,通常正面會被觀察著看見,而反面通??床灰?,這種看不見
的面,可以直接進(jìn)行消隱處理,這種處理可以使用OpenGL中的多邊形剔除函數(shù):
glEnable(GL_CULL_FACE);
glCullFace (mode);
這里用GL_CULL_FACE符號常量調(diào)用glEnable函數(shù)表示開啟多邊形表面剔除功能。然后調(diào)用glCullFace函數(shù)指定多邊形所要剔除的面,參數(shù)mode可以賦值為GL_FRONT、GL_BACK和GL_FRONT_AND_BACK,分別表示剔除多邊形的前面、后面以及前后面。
剔除操作可以影響從開啟剔除功能開始繪制直至調(diào)用函數(shù):
glDisable(GL_CULL_FACE);
關(guān)閉剔除功能為止的所有多邊形。
程序:多邊形剔除
#include <windows.h>
#include <gl/glut.h>
void Initial()
{
glEnable(GL_DEPTH_TEST);
glFrontFace(GL_CW);
glClearColor(1.0, 1.0, 1.0, 0.0);
}
void ChangeSize(int w, int h)
{
if(h == 0) h = 1;
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w <= h)
glOrtho (-4.0f, 4.0f, -4.0f*h/w, 4.0f*h/w, -4.0f, 4.0f);
else
glOrtho (-4.0f*w/h, 4.0f*w/h, -4.0f, 4.0f, -4.0f, 4.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void Display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1.0,0.0,0.0);
glPushMatrix();
/* 第一個茶壺使用了剔除*/
glEnable(GL_CULL_FACE);
glCullFace (GL_BACK); //剔除茶壺的后向面
glTranslatef(-2.0f, 0.0f, 0.0f);
glRotatef(180.0f, 0.0f, 1.0f, 0.0f );
GLdouble equ[4] = { -1.0f, 2.3f, 2.3f, 2.3f }; // equ中保存平面方程的系數(shù)
glClipPlane(GL_CLIP_PLANE0, equ);
//glClipPlane定義裁減平面
glEnable(GL_CLIP_PLANE0);
glutSolidTeapot(1.0);
glPopMatrix();
/* 第二個茶壺關(guān)閉了剔除操作*/
glDisable(GL_CULL_FACE);
glTranslatef(2.0f, 0.0f, 0.0f);
glRotatef(180.0f, 0.0f, 1.0f, 0.0f );
glClipPlane(GL_CLIP_PLANE0, equ);
glEnable(GL_CLIP_PLANE0);
glutSolidTeapot(1.0);
glPopMatrix();
glDisable(GL_CLIP_PLANE0);
glFlush();
}
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB );
glutInitWindowSize(400,400);
glutCreateWindow("茶壺的剔除操作");
glutReshapeFunc(ChangeSize);
glutDisplayFunc(Display);
Initial();
glutMainLoop();
return 0;
}
深度測試
OpenGL中的深度測試是采用深度緩存器算法,消除場景中的不可見面。在默認(rèn)情況下,深度緩存中深度值的范圍在0.0到1.0之間,這個范圍值可以通過函數(shù):
glDepthRange (nearNormDepth,
farNormalDepth);
將深度值的范圍變?yōu)?/span>nearNormDepth到farNormalDepth之間。這里nearNormDepth和farNormalDepth可以取0.0到1.0范圍內(nèi)的任意值,甚至可以讓nearNormDepth
>
farNormalDepth。這樣,通過glDepthRange函數(shù)可以在透視投影有限觀察空間中的任意區(qū)域進(jìn)行深度測試。
另一個非常有用的函數(shù)是:
glClearDepth (maxDepth);
參數(shù)maxDepth可以是0.0到1.0范圍內(nèi)的任意值。glClearDepth用maxDepth對深度緩存進(jìn)行初始化,而默認(rèn)情況下,深度緩存用1.0進(jìn)行初始化。由于在進(jìn)行深度測試中,大
于深度緩存初始值的多邊形都不會被繪制,因此glClearDepth函數(shù)可以用來加速深度測試處理。這里需要注意的是指定了深度緩存的初始化值之后,應(yīng)調(diào)用:
glClear(GL_DEPTH_BUFFER_BIT);
完成深度緩存的初始化。
在深度測試中,默認(rèn)情況是將需要繪制的新像素的z值與深度緩沖區(qū)中對應(yīng)位置的z值進(jìn)行比較,如果比深度緩存中的值小,那么用新像素的顏色值更新幀緩存中對應(yīng)像素的顏色值。這種比
較測試的方式可以通過函數(shù):
glDepthFunc(func);
進(jìn)行修改。其中參數(shù)func的值可以為GL_NEVER(沒有處理)、GL_ALWAYS(處理所有)、GL_LESS(小于)、GL_LEQUAL(小于等于)、GL_EQUAL(等于)、GL_GEQUAL(大于等于)、GL_GREATER(大于)或GL_NOTEQUAL(不等于),其中默認(rèn)值是GL_LESS。這些測試可以在各種應(yīng)用中減少深度緩存處理的的計算。
|