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