李津 潘海梅
摘要:計(jì)算機(jī)圖形學(xué)作為一門本科專業(yè)選修課程,實(shí)驗(yàn)課程以C語(yǔ)言為主。隨著計(jì)算機(jī)編程語(yǔ)言的發(fā)展和普及,Python語(yǔ)言已成為重要的科研和開發(fā)工具。為提高學(xué)生對(duì)Python語(yǔ)言運(yùn)用的能力,設(shè)計(jì)一個(gè)基于Python語(yǔ)言的計(jì)算機(jī)圖形學(xué)實(shí)驗(yàn):二維紋理映射原理探究實(shí)驗(yàn)。實(shí)驗(yàn)的目的是將紋理圖案疊加到圖形的表面,增強(qiáng)圖形的細(xì)節(jié)信息。首先,將紋理圖案從二維空間映射到三維景物空間。在此基礎(chǔ)上,將紋理信息與物體表面在三維空間進(jìn)行插值映射。最后,將映射后的圖形映射回二維屏幕坐標(biāo)系中。本文將介紹算法原理并設(shè)計(jì)對(duì)應(yīng)的實(shí)驗(yàn)?;赑ython語(yǔ)言的圖形紋理映射實(shí)驗(yàn)可以幫助學(xué)生深刻理解并掌握計(jì)算機(jī)圖形學(xué)中紋理映射的相關(guān)理論知識(shí),強(qiáng)化學(xué)生運(yùn)用Python語(yǔ)言解決實(shí)際問(wèn)題的能力,從而增強(qiáng)學(xué)生的實(shí)踐能力、創(chuàng)新能力以及探索能力。
關(guān)鍵詞:計(jì)算機(jī)圖形學(xué);二維紋理映射;Catmull算法;Blinn算法;Python語(yǔ)言
計(jì)算機(jī)圖形學(xué)是計(jì)算機(jī)科學(xué)與技術(shù)、自動(dòng)化、軟件工程等專業(yè)中重要的專業(yè)選修課程,是目前計(jì)算機(jī)學(xué)科中最活躍的分支之一[1]。計(jì)算機(jī)圖形學(xué)不僅是計(jì)算機(jī)動(dòng)畫等應(yīng)用的理論基礎(chǔ),并服務(wù)于計(jì)算機(jī)輔助設(shè)計(jì)與制造、虛擬現(xiàn)實(shí)、增強(qiáng)現(xiàn)實(shí)等一系列產(chǎn)業(yè),并提供核心技術(shù)和算法支持[2]。計(jì)算機(jī)圖形學(xué)課程涉及大量數(shù)學(xué)知識(shí),同時(shí)需要扎實(shí)的編程基礎(chǔ),學(xué)習(xí)計(jì)算機(jī)圖形學(xué)是對(duì)基礎(chǔ)課程學(xué)習(xí)的綜合運(yùn)用。
隨著計(jì)算機(jī)技術(shù)的普及,越來(lái)越多非計(jì)算機(jī)專業(yè)的學(xué)生也需要使用編程語(yǔ)言來(lái)進(jìn)行科學(xué)技術(shù)、統(tǒng)計(jì)和繪圖等。Python作為極易入門的編程語(yǔ)言,具有簡(jiǎn)單易學(xué)、免費(fèi)開源、可移植性強(qiáng)等優(yōu)點(diǎn),非常適合學(xué)生在本科階段學(xué)習(xí)并熟練運(yùn)用。
為了幫助學(xué)生深入理解計(jì)算機(jī)圖形學(xué)中圖形紋理映射的相關(guān)知識(shí),做到理論學(xué)習(xí)與實(shí)踐相結(jié)合,提高學(xué)生對(duì)Python語(yǔ)言的實(shí)踐能力,并進(jìn)一步提高學(xué)生的學(xué)習(xí)興趣和創(chuàng)新能力,本文設(shè)計(jì)基于Python語(yǔ)言的二維圖形紋理映射實(shí)驗(yàn)。該實(shí)驗(yàn)適用于本科計(jì)算機(jī)圖形學(xué)課程中圖形紋理映射章節(jié)的實(shí)驗(yàn)教學(xué)。
1紋理映射相關(guān)知識(shí)元
在進(jìn)行圖形紋理映射實(shí)驗(yàn)之前,需要深入了解中斷相關(guān)的知識(shí)元,本文實(shí)驗(yàn)涉及二維圖形紋理映射,本節(jié)分別對(duì)這相關(guān)的知識(shí)元進(jìn)行了簡(jiǎn)述。
1.1紋理映射
紋理映射也稱紋理貼圖,它試圖通過(guò)一種合適的算法為待映射的模型表面上的每個(gè)三維頂點(diǎn)分配一個(gè)顏色值,從而達(dá)到將空間紋理圖案疊加到圖形的表面,增強(qiáng)圖形的細(xì)節(jié)信息的效果。
1.2?紋理映射基本算法
紋理映射算法的核心是確定屏幕像素中可見表面覆蓋的紋理區(qū)域,基于已知物體表面參數(shù)信息,在不規(guī)則或者曲面的物體表面,實(shí)現(xiàn)將空間中的紋理渲染到物體表面的過(guò)程。常見的紋理映射算法包括Catmull算法[3]和?Blinn算法[4]。
1.2.1?Catmull算法
Catmull算法一般采用雙線插值的方法,該算法通過(guò)遞歸分割對(duì)曲面進(jìn)行連續(xù)分割,直到每一個(gè)子曲面只包含一個(gè)像素中心。然后將子曲面中心的參數(shù)值映射到紋理空間中,使各像素可見的子曲面對(duì)應(yīng)于紋理空間中的指定區(qū)域。最后取紋理空間中交點(diǎn)處的紋理圖像值確定的像素平均紋理顏色作為該圖像中心可見點(diǎn)的紋理屬性[6]。原理如圖1所示:
圖1??Catmull算法的基本過(guò)程
在實(shí)際處理過(guò)程中,Catmull算法中還考慮了多個(gè)子曲面對(duì)應(yīng)的平均紋理對(duì)像素的共同影響。進(jìn)而解決細(xì)分生成的子曲面可能無(wú)法準(zhǔn)確覆蓋在屏幕上所有的像素區(qū)域和多個(gè)子曲面也可能包含在一個(gè)像素中的問(wèn)題。在這里,我們假設(shè)像素e所對(duì)應(yīng)的景物表面上的可見區(qū)域中包含有n個(gè)子曲面,則像素e的光亮度可通過(guò)計(jì)算和像素e相關(guān)的各個(gè)子曲面對(duì)其光亮度的貢獻(xiàn)值得出,計(jì)算公式如下:
其中,為n個(gè)子曲面的平均光亮度,
為各個(gè)子曲面在像素e中的投影面積(Se)與整個(gè)像素的面積(S1+S2+…Sn)之比。
雖然使用Catmull方法省去了紋理空間和物體之間的逆變換過(guò)程,但由于算法在計(jì)算各子曲面片在每一個(gè)像素內(nèi)的可見區(qū)域及投影面積采用的是解析方法,因此會(huì)占用大量的存儲(chǔ)空間,計(jì)算復(fù)雜,時(shí)間耗費(fèi)大。
1.2.2?Blinn算法
Blinn算法可以將像素表示的區(qū)域投影在景物表面上,然后利用映射到紋理空間的曲面得到相應(yīng)的紋理屬性。
Blinn的原始凹凸貼圖算法在紋理的每個(gè)紋理元素上存儲(chǔ)了兩個(gè)用來(lái)描述曲面上各點(diǎn)朝向的有符號(hào)的值bu和bv,這兩個(gè)值對(duì)應(yīng)的是沿u和v圖像軸改變法線的量。
Blinn方法的提出有效克服了Catmull方法的缺點(diǎn),因此,一般的紋理映射過(guò)程中,為達(dá)到更令人滿意的結(jié)果,我們可以根據(jù)實(shí)際使用的需求將Blinn算法與Catmull算法結(jié)合使用。
1.3?兩步法紋理映射技術(shù)
紋理映射技術(shù)主要是針對(duì)由多邊形組成的不規(guī)則物體表面紋理映射處理的技術(shù),此次實(shí)驗(yàn)采用兩步法紋理映射法實(shí)現(xiàn)二維紋理映射。
兩步紋理映射技術(shù)的核心是借助一個(gè)中間映射媒介來(lái)完成從紋理空間到景物空間的表面紋理映射處理工作,其基本過(guò)程可用下面兩個(gè)步驟來(lái)完成:
(1)將二維紋理空間映射到某個(gè)三維中間媒介表面:
(2)將這個(gè)三維中間媒介表面映射到目標(biāo)景物表面:
在這里,將O映射和S映射的復(fù)合得到紋理空間到景物空間的紋理映射可表示為:
根據(jù)上述過(guò)程,考慮例如平面,柱面,立方體以及球面等常見的中介幾何,可建立四種中介表面到景物表面的映射關(guān)系。
2基于Python的紋理映射綜合實(shí)驗(yàn)設(shè)計(jì)
2.1實(shí)驗(yàn)?zāi)康?/p>
(1)通過(guò)基于python語(yǔ)言的二維紋理映射實(shí)驗(yàn)幫助學(xué)生掌握二維紋理映射原理,以及二維紋理映射實(shí)現(xiàn)過(guò)程,深入理解二維紋理映射相關(guān)知識(shí)元。
(2)通過(guò)實(shí)驗(yàn)加深對(duì)紋理映射技術(shù)和紋理映射算法的理解,掌握二維紋理映射的程序編寫過(guò)程。
2.2實(shí)驗(yàn)環(huán)境準(zhǔn)備
二維紋理映射實(shí)驗(yàn)基于python+OpenGL的環(huán)境。先安裝anacode,pycharm等各類python編譯平臺(tái),再配置pyOpenGL庫(kù)。該實(shí)驗(yàn)環(huán)境具體搭建步驟可參考win10+Anaconda3+python3.6+openGL+pyCharm安裝和配置。
2.3實(shí)驗(yàn)內(nèi)容與實(shí)驗(yàn)步驟
2.3.1實(shí)驗(yàn)內(nèi)容
(1)?指定圖像紋理坐標(biāo),用索引指定頂點(diǎn)屬性。
(2)?指定解析方式并啟動(dòng)頂點(diǎn)屬性。
(3)?設(shè)置紋理對(duì)象,包括定義和綁定紋理對(duì)象,設(shè)置wrap和filter參數(shù),并加載紋理。
(4)?著色器中使用紋理對(duì)象,在著色器中,對(duì)兩個(gè)紋理的顏色進(jìn)行混合。
2.3.2實(shí)驗(yàn)步驟
步驟1:指定紋理坐標(biāo),包括頂點(diǎn)坐標(biāo)、頂點(diǎn)位置和頂點(diǎn)顏色的處理。
步驟2:指定解析方式并啟動(dòng)頂點(diǎn)屬性。
(1)創(chuàng)建并綁定VBO和EBO。
(2)將頂點(diǎn)數(shù)據(jù)傳送到GPU。
(3)指定解析方式和頂點(diǎn)屬性。
步驟3:設(shè)置紋理對(duì)象。
(1)創(chuàng)建與綁定紋理對(duì)象。
(2)設(shè)置WRAP參數(shù)。
(3)設(shè)置Filter參數(shù)。
(4)加載紋理。
步驟4:著色器中使用紋理對(duì)象,通過(guò)著色器完成圖像的渲染將兩個(gè)紋理單元混合。
3二維紋理映射實(shí)驗(yàn)具體過(guò)程
3.1指定紋理坐標(biāo)
使用索引指定頂點(diǎn)屬性數(shù)據(jù),屬性數(shù)據(jù)包括頂點(diǎn)位置,頂點(diǎn)顏色和頂點(diǎn)紋理等。
3.2指定解析方式并啟動(dòng)頂點(diǎn)屬性
在指定紋理坐標(biāo)后,我們還需要指定紋理坐標(biāo)的解析方式,將頂點(diǎn)屬性綁定到頂點(diǎn)著色器中的屬性變量中。
3.2.1?創(chuàng)建并綁定VBO和EBO
通過(guò)創(chuàng)建VBO和EBO兩個(gè)緩沖對(duì)象,分別存儲(chǔ)頂點(diǎn)數(shù)據(jù)和索引數(shù)據(jù)。
3.2.2?將頂點(diǎn)數(shù)據(jù)傳送到GPU
在OpenGL程序中指定或者加載的數(shù)據(jù)是存儲(chǔ)在CPU中的,為了加快圖形渲染,我們將頂點(diǎn)屬性數(shù)據(jù)傳送到GPU。
3.2.3?指定解析方式和頂點(diǎn)屬性
通過(guò)設(shè)置glVertexAttribPointer(index,?size,?type,?normalized,?stride,?pointer)函數(shù)指定解析方式并啟動(dòng)頂點(diǎn)屬性。
3.3配置紋理對(duì)象
3.3.1?創(chuàng)建與綁定紋理對(duì)象
由于此次實(shí)驗(yàn)圖像是像素的2D數(shù)組,紋理通過(guò)調(diào)用glGenTextures()函數(shù)來(lái)生成紋理對(duì)象,同時(shí)調(diào)用glBindTexture()函數(shù)將其綁定到二維紋理中。
3.2.2?設(shè)置WRAP參數(shù)
在繪制操作期間,紋理中的像素將使用紋理坐標(biāo)來(lái)檢索顏色信息。當(dāng)紋理坐標(biāo)不在[0,0]到[1,1]范圍時(shí),可通過(guò)以下四種選項(xiàng)來(lái)控制:
GL_REPEAT:?形成重復(fù)的模式,忽略坐標(biāo)整數(shù)部分。
GL_MIRRORED_REPEAT:紋理重復(fù),當(dāng)坐標(biāo)的整數(shù)部分為奇數(shù)時(shí)會(huì)被鏡像。
GL_CLAMP_TO_EDGE:坐標(biāo)夾在0和1。
GL_CLAMP_TO_BORDER:超出范圍的坐標(biāo)被賦予指定的邊框顏色。
3.2.3?設(shè)置Filter參數(shù)
當(dāng)使用紋理坐標(biāo)映射到紋素?cái)?shù)組時(shí),可能會(huì)由于紋理坐標(biāo)與紋素不能完全匹配,使得紋理圖像被拉伸超過(guò)原始大小而縮小的情況。此時(shí)可通過(guò)對(duì)紋理坐標(biāo)進(jìn)行取整,使用最佳逼近點(diǎn)來(lái)獲取紋素值,即最近鄰濾波(GL_NEAREST)。又或者通過(guò)每個(gè)紋素位置附近一組紋素的加權(quán)平均值來(lái)確定最終的紋素值,即線性濾波(GL_LINEAR)。
3.2.4?加載紋理
調(diào)用glTexImage2D(GL_TEXTURE_2D,?0,?GL_RGB,?2,?2,?0,?GL_RGB,?GL_FLOAT,?pixels)函數(shù)定義紋理圖像的格式,寬度和高度等信息。
3.4著色器中使用紋理對(duì)象
紋理對(duì)象首先通過(guò)頂點(diǎn)著色器傳遞紋理坐標(biāo),再使用uniform變量向片元著色器傳遞紋理單元的索引號(hào)獲得最終的最終的紋素。對(duì)于著色器,采用的是GLSL語(yǔ)言編寫的程序,每一個(gè)著色器程序?qū)ο罂梢园鄠€(gè)著色器對(duì)象,使用著色器需要包含以下3個(gè)步驟:
步驟1:創(chuàng)建和編譯著色器對(duì)象。
步驟2:?創(chuàng)建著色器程序?qū)ο螅溄佣鄠€(gè)著色器對(duì)象到著色器程序中。
步驟3:在繪制場(chǎng)景時(shí)啟動(dòng)著色器程序。
結(jié)語(yǔ)
本文根據(jù)計(jì)算機(jī)圖形學(xué)紋理映射實(shí)驗(yàn)的實(shí)踐教學(xué)需求,設(shè)計(jì)了基于python語(yǔ)言的二維紋理映射實(shí)驗(yàn),既可以幫助學(xué)生理解掌握紋理映射知識(shí)元,也可以將理論知識(shí)對(duì)應(yīng)到紋理映射過(guò)程實(shí)驗(yàn)中進(jìn)行深入理解。為了使學(xué)生深刻掌握計(jì)算機(jī)圖形學(xué)中紋理映射基礎(chǔ)理論與實(shí)踐,本文涉及的兩步法紋理映射技術(shù)是紋理映射方法的一種,其核心是通過(guò)一個(gè)中間媒介完成紋理映射工作,此外,過(guò)程性紋理映射技術(shù)也是紋理映射技術(shù)的常用方法之一。學(xué)生通過(guò)參與實(shí)驗(yàn)過(guò)程及實(shí)驗(yàn)結(jié)果分析,可以加深對(duì)二維紋理映射過(guò)程的理解,鍛煉學(xué)生的實(shí)踐能力以及創(chuàng)新能力。
參考文獻(xiàn):
[1]肖文芳,黃稚霆,歐俊宏,等.基于人工智能的計(jì)算機(jī)視覺研究領(lǐng)域發(fā)展現(xiàn)狀研究——基于多種可視化工具的比較分析[J].科技創(chuàng)新與應(yīng)用,2022,12(36):27-30.
[2]宋丹,楊?,李茂林,等.人工智能在學(xué)前教育中的應(yīng)用淺探[J].今日科苑,2019(10):31-42.
[3]董荻.人工智能與教育的融合——智能機(jī)器人在學(xué)前教育領(lǐng)域的應(yīng)用[J].教育教學(xué)論壇,2019(31):1-2.
[4]徐蒙蒙.?學(xué)前教育與兒童發(fā)展的因果效應(yīng)[D].哈爾濱工業(yè)大學(xué),2021.
[5]劉玉.兒童原創(chuàng)繪本創(chuàng)作在學(xué)前教育專業(yè)中的意義與應(yīng)用[J].現(xiàn)代職業(yè)教育,2022(37):129-131.
基金項(xiàng)目:2022年陜西師范大學(xué)校級(jí)教改項(xiàng)目:OBE理念下大數(shù)據(jù)技術(shù)和課程思政相融合的教學(xué)改革與實(shí)踐;2023年教育部產(chǎn)學(xué)合作協(xié)同育人項(xiàng)目:人工智能專業(yè)的大數(shù)據(jù)技術(shù)教學(xué)實(shí)驗(yàn)實(shí)訓(xùn)平臺(tái)建設(shè)(220904615273340)
作者簡(jiǎn)介:李津(1991—??),男,漢族,陜西西安人,博士,講師,研究方向:包括多模態(tài)學(xué)習(xí)、數(shù)據(jù)壓縮與檢索、人工智能教育。