第三章繪制基本圖元_第1頁(yè)
第三章繪制基本圖元_第2頁(yè)
第三章繪制基本圖元_第3頁(yè)
第三章繪制基本圖元_第4頁(yè)
第三章繪制基本圖元_第5頁(yè)
已閱讀5頁(yè),還剩60頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第三章繪制基本圖元第1頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月3.1坐標(biāo)系統(tǒng)計(jì)算機(jī)只能處理數(shù)據(jù),為了能在屏幕上顯示三維圖形,必須將三維圖形與數(shù)據(jù)相聯(lián)系,將數(shù)據(jù)與三維圖形聯(lián)系在一起的唯一紐帶,就是坐標(biāo)。為了描述圖形,首先必須建立一個(gè)世界坐標(biāo)系(二維或三維笛卡爾坐標(biāo)系),在世界坐標(biāo)系中給出圖形對(duì)象的位置和方向,然后投影到顯示設(shè)備的顯示區(qū)域?qū)?yīng)的二維平面上,并掃描轉(zhuǎn)換到幀緩存的整數(shù)像素位置。如可以通過(guò)兩個(gè)端點(diǎn)定義一條直線段,通過(guò)一組頂點(diǎn)定義一個(gè)多邊形。對(duì)象的坐標(biāo)范圍(x、y、z坐標(biāo)的最大最小值)稱為對(duì)象的包圍盒,對(duì)于二維圖形,坐標(biāo)范圍就是包圍矩形。第2頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月屏幕坐標(biāo)及圖形坐標(biāo)顯示器上的位置用整型的屏幕坐標(biāo)來(lái)描述,與幀緩存中的像素位置相對(duì)應(yīng)。坐標(biāo)y值給出像素的行序號(hào),x值給出列序號(hào)。屏幕刷新硬件一般從屏幕的左上角開(kāi)始對(duì)像素進(jìn)行編址,從最上面的0行到最下面的ymax行,對(duì)掃描行進(jìn)行編號(hào);每行從左到右,從0到xmax按列進(jìn)行編號(hào)。圖形軟件可以按照任意方式設(shè)定屏幕位置的圖形坐標(biāo)系統(tǒng),如可以設(shè)定屏幕區(qū)域的左下角為原點(diǎn)(視區(qū)的默認(rèn)值),用整數(shù)坐標(biāo)或非整數(shù)笛卡爾坐標(biāo)來(lái)描述圖形。描述物體對(duì)象的坐標(biāo)值最終轉(zhuǎn)換為幀緩存中的整數(shù)像素位置。圖元的掃描轉(zhuǎn)換根據(jù)給定的坐標(biāo)來(lái)確定要顯示的像素位置,如給定一條直線段的兩個(gè)端點(diǎn),顯示函數(shù)必須計(jì)算出兩端點(diǎn)間位于線段上的所有像素的位置。由于一個(gè)像素位置占有屏幕上的一個(gè)有限范圍,因此圖形顯示算法必須考慮像素的有限大小,一般假定像素坐標(biāo)對(duì)應(yīng)于像素區(qū)域的中心。第3頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月屏幕上的笛卡爾坐標(biāo)系第4頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月顯示窗口上一章的繪圖實(shí)例中應(yīng)用gluOrtho2D(xmin,xmax,ymin,ymax)函數(shù)設(shè)定了一個(gè)二維視見(jiàn)空間(二維笛卡爾坐標(biāo)系),其參數(shù)指定了顯示窗口的x、y坐標(biāo)范圍。顯示窗口的左下角位于坐標(biāo)(xmin,ymin)處,右上角位于坐標(biāo)(xmax,ymax)處。如果一個(gè)圖元的坐標(biāo)范圍完全在顯示窗口內(nèi),該圖元將完整地顯示出來(lái),否則,僅僅位于顯示窗口范圍內(nèi)的部分圖元能顯示出來(lái),這涉及到裁剪。第5頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月3.2頂點(diǎn)及圖元在OpenGL中所有的幾何物體最終都要描述成一個(gè)頂點(diǎn)的有序集合,包括單個(gè)點(diǎn)、線段的端點(diǎn)或多邊形的頂點(diǎn)。點(diǎn)由其坐標(biāo)來(lái)描述,線是指線段,可由兩個(gè)端點(diǎn)來(lái)描述,多邊形是指由線段組成的封閉區(qū)域,由各線段的端點(diǎn)來(lái)描述。要繪制一個(gè)三維點(diǎn),只需在世界坐標(biāo)系中指定該點(diǎn)的坐標(biāo),OpenGL按指定的大小和顏色來(lái)顯示這個(gè)點(diǎn),默認(rèn)的顏色為白色,默認(rèn)的大小為一個(gè)屏幕像素大小,屏幕上繪制的像素是一個(gè)正方形區(qū)域。多邊形常常通過(guò)充填其內(nèi)部的像素來(lái)顯示,也可以顯示其輪廓線。一般而言,多邊形可能很復(fù)雜,所以O(shè)penGL對(duì)多邊形做了一些強(qiáng)制限定。首先,多邊形的邊不能相交,其次多邊形必須是凸的,如果指定一個(gè)非凸的多邊形,將繪出意想不到的結(jié)果。對(duì)多邊形類型作出限制,是為了提高繪制多邊形的速度和性能。由于頂點(diǎn)一般是三維的,如果多邊形的頂點(diǎn)并不處于同一平面內(nèi),經(jīng)過(guò)一系列旋轉(zhuǎn)及改變視點(diǎn)后,這些點(diǎn)將不再組成一個(gè)簡(jiǎn)單的凸多邊形,OpenGL無(wú)法保證這個(gè)多邊形得到正確繪制。一般可以通過(guò)一系列三角形來(lái)逼近多邊形,因?yàn)槿切蔚娜齻€(gè)頂點(diǎn)肯定位于同一個(gè)平面內(nèi)。第6頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月指定頂點(diǎn)坐標(biāo)OpenGL中,可以使用函數(shù)glVertex()指定頂點(diǎn)的坐標(biāo),但頂點(diǎn)既可以是一個(gè)純粹的點(diǎn),也可以是線段的端點(diǎn),還可以是多邊形的角點(diǎn),OpenGL中共有10種圖元,必須明確指明這些頂點(diǎn)構(gòu)成何種圖元。OpenGL中將每組頂點(diǎn)放在函數(shù)glBegin()和glEnd()之間,由glBegin()的參數(shù)來(lái)指定相應(yīng)的幾何圖元,然后調(diào)用glEnd()來(lái)結(jié)束這組頂點(diǎn)的定義。第7頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月幾何圖元的參數(shù)和含義參數(shù)值意義GL_POINTS獨(dú)立的點(diǎn)GL_LINES一對(duì)頂點(diǎn)表示一條線段GL_LINE_STRIP各頂點(diǎn)連接成的線段GL_LINE_LOOP各頂點(diǎn)連接成的封閉線段GL_TRIANGLES三個(gè)頂點(diǎn)構(gòu)成的三角形GL_TRIANGLE_STRIP相連的三角形條帶GL_TRIANGLE_FAN相連的扇形GL_QUADS四個(gè)頂點(diǎn)構(gòu)成的四邊形GLQUAD_STRIP相連的四邊形條帶GL_POLYGON簡(jiǎn)單的凸多邊形第8頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月第9頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月繪制三維點(diǎn)例3-1(POINTS)繪制一系列的三維點(diǎn),使它們沿Z軸形成一個(gè)螺旋圈。 glBegin(GL_POINTS); z=-50.0f; for(angle=0.0f;angle<=(2.0f*GL_PI)*3.0f;angle+=0.1f) { x=50.0f*sin(angle); y=50.0f*cos(angle);

//SpecifythepointandmovetheZvalueupalittle glVertex3f(x,y,z); z+=0.5f; } //Donedrawingpoints glEnd();第10頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月點(diǎn)的屬性點(diǎn)的屬性包括顏色和大小,可以調(diào)用函數(shù)glPointSize()來(lái)改變點(diǎn)的大小,該函數(shù)有1個(gè)參數(shù),指定點(diǎn)的近似直徑(以像素為單位),但點(diǎn)的大小設(shè)置還是存在限制。另外,點(diǎn)和其它幾何圖形不同,它不會(huì)受到透視的影響,即離視點(diǎn)較遠(yuǎn)時(shí),看上去并不會(huì)變小,離視點(diǎn)更近時(shí),看上去也不會(huì)變大。例3-2(POINTSZ):產(chǎn)生一個(gè)點(diǎn)逐漸增大的螺旋圈。for(angle=0.0f;angle<=(2.0f*3.1415f)*3.0f;angle+=0.1f){ //Calculatexandyvaluesonthecircle x=50.0f*sin(angle); y=50.0f*cos(angle);

//Specifythepointsizebeforetheprimativeisspecified glPointSize(curSize); //Drawthepoint glBegin(GL_POINTS); glVertex3f(x,y,z); glEnd(); //Bumpupthezvalueandthepointsize z+=0.5f; curSize+=step;}第11頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月3.3直線段的掃描轉(zhuǎn)換算法例2-2給出了一個(gè)繪直線段的例子,代碼如下:glBegin(GL_LINES);//開(kāi)始定義一組頂點(diǎn)坐標(biāo),

//每相鄰的兩個(gè)兩點(diǎn)組成一對(duì),在該兩點(diǎn)之間繪直線 glVertex2i(180,15);//定義頂點(diǎn)坐標(biāo) glVertex2i(10,145);//結(jié)束定義一組頂點(diǎn)坐標(biāo)glEnd();例3-3(LSTRIPS)給出了一個(gè)由直線段逼近三維螺旋曲線的例子場(chǎng)景中的直線段由其兩端點(diǎn)的坐標(biāo)來(lái)定義,要在光柵顯示器上顯示一條線段,必須先將兩個(gè)端點(diǎn)投影到整數(shù)屏幕坐標(biāo),并確定離兩端點(diǎn)間的直線路徑最近的像素位置,將顏色值賦予幀緩存中的對(duì)應(yīng)位置。這一過(guò)程將一條連續(xù)的線段離散為一組整數(shù)光柵位置。一般而言,這些位置是實(shí)際線段路徑的逼近。如計(jì)算出的直線位置(10.48,20.51),轉(zhuǎn)換為像素位置為(10,21)。坐標(biāo)值舍入到整數(shù),使線段呈鋸齒狀,這就是走樣。光柵化特有的鋸齒現(xiàn)象在低分辨率系統(tǒng)中特別明顯,在高分辨率系統(tǒng)中可以得到改善。平滑光柵線段的有效方法是反走樣技術(shù)。第12頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月直線段的掃描轉(zhuǎn)換算法直線的掃描轉(zhuǎn)換:根據(jù)直線的幾何特征,可確定最佳逼近于該直線的一組象素,并且按掃描線順序,對(duì)這些象素進(jìn)行寫操作。兩種常用算法:數(shù)值微分法(DDA)Bresenham算法。第13頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月數(shù)字微分法基本思想:根據(jù)線段斜率的不同,在某個(gè)坐標(biāo)軸上以單位間隔對(duì)線段采樣,在另一個(gè)坐標(biāo)軸上確定最靠近線段的對(duì)應(yīng)整數(shù)值。已知過(guò)端點(diǎn)P0(x0,y0),P1(x1,y1)的直線段L的方程為:

y=kx+b直線斜率為當(dāng)斜率的絕對(duì)值小于1時(shí),從x的左端點(diǎn)x0開(kāi)始,向x的右端點(diǎn)逐步遞增。步長(zhǎng)=1(象素單位),計(jì)算相應(yīng)的y坐標(biāo)y=kx+b;取象素點(diǎn)(x,round(y))作為當(dāng)前點(diǎn)的坐標(biāo)。第14頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月由直線方程可得下一個(gè)采樣點(diǎn)的y坐標(biāo)為:yi+1=kxi+1+b

=kxi+b+k

x =yi+k

x

當(dāng)

x=1時(shí); yi+1=yi+k

即:當(dāng)x每遞增1,y遞增k(即直線斜率);注意上述分析的算法僅適用于

k

≤1的情形。在此情況下,x每增加1,y最多增加1。當(dāng)

k

1時(shí),必須把x,y的地位互換:xi+1=xi+1/b該算法能在有限的線段長(zhǎng)度內(nèi),根據(jù)斜率的不同合理確定盡可能多的像素來(lái)逼近該直線段。DDA算法計(jì)算像素的位置比直接使用直線方程計(jì)算的速度要快,它利用光柵特性消除了直線方程中的乘法,在x或y方向使用合適的增量,在直線路徑上逐步得到各像素的位置。但在浮點(diǎn)增量的連續(xù)累加中,取整誤差的積累使得對(duì)于較長(zhǎng)線段所得到的像素位置偏離實(shí)際線段,且該過(guò)程中的取整操作和浮點(diǎn)運(yùn)算仍然十分耗時(shí)。促使人們考慮既能用于直線,又能用于曲線的更通用的掃描線算法。第15頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月例:畫直線段P0(0,0)--P1(5,2)k=0.4

xint(y+0.5)y+0.50 0 01 0 0.4+0.52 1 0.8+0.5 3 1 1.2+0.54 2 1.6+0.55 2 2.0+0.5第16頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月Bresenham算法Bresenham畫線算法是一種精確而有效的光柵線生成算法,該算法還可用于圓和其它曲線。如下圖,首先考慮斜率小于1的直線的掃描轉(zhuǎn)換過(guò)程,沿線段路徑的像素位置由以單位x間隔的采樣來(lái)確定。從給定線段的左端點(diǎn)(x0,y0)開(kāi)始,逐步處理每個(gè)后繼列(x位置),并在其掃描線y值最接近線段的像素上繪出一點(diǎn)。下圖顯示了這個(gè)過(guò)程的第k步。假設(shè)已經(jīng)決定要顯示的像素在(xk,yk),那么下一步需要確定在列xk+1=xk+1上繪制那個(gè)像素,是在位置(xk+1,yk),還是在(xk+1,yk+1)。從(xk,yk)像素開(kāi)始,繪制斜率0<m<1的直線的屏幕局部第17頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月在采樣位置xk+1,用dlower和dupper來(lái)表示兩個(gè)像素與直線段路徑的垂直偏移。直線段上像素列位置處的y坐標(biāo)為:y=m(xk+1)+b則:dlower=y-yk

=m(xk+1)+b-yk

dupper=(yk+1)-y=yk+1-m(xk+1)-b要確定兩像素中哪一個(gè)更接近線段路徑,需要測(cè)試這兩個(gè)像素偏移的差:

dlower-dupper=2m(xk+1)-2yk++2b-1在采樣位置xk+1處,像素位置到直線上y坐標(biāo)之間的垂直距離第18頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月設(shè)

y和

x分別為兩端點(diǎn)的垂直和水平偏移量,則m=y/x,定義決策參數(shù)pk為:

pk=x(dlower-dupper)

=2yxk-2

xyk+c3-1

其中c=2y+

x(2b-1),pk的符號(hào)與dlower-dupper的符號(hào)相同(此例中x>0

)。假如yk處的像素比yk+1的像素更接近于線段(即dlower<dupper),那么參數(shù)pk是負(fù)的,此時(shí)繪制下面的像素,反之,繪制上面的像素??梢岳眠f增整數(shù)運(yùn)算得到后繼的決策參數(shù)值。在k+1步,可得決策參數(shù)為:pk+1=2yxk+1-2

xyk+1+c3-2將兩式相減,可得:

pk+1

-pk=2y(xk+1-xk

)-2

x(yk+1

-yk)但xk+1=xk+1,因而pk+1=pk+2y-2

x(yk+1

-yk)其中yk+1

-yk取0或1,取決于參數(shù)pk的符號(hào)。決策參數(shù)的遞歸運(yùn)算在線段的坐標(biāo)端點(diǎn)開(kāi)始的每個(gè)整數(shù)x位置進(jìn)行,起始像素位置(x0,y0)的第一個(gè)參數(shù)p0由式3-1及m=y/x可得:p0=2y-

x遞推時(shí),僅進(jìn)行兩個(gè)常量2y及2y-2

x之間的整數(shù)加減。第19頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月正斜率小于1的線段的Bresenham畫線算法的主要步驟概括如下:(1)輸入線段的兩個(gè)端點(diǎn),并將左端點(diǎn)儲(chǔ)存在(x0,y0)中;(2)將(x0,y0)裝入幀緩存,畫出第一個(gè)點(diǎn);(3)計(jì)算常量x、y、2y和2y-2

x,并得到?jīng)Q策參數(shù)的第一個(gè)值;p0=2y-

