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