一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

9.2 OpenGL中的消隱處理

 sanxuxbr 2011-02-21
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_BACKGL_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.01.0之間,這個范圍值可以通過函數(shù):
        glDepthRange (nearNormDepth, farNormalDepth);
將深度值的范圍變?yōu)?/span>nearNormDepthfarNormalDepth之間。這里nearNormDepthfarNormalDepth可以取0.01.0范圍內(nèi)的任意值,甚至可以讓nearNormDepth > farNormalDepth。這樣,通過glDepthRange函數(shù)可以在透視投影有限觀察空間中的任意區(qū)域進(jìn)行深度測試。

    另一個非常有用的函數(shù)是:
        glClearDepth (maxDepth);
參數(shù)maxDepth可以是0.01.0范圍內(nèi)的任意值。glClearDepthmaxDepth對深度緩存進(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)用中減少深度緩存處理的的計算。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    天海翼高清二区三区在线| 日韩精品一区二区毛片| 欧美日韩乱一区二区三区| 日本东京热加勒比一区二区| 五月情婷婷综合激情综合狠狠| 国产毛片av一区二区三区小说| 一区二区福利在线视频| 日韩人妻中文字幕精品| 日韩中文字幕免费在线视频| 国产男女激情在线视频| 亚洲国产91精品视频| 欧美一区二区黑人在线| 黑丝国产精品一区二区| 91插插插外国一区二区婷婷| 草草夜色精品国产噜噜竹菊| 久久国产成人精品国产成人亚洲| 人妻一区二区三区在线| 欧美不卡一区二区在线视频| 色婷婷在线视频免费播放| 人妻熟女欲求不满一区二区| 婷婷亚洲综合五月天麻豆| 深夜视频在线观看免费你懂| 婷婷一区二区三区四区| 久久永久免费一区二区| 亚洲午夜福利视频在线| 日本在线高清精品人妻| 九九热这里只有精品哦| 免费特黄欧美亚洲黄片| 九九热精彩视频在线免费| 99一级特黄色性生活片| 国产人妻精品区一区二区三区| 亚洲一区二区精品国产av| 亚洲av熟女一区二区三区蜜桃| 日本高清加勒比免费在线| 亚洲一区二区三区在线中文字幕| 国产水滴盗摄一区二区| 成人免费观看视频免费| 中文字幕日韩欧美亚洲午夜| 久七久精品视频黄色的| 日韩一级欧美一级久久| 日韩精品综合福利在线观看|