x(4)從k=0開(kāi)始,在線段路徑的每個(gè)xk處,進(jìn)行下列檢測(cè):如果pk<0,下一個(gè)要繪制的點(diǎn)是(xk+1,yk),并且pk+1=pk+2y否則,下一個(gè)要繪制的點(diǎn)是(xk+1,yk+1),并且

pk+1=pk+2y-2

x(5)重復(fù)步驟4,共x-1次。當(dāng)斜率

1時(shí),也必須把x,y的地位互換。例:會(huì)直一條線段,端點(diǎn)為(20,10)和(30,18)。該線段的斜率為0.8,且

x=10,y=8初始決策參數(shù)為:p0=2y-

x=6后繼決策參數(shù)的增量為:2y=16,2y-2

x=-4繪制初始點(diǎn)(x0,y0)=(20,10),并根據(jù)決策參數(shù)確定后即像素點(diǎn)的位置為:第20頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月kpk(xk+1,yk+1)06(21,11)12(22,12)2-2(23,12)314(24,13)410(25,14)kpk(xk+1,yk+1)56(26,15)62(27,16)7-2(28,16)814(29,17)910(30,18)沿端點(diǎn)(20,10)和(30,18)用Bresenham畫線算法繪制的像素點(diǎn)第21頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月線的屬性直線段的屬性包括顏色、線寬和線型。OpenGL中,線的顏色用圖元的顏色函數(shù)設(shè)定,而線寬和線型則用單獨(dú)的線函數(shù)選擇。例3-4(LINESW):用glLineWidth()函數(shù)設(shè)置線寬,以不同的寬度繪直線。還可以用點(diǎn)線或虛線模式繪直線,稱為點(diǎn)畫線glEnable(GL_LINE_STIPPLE)啟用點(diǎn)畫線功能glLineStipple(GLintfactor,GLushortpattern)創(chuàng)建點(diǎn)畫模式。pattern是一個(gè)16位的值,指定了一個(gè)模式,它的每一位都表示線段的一部分,處于打開(kāi)或關(guān)閉狀態(tài),缺省情況下,每位對(duì)應(yīng)一個(gè)像素。factor作為一個(gè)乘法因子,用于增加模式的寬度。例3-5(LSTIPPLE):顯示加寬的點(diǎn)畫線第22頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月3.4圓的生成算法圓的方程為:(x-xc)2+(y-yc)2=r23.4.1利用這個(gè)方程,可以沿x軸從xc-r到xc+r以單位步長(zhǎng)計(jì)算對(duì)應(yīng)的y值,從而得到圓周上每點(diǎn)的位置:y=yc±(r2-(xc-x)2)1/23.4.2該方法的每一步包含很大的計(jì)算量,而且所繪制像素的間距不一致,如下圖所示。我們可以在圓斜率的絕對(duì)值大于1后,交換x和y(即步進(jìn)y值并計(jì)算x值)來(lái)調(diào)整間距,但增加了計(jì)算量和處理過(guò)程??傊?,該方法不是一種理想的畫圓方法。

