資源下載地址:https://download.csdn.net/download/sheziqiong/85628707
資源下載地址:https://download.csdn.net/download/sheziqiong/85628707
使用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
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è)步驟:
計(jì)算3個(gè)紋理各自的貢獻(xiàn),并將它們編碼進(jìn)頂點(diǎn)的顏色中,這樣顏色的RGB部分控制紋理階段0和1間的插值,顏色的ALPHA控制紋理階段1和2間的插值。
使用GL_ARB_multitexture將3個(gè)紋理同時(shí)應(yīng)用到物體表面。
將第一個(gè)紋理設(shè)為紋理階段0。
在紋理階段1,使用GL_INTERPOLATE_ARB在紋理階段0的輸出(第一個(gè)紋理)和階段1的紋理之間用GL_SRC_COLOR(顏色的RGB部分)進(jìn)行線(xiàn)性插值。
在紋理階段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)結(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)
猜你還喜歡下面的內(nèi)容