基于C++OpenGL實現(xiàn)的小桌茶壺紋理圖形繪制-創(chuàng)新互聯(lián)

資源下載地址:https://download.csdn.net/download/sheziqiong/85628707
資源下載地址:https://download.csdn.net/download/sheziqiong/85628707

10年積累的做網(wǎng)站、成都網(wǎng)站制作經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先做網(wǎng)站后付款的網(wǎng)站建設(shè)流程,更有新洲免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。實驗?zāi)康暮鸵?p>在OpenGL消隱和光照實驗的基礎(chǔ)上,通過實現(xiàn)實驗內(nèi)容,掌握OpenGL中紋理的使用,并驗證課程中關(guān)于紋理的內(nèi)容。

實驗內(nèi)容和原理

使用Visual Studio C++編譯已有項目工程。

模型尺寸不做具體要求。要求修改代碼達(dá)到以下要求:

1.通過設(shè)置紋理,使得茶壺紋理為:

在這里插入圖片描述

2.使得桌子紋理為:

3.對茶壺實現(xiàn)紋理和光照效果的混合

4.自己用代碼產(chǎn)生一張紋理,并貼在茶壺表面,效果類似:

在這里插入圖片描述

5.在桌面上實現(xiàn)兩張紋理的疊合效果(附加項,完成可加分):
在這里插入圖片描述
在這里插入圖片描述

提示:glSolidCube()并不會為多邊形指定紋理坐標(biāo),因此需要自己重寫一個有紋理坐標(biāo)的方塊函數(shù)。另外,此實驗需要用到 #include

主要儀器設(shè)備

Visual Studio C++

glut.zip

模板工程

操作方法和實驗步驟

具體步驟按照參考資料的提示,對茶壺和桌子的紋理進(jìn)行設(shè)置和更新。

讀入紋理貼圖部分的代碼很像上學(xué)期DIP(圖像信息處理)課上對于bmp文件的讀寫操作,所以就不再贅述。

加載紋理函數(shù)部分:

在這里插入圖片描述

重點(diǎn)函數(shù):

voidglBindTexture(GLenum target,GLuint texture); 將一個命名的紋理綁定到一個紋理目標(biāo)上,參數(shù)target指定綁定目標(biāo),參數(shù)texture指定紋理的名字。

glBindTexture允許我們向GL_TEXTURE_1D, GL_TEXTURE_2D, GL_TEXTURE_3D, GL_TEXTURE_1D_ARRAY, GL_TEXTURE_2D_ARRAY, GL_TEXTURE_RECTANGLE, GL_TEXTURE_CUBE_MAP, GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_BUFFER, GL_TEXTURE_2D_MULTISAMPLE or GL_TEXTURE_2D_MULTISAMPLE_ARRAY 綁定一張紋理。當(dāng)把一張紋理綁定到一個目標(biāo)上時,之前對這個目標(biāo)的綁定就會失效。紋理名字是一個無符號整數(shù)。值0是被保留的,它代表了每一個紋理目標(biāo)的默認(rèn)紋理。對于當(dāng)前的GL渲染上下文中的共享對象空間,紋理名稱以及它們對應(yīng)的紋理內(nèi)容是局部的;只有在顯式開啟上下文之間的共享,兩個渲染上下文才可以共享紋理名稱。

Mipmap——可以提高渲染性能與提升場景視覺質(zhì)量的一個較為優(yōu)秀的紋理技術(shù),可以解決常見的閃爍和性能等問題。用glTexParameteri()函數(shù)就可以通過紋理參數(shù)來控制要加載的層級范圍。

實驗中用到的過濾方式:GL_TEXTURE_MAG_FILTER: 放大過濾, GL_TEXTURE_MIN_FILTER: 縮小過濾;GL_NEAREST:在mip基層上使用最近鄰過濾。實際上,Mipmap的紋理過濾的方式還有如下:

常量描述
GL_NEAREST在mip基層上使用最鄰近過濾
GL_LINEAR在mip基層上使用線性過濾
GL_NEAREST_MIPMAP_NEAREST選擇最鄰近的mip層,并使用最鄰近過濾
GL_NEAREST_MIPMAP_LINEAR在mip層之間使用線性插值和最鄰近過濾
GL_LINEAR_MIPMAP_NEAREST選擇最鄰近的mip層,使用線性過濾
GL_LINEAR_MIPMAP_LINEAR在mip層之間使用線性插值和使用線性過濾,又稱三線性mipmap

其中GL_NEAREST_MIPMAP_NEAAREST具有很好的性能,也能夠解決閃爍的問題,但在視覺效果上會比較差。其中GL_LINEAR_MIPMAP_NEAREST常用于游戲加速,使用了質(zhì)量較高的線性過濾,和快速的選擇的方式(最鄰近方式)。

GL_APICALL void GL_APIENTRY glTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels);