用方程3.4.2繪制的正半圓第23頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月另一種消除不等間距的方法是使用極坐標(biāo)r和

來(lái)計(jì)算圓周上的點(diǎn),圓的極坐標(biāo)方程為:x=xc+rcos

y=yc+rsin使用上述方法以固定角度為步長(zhǎng)可以生成等間距得點(diǎn)來(lái)繪制圓,盡管利用極坐標(biāo)能生成等距點(diǎn),但三角函數(shù)的計(jì)算十分耗時(shí)??梢岳脠A的對(duì)稱性減少計(jì)算量,圓的形狀在每個(gè)象限中是相似的,如果確定了圓在第一象限中的位置,則可以生成圓在第二象限的部分,因?yàn)閳A相對(duì)于y軸是對(duì)成的。根據(jù)圓相對(duì)于x軸的對(duì)稱性,由第一象限和第二象限中的圓弧,可以得到第三象限和第四象限中的圓弧。在八分圓之間也有對(duì)稱性,一個(gè)象限中相鄰八分圓的圓弧對(duì)于45°直線是對(duì)稱的,如下圖。圖中八分之一圓上的一點(diǎn)(x,y)可映射到其它7個(gè)八分圓的點(diǎn)。利用圓的對(duì)稱性,可由1個(gè)八分圓上的點(diǎn),映射到其余7個(gè)八分圓上的點(diǎn)第24頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月利用圓的對(duì)稱性,僅需計(jì)算從x=0到x=y這段圓弧的點(diǎn)就可得到整個(gè)圓的所有像素位置。在該八分圓中,圓弧斜率的絕對(duì)值≤1,x=0時(shí)的斜率為0,x=y時(shí)圓弧的斜率為-1.0。使用對(duì)稱性及圓的方程來(lái)確定圓周上的像素位置,仍然需要大量的計(jì)算,更有效地畫圓算法是采用類似Bresenham畫線算法,通過(guò)設(shè)定在每一步采樣步驟中尋找最接近圓周像素的決策參數(shù)。但圓的方程是非線性的,包含平方運(yùn)算,一個(gè)避免平方運(yùn)算的方法是:檢驗(yàn)兩像素間的中點(diǎn)位置是在圓邊界之內(nèi)還是之外。中點(diǎn)畫圓算法:對(duì)于中心為(xc,yc)、半徑為r的圓,先計(jì)算圓心在(0,0)的圓的像素位置,然后通過(guò)將xc加到x且yc加到y(tǒng),將圓平移到真正位置。在第一象限,圓弧段從x=0到x=y,曲線的斜率從0變到-1.0??梢栽谠摪朔謭A上的正x方向取單位步長(zhǎng),并使用決策參數(shù)來(lái)確定每一步兩個(gè)可能的y位置中,哪一個(gè)更接近于圓的位置,其余7個(gè)八分圓中的位置可由對(duì)稱性得到。定義圓函數(shù):

