国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開(kāi)通VIP
9.2 OpenGL中的消隱處理
9.2 OpenGL中的消隱處理

多邊形剔除

 

    在多邊形表面模型中,一個(gè)面包括正面和反面,通常正面會(huì)被觀察著看見(jiàn),而反面通??床灰?jiàn),這種看不見(jiàn)的面,可以直接進(jìn)行消隱處理,這種處理可以使用OpenGL中的多邊形剔除函數(shù):
        glEnable(GL_CULL_FACE);
        glCullFace (mode);
這里用GL_CULL_FACE符號(hào)常量調(diào)用glEnable函數(shù)表示開(kāi)啟多邊形表面剔除功能。然后調(diào)用glCullFace函數(shù)指定多邊形所要剔除的面,參數(shù)mode可以賦值為GL_FRONT、GL_BACKGL_FRONT_AND_BACK,分別表示剔除多邊形的前面、后面以及前后面。

    剔除操作可以影響從開(kāi)啟剔除功能開(kāi)始繪制直至調(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();
 /*
第一個(gè)茶壺使用了剔除*/
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();

 /* 第二個(gè)茶壺關(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;
}

 

深度測(cè)試

 

    OpenGL中的深度測(cè)試是采用深度緩存器算法,消除場(chǎng)景中的不可見(jiàn)面。在默認(rèn)情況下,深度緩存中深度值的范圍在0.01.0之間,這個(gè)范圍值可以通過(guò)函數(shù):
        glDepthRange (nearNormDepth,farNormalDepth);
將深度值的范圍變?yōu)?/span>nearNormDepthfarNormalDepth之間。這里nearNormDepthfarNormalDepth可以取0.01.0范圍內(nèi)的任意值,甚至可以讓nearNormDepth>farNormalDepth。這樣,通過(guò)glDepthRange函數(shù)可以在透視投影有限觀察空間中的任意區(qū)域進(jìn)行深度測(cè)試。

    另一個(gè)非常有用的函數(shù)是:
        glClearDepth (maxDepth);
參數(shù)maxDepth可以是0.01.0范圍內(nèi)的任意值。glClearDepthmaxDepth對(duì)深度緩存進(jìn)行初始化,而默認(rèn)情況下,深度緩存用1.0進(jìn)行初始化。由于在進(jìn)行深度測(cè)試中,大于深度緩存初始值的多邊形都不會(huì)被繪制,因此glClearDepth函數(shù)可以用來(lái)加速深度測(cè)試處理。這里需要注意的是指定了深度緩存的初始化值之后,應(yīng)調(diào)用:
        glClear(GL_DEPTH_BUFFER_BIT);
完成深度緩存的初始化。

    在深度測(cè)試中,默認(rèn)情況是將需要繪制的新像素的z值與深度緩沖區(qū)中對(duì)應(yīng)位置的z值進(jìn)行比較,如果比深度緩存中的值小,那么用新像素的顏色值更新幀緩存中對(duì)應(yīng)像素的顏色值。這種比較測(cè)試的方式可以通過(guò)函數(shù):
        glDepthFunc(func);
進(jìn)行修改。其中參數(shù)func的值可以為GL_NEVER(沒(méi)有處理)、GL_ALWAYS(處理所有)、GL_LESS(小于)、GL_LEQUAL(小于等于)、GL_EQUAL(等于)、GL_GEQUAL(大于等于)、GL_GREATER(大于)或GL_NOTEQUAL(不等于),其中默認(rèn)值是GL_LESS。這些測(cè)試可以在各種應(yīng)用中減少深度緩存處理的的計(jì)算。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
NeHe OpenGL第二十六課:反射
OpenGL.Stencil Buffer
OpenGL ES基礎(chǔ)教程
深入了解OpenGL
基于VC++的OpenGL編程講座之曲線和曲面
OpenGL開(kāi)發(fā) 顏色、材料和光照:基礎(chǔ)知識(shí)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服