菜鳥DirectX之紋理對映

2021-06-26 09:18:59 字數 3226 閱讀 8535

一紋理對映是什麼

就是你用前面部落格中講到的方法繪製乙個正方形後,在正方形上貼一張你想要顯示的

二紋理對映的使用

使用方法分為四步

1 在頂點格式中定義紋理的座標

比如 struct myvertex

2 填充頂點資料

customvertex vertices =,, 

, ,};

void* pvertices;

if( failed( g_pvertexbuffer->lock( 0, sizeof(vertices), (void**)&pvertices, 0 ) ) )

return e_fail;

memcpy( pvertices, vertices, sizeof(vertices) );

g_pvertexbuffer->unlock();

3 建立紋理

函式 有三個

d3dxcreatetexture

d3dxcreatetexturefromfile

d3dxcreatetexturefromfileex

4 設定紋理函式

settexture

三 紋理的過濾方式

說白了 這貨就是設定怎麼在你的貼圖上取出顏色值對應到你畫出來的正方形的每個畫素上

紋理過濾方式有四種

1 最近點取樣

特點 速度快,易失真

使用方法

g_pd3ddevice->setsamplerstate(0, d3dsamp_magfilter, d3dtexf_point);

g_pd3ddevice->setsamplerstate(0, d3dsamp_minfilter, d3dtexf_point);

2 線性紋理過濾

特點 速度快 價效比高

使用方法

g_pd3ddevice->setsamplerstate(0, d3dsamp_magfilter, d3dtexf_linear);

g_pd3ddevice->setsamplerstate(0, d3dsamp_minfilter, d3dtexf_linear);

3 各向異性過濾

如果你的物體表面不是平面,比如有凹凸面,那就要設定這個

使用方法

g_pd3ddevice->setsamplerstate(0, d3dsamp_maxanisotropy, 2);

g_pd3ddevice->setsamplerstate(0, d3dsamp_magfilter, d3dtexf_anisotropic);

g_pd3ddevice->setsamplerstate(0, d3dsamp_minfilter, d3dtexf_anisotropic);

4 多級漸進紋理過濾

這貨最牛,效果最好,開銷最大

設定這種過濾方式,dx會把你的貼圖分成大小不一樣的很多貼圖,dx在紋理對映時會自動選擇一張大小合適的貼圖使用,比如物體離你近時就選擇一張大的貼圖,離你遠時就選擇一張小的貼圖。如果大小都不合適怎麼辦,那就對大小比較合適的兩張貼圖進行過濾,計算出最後的結果,過濾方式就是前面那三種過濾方式中的一種

使用方法

這裡把輔助過濾方式設為線性過濾

g_pd3ddevice->setsamplerstate(0, d3dsamp_mipfilter, d3dtexf_linear);

g_pd3ddevice->setsamplerstate(0, d3dsamp_maxmiplevel, 8);

四紋理的定址方式

紋理座標的範圍為(0,1),超過這個範圍的咋辦,設定紋理定址方式唄。

簡單說就是你在頂點格式中設定的紋理座標超過了(0,1),比如你這麼設定(0.0,2.0)

那從1.0到2.0的位置該貼啥圖呢(準確的說是顏色值)

1 重複定址模式

特點 超出的部分迴圈前面的紋理

使用方式

g_pd3ddevice->setsamplerstate(0, d3dsamp_addressu, d3dtaddress_wrap);

g_pd3ddevice->setsamplerstate(0, d3dsamp_addressv, d3dtaddress_wrap);

2 映象定址方式

特點 超出的部分自動複製並180度翻轉前面的紋理

使用方式

g_pd3ddevice->setsamplerstate(0, d3dsamp_addressu, d3dtaddress_mirror);

g_pd3ddevice->setsamplerstate(0, d3dsamp_addressv, d3dtaddress_mirror);

3 夾取定址模式

特點 超出的部分用拉伸前面紋理邊緣的方式來解決

使用方式

g_pd3ddevice->setsamplerstate(0, d3dsamp_addressu, d3dtaddress_clamp);

g_pd3ddevice->setsamplerstate(0, d3dsamp_addressv, d3dtaddress_clamp);

4 邊框顏色紋理定址

特點 超出的部分使用前面紋理的邊框顏色填充

使用方式

g_pd3ddevice->setsamplerstate(0, d3dsamp_addressu, d3dtaddress_border);

g_pd3ddevice->setsamplerstate(0, d3dsamp_addressv, d3dtaddress_border);

十點四十下班到的家,寫完這篇部落格快一點了,想對學弟學妹門說一句,如果你不是非常熱愛遊戲,就很難堅持下去的,珍愛生命,遠離遊戲,哈哈

Direct X學習筆記 紋理對映

之前學習了如何繪製物體,還畫了個dx自帶的茶壺,然而這個東東並不怎麼好看.離我們現實的物體簡直相隔千里。僅僅能說像美術他們用來寫生的模型.那麼要怎麼樣才幹讓我們的東西看起來更像真實的物體呢?這個就要用到今天學習的紋理對映技術了.總之。紋理對映就是我們用一幅2d貼在3d物體上。讓物體表面呈現為2d的樣...

Directx11教程37 紋理對映 7

本章是在教程35 36的基礎上來實現乙個光照紋理結合的程式,就是把場景中旋轉的cube加上紋理。lighttex.vs中頂點的結構現在為 struct vertexinputtype 紋理座標 output.tex input.tex 紋理座標不做任何變化,只是單純的從vs輸出到ps中。lightt...

Directx11教程38 紋理對映 8

上篇日誌中,我們用紋理和光照顏色調製的方式得到最終顏色,本章我們嘗試用紋理取樣的顏色,直接做為材質的漫反射係數kd,並用它來做光照計算,最後再做個gamma校正,如果不做的話,效果會偏亮。lighttex.ps主要改動 float4 texturecolor shadertexture.sample...