




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第一節(jié)
繪制流程2基本任務(wù)變換裁剪光柵化或者稱為掃描轉(zhuǎn)化反走樣隱藏面消除建模3幾何處理光柵化顯示建模4基于頂點(diǎn)的方法計算機(jī)圖形學(xué)中有許多不同的建模技術(shù)幾何處理5即確定哪些幾何對象要被顯示,以及顯示出來的顏色或亮度是多少相關(guān)聯(lián)的過程為規(guī)范化裁剪隱藏面消除明暗處理基于浮點(diǎn)數(shù)進(jìn)行運(yùn)算,處理的是頂點(diǎn)規(guī)范化把幾何體從用戶坐標(biāo)轉(zhuǎn)換為照相機(jī)坐標(biāo)或者屏幕坐標(biāo)通常創(chuàng)建一個標(biāo)準(zhǔn)的視景體把所有的投影轉(zhuǎn)化為等價的正交投影6裁剪幾何對象經(jīng)過一系列變換后可能會變形或者改變了表示只有在視景體內(nèi)的對象被顯示出來不能把所有的對象都光柵化,希望硬件處理完全在視景體的對象7隱藏面消除hidden-surface
removal,也稱為可見面判定(visible-surface
determination)基于三維的位置關(guān)系8明暗處理也需要幾何信息法向其它特殊方法9光柵化在進(jìn)行了掃描后,那么得到的就是二維對象雖然可能已用屏幕坐標(biāo)表示了對象,但是所擁有的只是用頂點(diǎn)給出的表示基于頂點(diǎn)給出表示對象的一組像素就稱為光柵化(rasterization)或者掃描轉(zhuǎn)化(scan
conversion)10顯示在大多數(shù)顯示設(shè)備上,從幀緩沖區(qū)中獲取信息,并自動顯示出來應(yīng)用程序一般并不關(guān)心這一部分但有許多值得關(guān)注的問題走樣1112剪裁裁剪的目的13在幾何流水線體系的最后,頂點(diǎn)被集成為基本幾何形狀需要把在視景體外面的形狀刪除算法要基于用一列頂點(diǎn)表示的幾何形狀需要找到被每個幾何形狀影響的像素片段生成光柵化或掃描轉(zhuǎn)化基于對象的過程裁剪14投影光柵化幀緩沖區(qū)裁剪二維裁剪三維裁剪對線段和多邊形很容易進(jìn)行對于曲線和文本很難進(jìn)行首先轉(zhuǎn)化為線段和多邊形15二維線段的裁剪直觀方法計算線段與裁剪窗口邊界的交點(diǎn)低效:每次求交需要一次除法16各種情形Case
1:線段的兩個端點(diǎn)都在四條直線內(nèi)原樣繪制直線Case
2:兩個端點(diǎn)都在直線外,而且在一條直線的同側(cè)拋棄這條直線17各種情形,一個端點(diǎn)在外部Case
3:一個端點(diǎn)在必須進(jìn)行至少一次求交Case
4:都在外面仍可能部分在必須進(jìn)行至少一次求交18Cohen-Sutherland算法想法:盡可能不經(jīng)過求交就消除許多情形從確定裁剪窗口邊界的四條直線開始19定義編碼對于每個端點(diǎn),定義一個編碼b0b1b2b3如果y>ymax,b0
=1,否則=0如果y<ymin,b1
=1,否則=0如果x>xmax,b2
=1,否則=0如果x<xmin,b3=1,否則=0編碼把空間分成九個區(qū)域計算編碼最多需要四次減法2021應(yīng)用編碼考慮圖中所示的五種情形AB:編碼(A)=編碼(B)=0000
AB為可接受線段22應(yīng)用編碼CD:編碼(C)=0000編碼(D)=0010
0000計算交點(diǎn)在編碼(D)中的1確定線段與哪條邊相交如果有一條從點(diǎn)A出發(fā)的線段,另一端點(diǎn)的編碼中有兩個1,那么可能需要進(jìn)行兩次求交23應(yīng)用編碼EF:編碼(E)與編碼(F)的按位與(&)=0010
0即兩個編碼中有某一位同時等于1線段在相應(yīng)邊的外側(cè)應(yīng)當(dāng)拋棄24應(yīng)用編碼GH與IJ:編碼相同,也不全是零,但按位與(&)為0不能判斷線段和裁剪框是否有交通過與窗口一條邊求交縮短線段計算新端點(diǎn)的編碼重新執(zhí)行前述算法效率25在絕大多數(shù)應(yīng)用中,裁剪窗口相對于整個對象數(shù)據(jù)庫而言是比較小的大多數(shù)線段是在窗口的一條邊或多條邊外面,從而可以基于編碼把它們拋棄當(dāng)線段需要用多步進(jìn)行縮短時,代碼要被重復(fù)執(zhí)行,這時效率不高總結(jié)利用簡單分割以后化為簡單情況“分而治之”(Divide-and-conquer)的思想26三
中的Cohen-Sutherland算法利用6位進(jìn)行編碼必要時,相對于平面裁剪線段27中點(diǎn)法(Mid-point
method)對線段進(jìn)行編碼把線段與裁剪框的關(guān)系分為三種情況完全在裁剪框內(nèi)(兩個端點(diǎn)編碼為0000)完全在裁剪框外(端點(diǎn)編碼的按位與(&)不等于0)線段與裁剪框有交28中點(diǎn)法(Mid-point
method)從端點(diǎn)????出發(fā)尋找離????最近的交點(diǎn)??計算????????的中點(diǎn)??????對??????編碼去除完全位于裁剪框外側(cè)的一段對剩下的一段繼續(xù)以上操作……直到|??????
??????????|小于給定精度從端點(diǎn)??1出發(fā)尋找離??1最近的交點(diǎn)??29Liang-Barsky裁剪算法考慮線段的參數(shù)化表示p()
=
(1
–
)p1
+
p2,
0
1在計算出來線段所在直線與窗口各邊交點(diǎn)對應(yīng)的值后,
可以通過這些參數(shù)值的順序區(qū)分出各種情形30各種情形31情形(a):0<1
<2
<3
<4
<1交點(diǎn)依次在右、頂、左、底邊:縮短情形(b):0<1
<3
<2
<4
<1交點(diǎn)依次在右、左、頂、底:拋棄效率的提高32交點(diǎn)的表示
=(ymax
–y1)/(y2
–y1)需要浮點(diǎn)除法盡可能地避免交點(diǎn)計算交點(diǎn)方程的重寫:
(y2
–y1)=(ymax
–y1)所需要的測試可以對ymax和y以及其它類似項(xiàng)進(jìn)行只有當(dāng)需要裁剪求交時才要把交點(diǎn)計算出來優(yōu)勢33與Cohen-Sutherland算法一樣很簡單地接受或拋棄直線應(yīng)用值使得不必要像Cohen-Sutherland算法那樣重復(fù)應(yīng)用代碼可以推廣到三維的情形裁剪與規(guī)范化中一般的裁剪需要計算線段與任意平面的在三交點(diǎn)例:傾斜投影34平面與直線的交點(diǎn)
n
(
p0
p1)n
(
p2
p1)35規(guī)范形式規(guī)范化過程是視圖生成的一部分(在裁剪前進(jìn)行)。但在規(guī)范化后,相對于長方體進(jìn)行裁剪這時典型的求交計算只需要一次浮點(diǎn)減法投影平面投影平面對象變形后的對象新的裁剪體裁剪體頂視圖規(guī)范化前規(guī)范化后36裁剪是一個黑盒子可以認(rèn)為線段的裁剪就是從兩個頂點(diǎn)出發(fā),得到的結(jié)果為:沒有頂點(diǎn)或者裁剪后線段的頂點(diǎn)裁剪器37線段裁剪的流水線體系對窗口一邊進(jìn)行裁剪時,與其它邊無關(guān)在流水線中要用到四個獨(dú)立的裁剪器頂38底右左多邊形的裁剪并不像線段裁剪那樣簡單裁剪一條線段最多得到一條線段裁剪一個多邊形可以得到多個多邊形然而,裁剪凸多邊形最多得到一個多邊形39劃分與凸性
法就是把非凸(凹)多邊形用一組三角形代替,這個過程稱為劃分(tessellation)這同樣也使得填充變得簡單在GLU庫中有劃分代碼,但最好的方法就是由用戶自己進(jìn)行40多邊形裁剪的流水線體系三維:增加前與后裁剪器SGI
Geometry
Engine中應(yīng)用這種策略在等待時間方面有很小的增長頂41底右左包圍盒(bounding
box)不是直接對復(fù)雜多邊形進(jìn)行裁剪,而是先用一個方向與坐標(biāo)軸平行的立方體或其它形狀包圍多邊形包圍盒應(yīng)盡可能得小容易計算出坐標(biāo)的最大值與最小值42應(yīng)用包圍盒通過直接基于包圍盒確定多邊形的接受與拋棄拋棄接受需要更仔細(xì)的裁剪處理43裁剪與可見性44在隱藏面消除中經(jīng)常用到裁剪實(shí)際上,對于裁剪與隱藏面消除,都是希望把看不到的對象從視野中去掉通過可以在處理過程中提早應(yīng)用可見性或者遮擋檢測,從而在進(jìn)入流水線體系之前消去盡可能多的多邊形45第三節(jié)
隱藏面消除流水線中的位置46在頂點(diǎn)經(jīng)過幾何變換后,其所定義的幾何對象經(jīng)過了集成與裁剪得到的是一組點(diǎn)、線段和多邊形在最終的投影后,其中所有的對象都有可能出現(xiàn)在顯示設(shè)備上此時需要進(jìn)行隱藏面消除從各種不同的出發(fā)點(diǎn),得到各種不同算法基本算法考慮輸出由不透明對象構(gòu)成的場景的如下兩種方法對于每個像素,確定投影到這個像素的離觀察者最近的那個對象,從而基于該對象計算像素的亮度光線
框架對于每個對象,確定它所覆蓋的像素,并用對象的狀態(tài)確定像素的亮度流水線過程必須
深度47算法類型前述兩種過程分別稱為面向圖像(image-oriented)的過程和面
象(object-oriented)的過程也分別稱為先排序(sort-
)與后排序(sort-last)過程基于隱藏面消除發(fā)生的地方48對象空間的算法考慮由k個三維不透明多邊形構(gòu)成的場景每個多邊形認(rèn)為是單獨(dú)的一個對象兩兩考慮對象,檢測相互之間的位置最糟糕的情形:n個多邊形復(fù)雜度為O(n2)49畫家算法把多邊形沿從后到前的順序顯示出來,從而被遮住的多邊形(或部分)在顯示時被遮擋從觀察者的角度來說,B在A后面50先畫B,再畫A畫家算法-深度排序需要首先對多邊形進(jìn)行排序排序的復(fù)雜度為O(n
log
n)并不是所有的多邊形都完全在其它多邊形的前面或后面進(jìn)行排序時,先處理簡單情形,再處理
情形到COP的距離多邊形多邊形按到COP的距離進(jìn)行排序51簡單情形多邊形A位于所有其它多邊形后面可以繪制出來,但在x或多邊形在z方向有y方向沒有可以分別顯示繪制出來52情形,在所有方向都有但其中一個完全在另一個的一側(cè)循環(huán)貫穿53背面剔除(back-face
removal)面是可見的,如果–90
90等價于cos
0或者v
n
0平面具有形式ax+by+cz+d=0,但對于規(guī)范化視線向量n=(0,0,1,0)只需要檢測c的符號在OpenGL中可以激活背面剔除功能,但是如果具有非凸對象,結(jié)果可能不正確54圖像空間的過程對每條投影線(對于n
m分辨率的幀緩沖區(qū),共有
nm條投影線),找到k個多邊形中最近的那個復(fù)雜度O(nmk)光線
算法z緩沖區(qū)算法55z緩沖區(qū)算法應(yīng)用一個稱為z緩沖區(qū)或者深度緩沖區(qū)的地方,存貯每個像素到目前為止找到的最近對象的深度在顯示每個多邊形時,把它的深度與z緩沖區(qū)中存貯的深度進(jìn)行比較如果新值小的話,把新的亮度值放到顏色緩沖區(qū)中并且用新深度更新z緩沖區(qū)56效率的提高如果逐條掃描線遍歷,從左向右移動一條掃描線,那么深度的改變滿足a
x+b
y+c
z=0沿每條掃描線y
=
0,z
=
–a/c
x在屏幕空間上x=157掃描線算法在掃描線算法中把明暗處理算法與隱藏面消除算法結(jié)合在一起掃描線i:不需要深度信息,適合于沒有多邊形或者只有一個多邊形掃描線j:只有當(dāng)遇到多個多邊形時,才需要深度信息58實(shí)現(xiàn)需要相應(yīng)的數(shù)據(jù)結(jié)構(gòu)存貯下述信息每個多邊形的標(biāo)志(
或外部)掃描線的增量結(jié)構(gòu),存貯遇到的邊的信息平面的參數(shù)59可見面檢測在許多實(shí)時應(yīng)用系統(tǒng)中(例如
),
希望能在應(yīng)用程序中消除盡可能多的不可見對象從而降低流水線體系的負(fù)擔(dān)降低出現(xiàn)數(shù)據(jù)通信阻塞的可能利用二叉空間剖分(binary
spatial
partition,BSP)樹結(jié)構(gòu)剖分空間60簡單示例考慮六個
平行多邊形61頂視圖平面B和C位于平面
A的一側(cè),平面D,E和F位于平面A的另一側(cè)BSP樹可以連續(xù)進(jìn)行剖分平面C把B與A分開平面D把E與F分開可以把這些信息放在一個BSP樹中用于可見性與遮擋檢測62OPENGL中的裁剪與消隱63OpenGL中的裁剪64在OpenGL中,除了視景體的6個裁剪平面(左、右、底、頂、近、遠(yuǎn))外,還可再指定最多6個其他裁剪平面,對視景體施加進(jìn)一步限制每個平面由方程????+????+????+??=??所指定最終的裁剪區(qū)域是視景體與其他裁剪平面定義的所有半空間的交集在OpenGL中,裁剪平面會根據(jù)模型和視圖矩陣自動執(zhí)行適當(dāng)變換,并對被裁剪多邊形的邊自動進(jìn)行重構(gòu)OpenGL中的裁剪65glClipPlane(Glenum
plane,
const
Gldouble
*equation)功能:定義裁剪曲面plane:取值為GL_CLIP_PLANEi,其中i是一個整數(shù)equation:指向平面方程Ax+By+Cz+D=0的4個系數(shù)glEnalbe(GL_CLIP_PLANEi)功能:啟用裁剪曲面GL_CLIP_PLANEiglDisable(GL_CLIP_PLANEi)功能:禁用一個裁剪曲面glGetIntegerv(GL_MAX_CLIP_PLANES)功能:獲得系統(tǒng)支持的其他裁剪曲面的最大數(shù)目OpenGL中的裁剪實(shí)例66#include
<windows.h>#include
<gl/glut.h>#include<gl/gl.h>#include<gl/glu.h>//旋轉(zhuǎn)參數(shù)static
GLfloat
xRot
=
0.0f;static
GLfloat
yRot
=
0.0f;void
SetupRC(void){glClearColor(1.0f,
1.0f,
1.0f,
1.0f);glShadeModel
(GL_FLAT);}void
ChangeSize(GLsizei
w,
GLsizei
h){if(h
==
0)
h
=
1;//設(shè)置視區(qū)尺寸
glViewport(0,0,w,h);glMatrixMode(GL_PROJECTION);glLoadIdentity();//建立裁剪空間的范圍glu (60.0f,
(GLfloat)glMatrixMode(GL_MODELVIEW);}w/(GLfloat)
h,
1.0f,
20.0f);OpenGL中的裁剪實(shí)例67//在窗口繪制圖形void
RenderScene(void){//定義裁剪平面方程系數(shù),這里平面方程為x=0GLdouble
eqn[4]={1.0,0.0,0.0,0.0};glClear(GL_COLOR_BUFFER_BIT);glColor3f
(1.0f,
0.0f,
0.0f);glPushMatrix();//沿z軸負(fù)方向平移一段距離,保證良好的觀察效果
glTranslatef
(0.0,0.0,-5.0);//設(shè)置裁剪平面glClipPlane
(GL_CLIP_PLANE0,
eqn);glEnable
(GL_CLIP_PLANE0);//使球體旋轉(zhuǎn)glRotatef(xRot,
1.0f,
0.0f,
0.0f);glRotatef(yRot,
0.0f,
1.0f,
0.0f);glutWireSphere(2.0f,
20
,
20);glPopMatrix();glFlush();}OpenGL中的裁剪實(shí)例void
SpecialKeys(int
key,
int
x,
int
y){if(key
==
GLUT_KEY_UP)
xRot-=
5.0f;if(key
==
GLUT_KEY_DOWN)
xRot
+=
5.0f;if(key
==
GLUT_KEY_LEFT)
yRot
-=
5.0f;if(key
==
GLUT_KEY_RIGHT)
yRot
+=
5.0f;if(xRot
>
356.0f)
xRot
=
0.0f;if(xRot
<
-1.0f)
xRot
=
355.0f;if(yRot
>
356.0f)
yRot
=
0.0f;if(yRot
<
-1.0f)
yRot
=
355.0f;glutPostRedisplay();}int
main(int
argc,
char*
argv[]){glutInit(&argc,
argv);glutInitDisplayMode(GLUT_SINGLE
|
GLUT_RGB);glutCreateWindow("GLClipPlane");glutDisplayFunc(RenderScene);glutSpecialFunc(SpecialKeys);glutResh
Func(ChangeSize);SetupRC();glutMainLoop();return
0;}程序功能:這個控制臺程序中的球體能夠通過鍵盤的方向鍵控制旋轉(zhuǎn),而且方程x=0對這個球體進(jìn)行裁剪6869OpenGL中的
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度休閑餐飲店員工勞動聘請服務(wù)協(xié)議
- 2025年度足浴店品牌授權(quán)及連鎖經(jīng)營權(quán)轉(zhuǎn)讓協(xié)議
- 二零二五年度黃金抵押貸款還款計劃合同
- 2025年度智慧醫(yī)療合伙開店合同
- 二零二五年度商場場地租賃與物業(yè)租賃服務(wù)合同
- 二零二五年度教育行業(yè)委托擔(dān)保服務(wù)協(xié)議
- 二零二五年度貨車運(yùn)輸合伙人風(fēng)險共擔(dān)合作協(xié)議合同
- 2025年法人變更背景下的股權(quán)轉(zhuǎn)讓協(xié)議書
- 江西省水務(wù)集團(tuán)有限公司2024年勞務(wù)派遣人員招聘【34人】筆試參考題庫附帶答案詳解
- 2025西安數(shù)據(jù)資產(chǎn)經(jīng)營有限責(zé)任公司招聘筆試參考題庫附帶答案詳解
- 辦公用品供貨服務(wù)計劃方案
- 《普通生物學(xué)教案》word版
- 貴州省就業(yè)失業(yè)登記表
- 預(yù)防電信詐騙網(wǎng)絡(luò)詐騙講座PPT幻燈片課件
- 反興奮劑知識試題及答案
- 初中八年級上冊音樂課件4.2欣賞沃爾塔瓦河(14張)ppt課件
- 人教版五年級數(shù)學(xué)下冊每個單元教材分析(共九個單元)
- 深圳氫燃料共享單車項(xiàng)目投資計劃書【參考范文】
- 主要腸內(nèi)營養(yǎng)制劑成分比較
- 小學(xué)生如何理解句子的含義(課堂PPT)
- 實(shí)際控制關(guān)系賬戶申報表
評論
0/150
提交評論