資源下載地址:https://download.csdn.net/download/sheziqiong/85628707
資源下載地址:https://download.csdn.net/download/sheziqiong/85628707
使用Visual Studio C++編譯已有項目工程。
模型尺寸不做具體要求。要求修改代碼達到以下要求:
1.通過設(shè)置紋理,使得茶壺紋理為:
2.使得桌子紋理為:
3.對茶壺實現(xiàn)紋理和光照效果的混合
4.自己用代碼產(chǎn)生一張紋理,并貼在茶壺表面,效果類似:
5.在桌面上實現(xiàn)兩張紋理的疊合效果(附加項,完成可加分):
提示:glSolidCube()并不會為多邊形指定紋理坐標,因此需要自己重寫一個有紋理坐標的方塊函數(shù)。另外,此實驗需要用到 #include
Visual Studio C++
glut.zip
模板工程
操作方法和實驗步驟具體步驟按照參考資料的提示,對茶壺和桌子的紋理進行設(shè)置和更新。
讀入紋理貼圖部分的代碼很像上學期DIP(圖像信息處理)課上對于bmp文件的讀寫操作,所以就不再贅述。
加載紋理函數(shù)部分:
重點函數(shù):
voidglBindTexture(GLenum target,GLuint texture); 將一個命名的紋理綁定到一個紋理目標上,參數(shù)target指定綁定目標,參數(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 綁定一張紋理。當把一張紋理綁定到一個目標上時,之前對這個目標的綁定就會失效。紋理名字是一個無符號整數(shù)。值0是被保留的,它代表了每一個紋理目標的默認紋理。對于當前的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 指定目標紋理,這個值必須是GL_TEXTURE_2D。
level 執(zhí)行細節(jié)級別。0是最基本的圖像級別,n表示第N級貼圖細化級別。
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)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-8ZN4tKYR-1655101678346)(https://www.writebug.com/myres/static/uploads/2022/6/12/7a07d863f0fec69ab619788371ec7fb7.writebug)]
重點函數(shù):紋理映射voidglTexEnvf(GLenumtarget,GLenumpname,GLfloatparam); 對于貼了紋理的模型,可以使用glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,XX)來指定紋理貼圖和材質(zhì)混合的方式,從而產(chǎn)生特定的繪制效果。(XX為混合方式參數(shù),OpenGL默認為GL_REPLACE,即只使用紋理)我們使用GL_MODULATE參數(shù)模式是把紋理元素的顏色乘以幾何圖元(進行光照計算之后)的顏色。通過這種模式,我們可以用彩色的幾何圖形與紋理結(jié)合來產(chǎn)生不同的效果。
至此,本次實驗重頭戲都已經(jīng)完成,下面是加分項——紋理疊合的實現(xiàn)。
多紋理混合的實現(xiàn)原理:在OpenGL中通過ARB_multitexture和ARB_texture_env_combine擴展來實現(xiàn)多紋理混合。分為以下幾個步驟:
計算3個紋理各自的貢獻,并將它們編碼進頂點的顏色中,這樣顏色的RGB部分控制紋理階段0和1間的插值,顏色的ALPHA控制紋理階段1和2間的插值。
使用GL_ARB_multitexture將3個紋理同時應(yīng)用到物體表面。
將第一個紋理設(shè)為紋理階段0。
在紋理階段1,使用GL_INTERPOLATE_ARB在紋理階段0的輸出(第一個紋理)和階段1的紋理之間用GL_SRC_COLOR(顏色的RGB部分)進行線性插值。
在紋理階段2,使用GL_INTERPOLATE_ARB在紋理階段1的輸出(第一個紋理和第二個紋理的混合體)和階段2的紋理之間用GL_SRC_COLOR(顏色的ALPHA部分)進行線性插值。
當然現(xiàn)在在新版本的OpenGL中用shader來實現(xiàn)會方便很多……鑒于OpenGL版本問題,我們還是用這幾個擴展方法來實現(xiàn)。
混合紋理的設(shè)置:
繪制多紋理物體也是采用單獨繪制的方法,其中調(diào)用了如下函數(shù):
void glActiveTexture(GLenum texUnit); 選擇可以由紋理函數(shù)進行修改的當前紋理單位,texUnit是一個符號常量,其形式為GL_TEXTUREi,其中i的范圍是從0到k-1,k是紋理單位的大數(shù)量。
void glMultiTexCoord2f(GLenum texUnit, const TYPE* coords); 將參數(shù)coords中的紋理坐標數(shù)據(jù)(s,t,r,q)用于紋理單位texUnit。texUnit參數(shù)所使用的枚舉值與glActiveTexture()函數(shù)相同。
(略)
實驗結(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海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