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

實(shí)驗(yàn)內(nèi)容和原理

使用Visual Studio C++編譯已有項(xiàng)目工程。

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

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

在這里插入圖片描述

2.使得桌子紋理為:

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

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

在這里插入圖片描述

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

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

主要儀器設(shè)備

Visual Studio C++

glut.zip

模板工程

操作方法和實(shí)驗(yàn)步驟

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

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

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

在這里插入圖片描述

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

voidglBindTexture(GLenum target,GLuint texture); 將一個(gè)命名的紋理綁定到一個(gè)紋理目標(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)把一張紋理綁定到一個(gè)目標(biāo)上時(shí),之前對(duì)這個(gè)目標(biāo)的綁定就會(huì)失效。紋理名字是一個(gè)無(wú)符號(hào)整數(shù)。值0是被保留的,它代表了每一個(gè)紋理目標(biāo)的默認(rèn)紋理。對(duì)于當(dāng)前的GL渲染上下文中的共享對(duì)象空間,紋理名稱(chēng)以及它們對(duì)應(yīng)的紋理內(nèi)容是局部的;只有在顯式開(kāi)啟上下文之間的共享,兩個(gè)渲染上下文才可以共享紋理名稱(chēng)。

Mipmap——可以提高渲染性能與提升場(chǎng)景視覺(jué)質(zhì)量的一個(gè)較為優(yōu)秀的紋理技術(shù),可以解決常見(jiàn)的閃爍和性能等問(wèn)題。用glTexParameteri()函數(shù)就可以通過(guò)紋理參數(shù)來(lái)控制要加載的層級(jí)范圍。

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

常量描述
GL_NEAREST在mip基層上使用最鄰近過(guò)濾
GL_LINEAR在mip基層上使用線(xiàn)性過(guò)濾
GL_NEAREST_MIPMAP_NEAREST選擇最鄰近的mip層,并使用最鄰近過(guò)濾
GL_NEAREST_MIPMAP_LINEAR在mip層之間使用線(xiàn)性插值和最鄰近過(guò)濾
GL_LINEAR_MIPMAP_NEAREST選擇最鄰近的mip層,使用線(xiàn)性過(guò)濾
GL_LINEAR_MIPMAP_LINEAR在mip層之間使用線(xiàn)性插值和使用線(xiàn)性過(guò)濾,又稱(chēng)三線(xiàn)性mipmap

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

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ù)說(shuō)明:

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

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

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

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

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

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

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

  • type 指定像素?cái)?shù)據(jù)的數(shù)據(jù)類(lèi)型??梢允褂玫闹涤蠫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ī)制,建議將圖片保存下來(lái)直接上傳(img-8ZN4tKYR-1655101678346)(https://www.writebug.com/myres/static/uploads/2022/6/12/7a07d863f0fec69ab619788371ec7fb7.writebug)]

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

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

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

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

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

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

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

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

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

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

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

void glActiveTexture(GLenum texUnit); 選擇可以由紋理函數(shù)進(jìn)行修改的當(dāng)前紋理單位,texUnit是一個(gè)符號(hào)常量,其形式為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í)驗(yàn)數(shù)據(jù)記錄和處理

(略)

實(shí)驗(yàn)結(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級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

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

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

廣告

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

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