參數(shù)說明:

  • target 指定目標(biāo)紋理,這個值必須是GL_TEXTURE_2D。

  • level 執(zhí)行細(xì)節(jié)級別。0是最基本的圖像級別,n表示第N級貼圖細(xì)化級別。

  • internalformat 指定紋理中的顏色組件??蛇x的值有GL_ALPHA,GL_RGB,GL_RGBA,GL_LUMINANCE, GL_LUMINANCE_ALPHA 等幾種。

  • width 指定紋理圖像的寬度,必須是2的n次方。紋理圖片至少要支持64個材質(zhì)元素的寬度

  • height 指定紋理圖像的高度,必須是2的m次方。紋理圖片至少要支持64個材質(zhì)元素的高度

  • border 指定邊框的寬度。必須為0。

  • format 像素數(shù)據(jù)的顏色格式, 不需要和internalformatt取值必須相同??蛇x的值參考internalformat。

  • type 指定像素數(shù)據(jù)的數(shù)據(jù)類型??梢允褂玫闹涤蠫L_UNSIGNED_BYTE,GL_UNSIGNED_SHORT_5_6_5,GL_UNSIGNED_SHORT_4_4_4_4,GL_UNSIGNED_SHORT_5_5_5_1。

  • pixels 指定內(nèi)存中指向圖像數(shù)據(jù)的指針

定義紋理函數(shù):

貼紋理并注意和光照效果混合(以茶壺為例),注意到增加了操作控制切換紋理與燈光的布爾量:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-8ZN4tKYR-1655101678346)(https://www.writebug.com/myres/static/uploads/2022/6/12/7a07d863f0fec69ab619788371ec7fb7.writebug)]

重點(diǎn)函數(shù):紋理映射voidglTexEnvf(GLenumtarget,GLenumpname,GLfloatparam); 對于貼了紋理的模型,可以使用glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,XX)來指定紋理貼圖和材質(zhì)混合的方式,從而產(chǎn)生特定的繪制效果。(XX為混合方式參數(shù),OpenGL默認(rèn)為GL_REPLACE,即只使用紋理)我們使用GL_MODULATE參數(shù)模式是把紋理元素的顏色乘以幾何圖元(進(jìn)行光照計算之后)的顏色。通過這種模式,我們可以用彩色的幾何圖形與紋理結(jié)合來產(chǎn)生不同的效果。

至此,本次實驗重頭戲都已經(jīng)完成,下面是加分項——紋理疊合的實現(xiàn)。

多紋理混合的實現(xiàn)原理:在OpenGL中通過ARB_multitexture和ARB_texture_env_combine擴(kuò)展來實現(xiàn)多紋理混合。分為以下幾個步驟:

  1. 計算3個紋理各自的貢獻(xiàn),并將它們編碼進(jìn)頂點(diǎn)的顏色中,這樣顏色的RGB部分控制紋理階段0和1間的插值,顏色的ALPHA控制紋理階段1和2間的插值。

  2. 使用GL_ARB_multitexture將3個紋理同時應(yīng)用到物體表面。

  3. 將第一個紋理設(shè)為紋理階段0。

  4. 在紋理階段1,使用GL_INTERPOLATE_ARB在紋理階段0的輸出(第一個紋理)和階段1的紋理之間用GL_SRC_COLOR(顏色的RGB部分)進(jìn)行線性插值。

  5. 在紋理階段2,使用GL_INTERPOLATE_ARB在紋理階段1的輸出(第一個紋理和第二個紋理的混合體)和階段2的紋理之間用GL_SRC_COLOR(顏色的ALPHA部分)進(jìn)行線性插值。

當(dāng)然現(xiàn)在在新版本的OpenGL中用shader來實現(xiàn)會方便很多……鑒于OpenGL版本問題,我們還是用這幾個擴(kuò)展方法來實現(xiàn)。

混合紋理的設(shè)置:

繪制多紋理物體也是采用單獨(dú)繪制的方法,其中調(diào)用了如下函數(shù):

void glActiveTexture(GLenum texUnit); 選擇可以由紋理函數(shù)進(jìn)行修改的當(dāng)前紋理單位,texUnit是一個符號常量,其形式為GL_TEXTUREi,其中i的范圍是從0到k-1,k是紋理單位的大數(shù)量。
void glMultiTexCoord2f(GLenum texUnit, const TYPE* coords); 將參數(shù)coords中的紋理坐標(biāo)數(shù)據(jù)(s,t,r,q)用于紋理單位texUnit。texUnit參數(shù)所使用的枚舉值與glActiveTexture()函數(shù)相同。

實驗數(shù)據(jù)記錄和處理

(略)

實驗結(jié)果與分析


資源下載地址:https://download.csdn.net/download/sheziqiong/85628707
資源下載地址:https://download.csdn.net/download/sheziqiong/85628707

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧

文章名稱:基于C++OpenGL實現(xiàn)的小桌茶壺紋理圖形繪制-創(chuàng)新互聯(lián)
文章鏈接:http://bm7419.com/article48/dgdpep.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計公司、定制網(wǎng)站、云服務(wù)器商城網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設(shè)計公司