f(x,y)=x2+y2-r2任何點(diǎn)的相對(duì)位置可由圓函數(shù)的符號(hào)來(lái)決定:第25頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月<0,如果(x,y)位于圓內(nèi)f(x,y)=0,如果(x,y)位于圓上>0,如果(x,y)位于圓外圓函數(shù)即為決策參數(shù),下圖給出了采樣位置xk+1上兩個(gè)候選像素間的中點(diǎn)。

圓周上采樣位置xk+1上候選像素間的中點(diǎn)假設(shè)剛在(xk,yk)繪制了一個(gè)像素,下一步需要確定是像素(xk+1,yk)還是像素(xk+1,yk-1)更接近于圓,在兩像素的中點(diǎn)求決策參數(shù)的值:

pk=f(xk+1,yk-1/2)=(xk+1)2+(yk-1/2)2-r2假若pk<0,則該中點(diǎn)位于圓內(nèi),掃描線yk上的像素接近于圓周邊界。否則該中點(diǎn)位于圓外或圓周上,選擇掃描線yk-1的像素。第26頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月后續(xù)的決策參數(shù)可以使用增量運(yùn)算得到,如對(duì)采樣位置xk+1=xk+2處的圓函數(shù)求值,可以得到下一個(gè)決策參數(shù)的循環(huán)表達(dá)式:

pk+1=f(xk+1+1,yk+1-1/2)=[(xk+1)+1]2+(yk+1-1/2)2-r2=pk+2(xk+1)+(y2k+1-y2k)-(yk+1-yk)+1其中,yk+1是yk或yk-1,取決于pk的符號(hào)。若pk為負(fù),則yk+1=yk,pk+1的增量為2xk+1+1;若pk為正,則yk+1=yk-1,pk+1的增量為2xk+1+1-2yk+12xk+1和2yk+1的求值也可以通過(guò)增量的方式求得:2xk+1=2xk+22yk+1=2yk-2在起始位置(0,r)處,這兩項(xiàng)的初始值分別為0和2r。在起始位置(0,r)處,初始決策參數(shù)為:p0=f(1,r-1/2)=1+(r-1/2)2-r2=5/4-r若以整數(shù)屏幕坐標(biāo)為參數(shù),則中點(diǎn)方法使用整數(shù)加減來(lái)計(jì)算圓周的像素位置。第27頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月中點(diǎn)畫圓算法的步驟:(1)輸入圓半徑r和圓心(xc,yc),并得到圓周(圓心在原點(diǎn))上的第一個(gè)點(diǎn):(x0,y0)=(0,r)(2)計(jì)算決策參數(shù)的初始值:

p0=5/4-r(3)在每個(gè)xk位置,從k=0開(kāi)始,計(jì)算決策參數(shù),若pk<0,則圓周下一像素位置為(xk+1,yk),并且

pk+1=pk+2xk+1+1否則圓的下一點(diǎn)為(xk+1,yk-1),并且

pk+1=pk+2xk+1+1-2yk+1其中,2xk+1=2xk+2且2yk+1=2yk-2(4)確定其它7個(gè)八分圓中的對(duì)稱點(diǎn)。(5)將每個(gè)計(jì)算出來(lái)的像素位置(x,y)平移到圓心在(xc,yc)的圓周上,并繪出各點(diǎn)(x+xc,y+yc)。(6)重復(fù)步驟3到步驟5,直至x≥y。第28頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月例,使用中點(diǎn)畫圓算法畫圓給定圓半徑r=10,確定在第一象限從x=0到x=y沿八分圓的各像素點(diǎn)位置。決策參數(shù)的初始值為:p0=1-r=-9對(duì)于中心在原點(diǎn)的圓,初始點(diǎn)(x0,y0)=(0,10),決策參數(shù)的初始增量值:2x0=0,2y0=20使用中點(diǎn)畫圓法計(jì)算的后續(xù)決策參數(shù)值及像素位置如下:kpkxk+1,yk+12xk+1,2yk+10-6(1,10)2201-6(2,10)4202-1(3,10)62036(4,9)8184-3(5,9)101858(6,8)121665(7,7)1414第29頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月用中點(diǎn)畫圓法得到的像素位置(空心圓為第一象限的對(duì)稱位置)第30頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月使用折線來(lái)逼近曲線常見(jiàn)的曲線除圓以外,還有橢圓、圓錐曲線、三角和指數(shù)函數(shù)、樣條曲線等。生成圓和橢圓等基本曲線的函數(shù)并未作為圖元包含在OpenGL的核心庫(kù)中,但核心庫(kù)中包含了Bezier樣條曲線,該曲線是由一組離散點(diǎn)定義的多項(xiàng)式。顯示曲線的簡(jiǎn)單方法是使用直線段來(lái)逼近曲線,僅需確定一組曲線上的點(diǎn)并將它們連接成一組直線段。折線中的線段越多,曲線越平滑。第31頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月3.5填充區(qū)圖元圖形學(xué)中常常需要用一種顏色或某種圖案來(lái)填充一個(gè)區(qū)域,盡管有可能使用各種形狀,但圖形庫(kù)一般不支持任意的填充形狀,多數(shù)庫(kù)函數(shù)要求填充區(qū)為多邊形。多邊形是由三個(gè)或更多的頂點(diǎn)連接而成的封閉圖形,由于多邊形的邊界為直線段,因而比其他形狀更容易處理。可將曲線轉(zhuǎn)換為由分段折線構(gòu)成的多邊形,曲面也可以用一系列多邊形面片來(lái)逼近。如果一個(gè)多邊形的所有內(nèi)角均小于180°,則該多邊形為凸(convex)多邊形。等價(jià)定義:它的內(nèi)部完全在它的任一邊及其延長(zhǎng)線的一側(cè)。如果任意兩點(diǎn)位于凸多邊形的內(nèi)部,則其連線上的任一點(diǎn)也在凸多邊形的內(nèi)部。不是凸多邊形的多邊形稱為凹(concave)多邊形。退化多邊形是指有共線或重合頂點(diǎn)的多邊形,共線的頂點(diǎn)生成一條線段,重疊的頂點(diǎn)可以生成多余線段、重疊邊或長(zhǎng)度為0的邊。為了軟件的魯棒性,圖形軟件可以拒絕退化或非平面的多邊形。凹多邊形也會(huì)產(chǎn)生一些問(wèn)題,對(duì)凹多邊形的填充及其它處理比較復(fù)雜,常常將凹多邊形分割成一組凸多邊形以提高效率。第32頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月可以為多邊形的每一條邊建立一個(gè)向量,用相鄰邊的叉積來(lái)測(cè)試凸凹性,凸多邊形的所有向量叉積均同號(hào),如果某些叉積為正而另一些為負(fù),則為凹多邊形。識(shí)別凹多邊形的另一個(gè)方法是觀察多邊形頂點(diǎn)位置與每條邊延長(zhǎng)線的關(guān)系。如果有些頂點(diǎn)在某一延長(zhǎng)線的一側(cè)而有些頂點(diǎn)在另一側(cè),則為凹多邊形。多邊形的填充算法分為掃描線填充算法和種子填充算法。掃描線的含義來(lái)源于光柵顯示器,對(duì)屏幕上的每個(gè)像素點(diǎn),按從上到下,從左到右的順序進(jìn)行顯示,水平方向從左到右每掃描一行,就是一條y方向的掃描線,同理,從上到下也能形成x方向的掃描線。掃描線填充算法的原理是:待填充區(qū)域按y方向(或x方向)掃描線的順序,計(jì)算掃描線與多邊形的相交區(qū)間,再用指定的顏色填充這些區(qū)間的像素,區(qū)間的端點(diǎn)可以通過(guò)計(jì)算掃描線與多邊形邊界的交點(diǎn)求得。第33頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月通用多邊形的掃描線填充算法下圖給出了多邊形區(qū)域?qū)嵭奶畛涞膾呙杈€過(guò)程。對(duì)每一條與多邊形相交的掃描線,與邊的交點(diǎn)從左到右排序,且將每一對(duì)交點(diǎn)之間的像素位置包括這對(duì)像素在內(nèi),設(shè)定為指定顏色,本例中與邊界的四個(gè)交點(diǎn)定義了兩段內(nèi)部像素:從x=10到14的5個(gè)像素,以及從x=18到x=24的7個(gè)像素。如果是用圖案填充多邊形,則沿一條掃描線的每一個(gè)像素顏色由與圖案重疊的位置確定。穿過(guò)多邊形區(qū)域的掃描線上的內(nèi)部像素第34頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月有時(shí)情況比較復(fù)雜,當(dāng)一條掃描線經(jīng)過(guò)多邊形的一個(gè)頂點(diǎn)時(shí),掃描線在該頂點(diǎn)處與多邊形的兩條邊相交,這種情況可能導(dǎo)致在這條掃描線上的交點(diǎn)要增加兩個(gè)點(diǎn)。下圖給出了在頂點(diǎn)處與多邊形相交的兩條掃描線。掃描線y’與偶數(shù)條邊相交,必須將該頂點(diǎn)處的交點(diǎn)作為2個(gè)交點(diǎn),才能正確標(biāo)識(shí)該掃描線上的兩對(duì)交點(diǎn)之間為內(nèi)部像素段。掃描線y與多邊形的5條邊相交,必須將該頂點(diǎn)除的交點(diǎn)作為1個(gè)交點(diǎn),才能正確標(biāo)識(shí)該掃描線上的兩對(duì)交點(diǎn)之間為內(nèi)部像素段。通過(guò)觀察相交邊相對(duì)于掃描線的位置,可以發(fā)現(xiàn)掃描線y和掃描線y’間的拓?fù)洳町?。?duì)于掃描線y,共享一個(gè)頂點(diǎn)的兩條相交邊位于掃描線的兩側(cè),對(duì)于掃描線y’,兩條相交邊位于掃描線的同一側(cè)。掃描線與多邊形頂點(diǎn)相交,y’生成奇數(shù)個(gè)交點(diǎn),y’生成偶數(shù)個(gè)交點(diǎn)第35頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月可以通過(guò)順時(shí)針或逆時(shí)針?lè)较騺?lái)搜索多邊形邊界,并觀察從一條邊移動(dòng)到另一條邊時(shí)頂點(diǎn)y坐標(biāo)的相對(duì)變化來(lái)判別這個(gè)點(diǎn)。假如兩條相鄰邊的三個(gè)端點(diǎn)y坐標(biāo)值單調(diào)遞增或遞減,那么對(duì)于任何穿過(guò)該頂點(diǎn)的掃描線,必須將該相交頂點(diǎn)(中間的共享頂點(diǎn))計(jì)為1個(gè)交點(diǎn)。否則,該相交頂點(diǎn)(中間的共享頂點(diǎn))即為多邊形邊界上的一個(gè)局部極值,(極大或極小),須將該相交頂點(diǎn)計(jì)為2個(gè)交點(diǎn)凸多邊形的掃描線填充對(duì)于凸多邊形,掃描線填充過(guò)程可以簡(jiǎn)化,每一條掃描線與多邊形至多有兩個(gè)交點(diǎn),可以使用坐標(biāo)范圍來(lái)確定哪些邊與掃描線相交,當(dāng)掃描線與單個(gè)頂點(diǎn)相交時(shí),僅繪出該點(diǎn)本身,當(dāng)有兩個(gè)交點(diǎn)時(shí),兩交點(diǎn)之間的部分都是多邊形內(nèi)部的點(diǎn)。第36頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月種子填充算法區(qū)域填充的另一種方法是從區(qū)域的一個(gè)內(nèi)部點(diǎn)開(kāi)始,由內(nèi)向外逐點(diǎn)繪制直到邊界??梢允褂脝我活伾蛞粋€(gè)圖案來(lái)填充一個(gè)區(qū)域。假如邊界是以單一顏色指定的,則填充算法可逐個(gè)像素地向外處理,直至遇到邊界顏色。該算法從一個(gè)內(nèi)點(diǎn)開(kāi)始檢測(cè)相鄰位置的顏色,若檢測(cè)位置不是該邊界顏色,就將它設(shè)置成邊界顏色,并再檢測(cè)其相鄰位置,這個(gè)過(guò)程持續(xù)到檢測(cè)完區(qū)域邊界顏色范圍內(nèi)的所有像素為止。區(qū)域填充算法要求區(qū)域是連通的。從一個(gè)當(dāng)前位置檢測(cè)其相鄰像素有兩種方法:4-連通和8-連通。4-連通即檢測(cè)當(dāng)前位置的上、下、左、右4個(gè)方向的相鄰像素,8-連通即檢測(cè)當(dāng)前位置的上、下、左、右、左上、右上、左下及右下8個(gè)方向的相鄰像素。4-連通8-連通4-連通區(qū)域8-連通區(qū)域第37頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月第38頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月圖案填充可以將一個(gè)區(qū)域填充為單一顏色,也可以用某種圖案進(jìn)行填充,也可以不填充而只繪制其邊界。對(duì)多邊形可以使用不同顏色、線寬和線型繪制其邊框,還可以為區(qū)域的前向面和后向面設(shè)置不同的顯示屬性。填充圖案可以用一個(gè)為不同位置指定不同顏色的矩形顏色陣列來(lái)給出,即一個(gè)填充圖案可當(dāng)作一個(gè)點(diǎn)陣來(lái)指定,其中每一位置指定一種顏色。描述填充圖案的矩陣是一個(gè)應(yīng)用于顯示區(qū)域的掩模。有些圖形系統(tǒng)可以設(shè)置掩模的初始位置,從該初始位置開(kāi)始,掩模在水平方向和垂直方向反復(fù)填充直到整個(gè)區(qū)域都填滿無(wú)重疊的掩模。這種用矩形圖案填充一個(gè)區(qū)域的處理稱為平鋪,而矩形填充圖案有時(shí)也稱為平鋪圖案。填充圖案的起始位置可設(shè)定在填充區(qū)內(nèi)的任意位置,有些軟件包將顯示窗口的坐標(biāo)原點(diǎn)作為圖案的起始位置。第39頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月用OpenGL繪制填充區(qū)繪線圖元時(shí),用GL_LINE_LOOP參數(shù)可以繪制封閉的多邊形,得到的是線框圖,還可以用顏色對(duì)多邊形進(jìn)行填充。最簡(jiǎn)單的多邊形是三角形,下面的代碼繪制兩個(gè)三角形,并用當(dāng)前顏色進(jìn)行填充,如下圖。glBegin(GL_TRIANGLES)glVertex2f(0.0f,0.0f);//V0glVertex2f(25.0f,25.0f);//V1glVertex2f(50.0f,0.0f);//V2glVertex2f(-50.0f,0.0f);//V3glVertex2f(-75.0f,50.0f);//V4glVertex2f(-25.0f,0.0f);//V5glEnd;兩個(gè)使用GL_TRIANGLES繪制的三角形第40頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月三角形的環(huán)繞方向上圖中標(biāo)出了連接三角形頂點(diǎn)的邊線的箭頭,第一個(gè)三角形邊線的走向依次從V0到V1,然后再到V2,最后回到V0,這個(gè)路徑是由頂點(diǎn)的指定次序決定的,呈順時(shí)針?lè)较蚺帕校诙€(gè)三角形也呈順時(shí)針排列。頂點(diǎn)的指定次序以及排列方向稱為環(huán)繞(winding)。上圖中的三角形具有順時(shí)針?lè)较虻沫h(huán)繞,如果將左邊的三角形交換V4和V5的位置,就得到一個(gè)逆時(shí)針?lè)较虻沫h(huán)繞,如下圖。兩個(gè)具有不同環(huán)繞的三角形第41頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月缺省情況下,OpenGL認(rèn)為逆時(shí)針的環(huán)繞方向是多邊形的正面,因此上圖左側(cè)的三角形是這個(gè)三角形的正面,右側(cè)的三角形是那個(gè)三角形的背面。一個(gè)多邊形有兩個(gè)面,正面和背面,可以給正面和背面設(shè)定不同的顏色及其它屬性??梢哉{(diào)用函數(shù)glFlortFace(GL_CW)指定多邊形的正面和背面,參數(shù)GL_CW定義順時(shí)針環(huán)繞的多邊形為正面,參數(shù)GL_CCW定義逆時(shí)針環(huán)繞的多邊形為正面。三角條帶:對(duì)于許多表面和形狀,有時(shí)需要使用GL_TRIANGLE_STRIP圖元繪制一串相連的三角形。下圖顯示了一組由5個(gè)頂點(diǎn)構(gòu)成的3個(gè)三角形的繪制過(guò)程,可以看出,這些頂點(diǎn)并不是按照他們的指定順序遍歷的,原因是為了保持每個(gè)三角形的環(huán)繞方向一致。它的連接次序是V0、V1、V2,接著是V2、V1、V3,然后是V2、V3、V4,依此類推。三角條帶的環(huán)繞方向第42頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月三角扇形:還可以使用參數(shù)GL_TRIANGLE_FAN來(lái)創(chuàng)建一組圍繞一個(gè)中心點(diǎn)的相連三角形,稱為三角扇形。下圖為由4個(gè)頂點(diǎn)所產(chǎn)生的包括3個(gè)三角形的三角扇形。在指定前3個(gè)頂點(diǎn)表示第一個(gè)三角形之后,后續(xù)的頂點(diǎn)和原點(diǎn)(V0)以及前面最近鄰的那個(gè)頂點(diǎn)(Vn-1)組成下一個(gè)三角形。有4個(gè)頂點(diǎn)構(gòu)成的三角扇形第43頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月創(chuàng)建實(shí)心物體例3-6(TRIANGLE)使用兩個(gè)三角扇形創(chuàng)建一個(gè)實(shí)心的圓錐,第一個(gè)三角扇形圍成這個(gè)圓錐的側(cè)面,將圓錐的頂點(diǎn)作為第一個(gè)頂點(diǎn),剩下的頂點(diǎn)沿z軸向下分布在圓錐底面的圓周上。第二個(gè)三角扇形圍成圓錐的底面,是一個(gè)圓,位于xy平面上。通過(guò)對(duì)三角形交替地著以綠色和紅色,可以清楚地顯示各個(gè)三角形。創(chuàng)建圓錐側(cè)面的代碼如下:glBegin(GL_TRIANGLE_FAN); glVertex3f(0.0f,0.0f,75.0f); for(angle=0.0f;angle<(2.0f*GL_PI);angle+=(GL_PI/8.0f)) { //Calculatexandypositionofthenextvertex x=50.0f*sin(angle); y=50.0f*cos(angle); //Alternatecolorbetweenredandgreen if((iPivot%2)==0) glColor3f(0.0f,1.0f,0.0f); else glColor3f(1.0f,0.0f,0.0f); //Incrementpivottochangecolornexttime iPivot++; //Specifythenextvertexforthetrianglefan glVertex2f(x,y); }glEnd();第44頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月創(chuàng)建圓錐底面的代碼如下glBegin(GL_TRIANGLE_FAN);//CenteroffanisattheoriginglVertex2f(0.0f,0.0f);for(angle=0.0f;angle<(2.0f*GL_PI);angle+=(GL_PI/8.0f)){//Calculatexandypositionofthenextvertexx=50.0f*sin(angle);y=50.0f*cos(angle);

//Alternatecolorbetweenredandgreenif((iPivot%2)==0)glColor3f(0.0f,1.0f,0.0f);else glColor3f(1.0f,0.0f,0.0f);

//IncrementpivottochangecolornexttimeiPivot++;//SpecifythenextvertexforthetrianglefanglVertex2f(x,y);}//DonedrawingthefanthatcoversthebottomglEnd();可用右鍵彈出菜單第45頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月設(shè)置多邊形的顏色上例中我們給多邊形設(shè)置了不同的顏色,顏色實(shí)際上是以頂點(diǎn)為單位指定的。而不是以多邊形為單位,最后一個(gè)頂點(diǎn)的顏色作為整個(gè)多邊形的填充顏色。代碼:glShadeModel(GL_FLAT);指定用當(dāng)前顏色填充這個(gè)多邊形,代碼:if((iPivot%2)==0) glColor3f(0.0f,1.0f,0.0f);else glColor3f(1.0f,0.0f,0.0f);在指定下一個(gè)頂點(diǎn)前將當(dāng)前顏色修改為紅色或綠色。第46頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月3.6字符圖元圖形顯示中常包括文字信息,包括字母、數(shù)字或其他字符等。字體是指一組按照特定尺寸和格式的模板字符樣式。字體有兩種不同的表示方法,第一種稱為位圖字體(或光柵字體),每個(gè)字符都由一個(gè)二值形式的點(diǎn)陣圖案表示,如圖3.6a,由于所有字符都以完成掃描轉(zhuǎn)換,繪制一個(gè)字符只需將該字符的位圖直接映射或復(fù)制到幀緩存的指定位置,值為1的位對(duì)應(yīng)的像素位置將用當(dāng)前顏色進(jìn)行顯示。盡管可以由一組點(diǎn)陣字符生成不同尺寸以及類似粗體、斜體等其它字體,但效果并不好。第二種表示方法稱為輪廓字體,又稱筆畫字體或向量字體。每個(gè)字符的外形輪廓均由直線和曲線段來(lái)描述,如圖3.6b,字符輪廓的內(nèi)部按填充區(qū)進(jìn)行掃描轉(zhuǎn)換處理。與位圖字符相比,輪廓字體在進(jìn)行放大時(shí)其字符形狀不會(huì)變形。第47頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月第48頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月OpenGL字符函數(shù)OpenGL基本庫(kù)僅為顯示單個(gè)字符和文字串提供基本支持。GLUT中預(yù)定義了一些字庫(kù),可以顯示位圖和輪廓字體。調(diào)用函數(shù)glutBitmapCharacter(font,character)以當(dāng)前光柵位置作為左下角顯示GLUT位圖字符。參數(shù)font用GLUT符號(hào)常量賦值,用來(lái)指定一特定字符集,參數(shù)character賦以ASCII碼或其它要顯示的字符。調(diào)用函數(shù)glutStrokeCharacter(font,character)顯示GLUT輪廓字符第49頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月3.7反走樣在圖形光柵化的過(guò)程中由于圖元的坐標(biāo)點(diǎn)離散化為整數(shù)像素位置,因此光柵化后生成的圖元具有鋸齒形或階梯狀的外觀。當(dāng)我們把對(duì)象的連續(xù)表示(無(wú)限的分辨率)變換成對(duì)象的離散表示時(shí),不可避免地會(huì)出現(xiàn)此類誤差,這種由于低頻采樣(不充分采樣)而造成的圖形失真稱為走樣(aliasing)。另一個(gè)不太引人注目的走樣現(xiàn)象是不同走向的線段具有不同的亮度,雖然所有線段都用同樣的顏色亮度來(lái)顯示,但一條斜線看上去要比一條水平或垂直線暗一些。這一現(xiàn)象的原因可由圖3.7.1解釋,圖中水平線上的像素間的距離為一個(gè)單位長(zhǎng)度,而斜線上的像素間的距離大約為1.414個(gè)單位長(zhǎng)度,密度上的帶來(lái)亮度感覺(jué)上的差異。如果一個(gè)物體沒(méi)有與像素柵格對(duì)齊,或者不能與像素柵格吻合,會(huì)出現(xiàn)籬柵問(wèn)題。圖3.7.2(a)表示一道樁與樁之間的距離并非像素間距整數(shù)倍的籬柵。將該籬柵掃描轉(zhuǎn)換后樁的端點(diǎn)都要向像素位置靠攏對(duì)齊,結(jié)果是樁之間的距離不再均勻相等圖3.7.2(b)。此現(xiàn)象有時(shí)稱為局部走樣,這時(shí)籬柵的總長(zhǎng)度基本上是正確的。若要保持樁距均勻,籬柵的總長(zhǎng)度就會(huì)明顯失真圖3.7.2(c),這一現(xiàn)象有時(shí)稱為總體走樣。第50頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月反走樣盡管數(shù)學(xué)上的線段只有長(zhǎng)度沒(méi)有寬度,但光柵化后的線段為了可見(jiàn)性,必須有一個(gè)寬度,幀緩存以像素為最小單位,若一條理想的線段在幀緩存里的寬度為一個(gè)像素,當(dāng)仔細(xì)觀察理想的一個(gè)像素寬的直線時(shí),會(huì)發(fā)現(xiàn)該線段只是部分覆蓋了1像素大小的方形區(qū)域,如圖3.7.3。第51頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月第52頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月反走樣提高顯示器的分辨率只能減輕而不能消除鋸齒問(wèn)題。第53頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月反走樣對(duì)于能顯示兩級(jí)以上亮度的光柵系統(tǒng),可以采用反走樣方法適當(dāng)?shù)匦薷难貓D元邊界的像素亮度,平滑邊界,減小鋸齒狀、斑塊狀的亮度差異,改善顯示效果。一種簡(jiǎn)單、直接的反走樣方法,就是把屏幕看成由比實(shí)際更細(xì)的網(wǎng)格所覆蓋,從而增加采樣頻率,然后根據(jù)這種更細(xì)網(wǎng)格,使用采樣點(diǎn)來(lái)確定每個(gè)屏幕像素的合適亮度。這種在高分辨率下對(duì)對(duì)象進(jìn)行采樣并在較低分辨率上顯示其結(jié)果的技術(shù)稱為過(guò)采樣(supersampling),也稱為后濾波(postfiltering)。另一種方法是通過(guò)計(jì)算待顯示的每個(gè)像素在對(duì)象上的覆蓋區(qū)域來(lái)確定像素的亮度。計(jì)算覆蓋區(qū)域的反走樣稱為區(qū)域采樣(areasampling),也稱為前濾波(prefiltering)。還可以通過(guò)移動(dòng)像素區(qū)域的顯示位置而實(shí)現(xiàn)反走樣,這種技術(shù)稱為像素移相(pixelphasing)。第54頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月前濾波與后濾波濾波的概念來(lái)源于信號(hào)處理領(lǐng)域。若將亮度作為信號(hào),則顏色均勻的、亮度緩慢變化的區(qū)域?qū)?yīng)于低頻部分,具有邊界清晰的、亮度快速變化的區(qū)域?qū)?yīng)于高頻部分。為了減少圖像空間里的線段與其它線段的參差不齊現(xiàn)象,希望將亮度的突然變化“抹平”,從信號(hào)處理角度來(lái)看,就是將高頻率的成分“過(guò)濾掉”。前濾波就是在采樣前對(duì)原始連續(xù)信號(hào)進(jìn)行處理直接獲取各個(gè)像素應(yīng)有的亮度(在采樣之前進(jìn)行濾波)。后濾波則首先從原始連續(xù)信號(hào)獲取離散采樣值,然后再用這些采樣值計(jì)算像素值(在采樣之后進(jìn)行濾波)。第55頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月區(qū)域采樣區(qū)域采樣屬于前濾波技術(shù),把一個(gè)柵格網(wǎng)疊放在需要柵格化的物體上,對(duì)于每一個(gè)與該物體相疊交的像素區(qū)域,計(jì)算該區(qū)域與物體疊交的百分比。該百分比決定了該像素的總體顏色中有多少成分來(lái)源于該物體,該像素區(qū)域與物體疊交的百分比越高,該物體對(duì)像素總體顏色的影響就越大。圖3.7.4a中用寬度為1個(gè)像素的長(zhǎng)方形區(qū)域來(lái)代表一條直線,該長(zhǎng)方形區(qū)域與每個(gè)與其疊交的像素的面積百分比通過(guò)解析方式算出。如果背景為黑色,直線為白色,計(jì)算所得的百分比可直接用來(lái)設(shè)定各像素的顏色(圖3.7.4b)。第56頁(yè),課件共65頁(yè),創(chuàng)作于2023年2月雖然圖3.7.4b所示經(jīng)過(guò)區(qū)域采樣得到的直線的離散逼近看起來(lái)有些“模糊”,但它不再有從物體顏色到背景顏色之間的突然過(guò)渡。而這種突然過(guò)渡是使

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論