遊戲開發基礎(六)

 

第六章
Direct3D中,紋理用接口IDirect3DTexture9來表示,紋理是類似於表面的一個像素矩陣,與表面不同的是它可被映射到三角形單元中
Direct3D所使用的紋理座標系由沿水平方向的u軸和沿垂直方向的v軸構成,用座標對(u,v)標識的紋理元素稱爲紋理元
注意v軸的正方向是豎直向下的
Direct3D將紋理座標做了規範化處理,使之限定在區間[0,1]內
D3DFVF_TEX1,頂點結構中包含了一對紋理座標
3D三角形已經被變換至屏幕座標系時,紋理映射纔會進行

HRESULT D3DXCreateTextureFormFile(
    LPDIRECT3DDEVICE9 pDevice,
    LPCTSTR pSrcFile,
    LPDIRECT3DTEXTURE9* ppTexture
    );
設置當前紋理:
HRESULT IDirect3DDevice::SetTexture(
    DWORD Stage,
    IDirect3DBaseTexture9 *pTexture);
在Direct3D中,最多可設置8層紋理
若想禁用某一紋理層,可將pTexture參數設爲0
例:繪製物體時若不想使用紋理
Device->SetTexture(0,0);
renderObjectWithoutTexture();
如果場景中各個三角形所使用的紋理均不相同:
Device->SetTexture(0,tex0);
drawTrisUsingTex0();
Device->SetTexture(0,tex1);
drawTrisUsingTex1();


Direct3D提供了3種類型的紋理過濾器,每種過濾器都提供了一種質量水平
紋理過濾方式可以IDirect3DDevice9->SetSamplerState來設置

#近點採樣
將近點採樣方式設置爲放大過濾器和縮小過濾器
Device->SetSamplerState(0,D3DSAMP_MAGFILTER,D3DTEXF_POINT);
Device->SetSamplerState(0,D3DSAMP_MINFILTER,D3DTEXF_POINT);
#線性紋理過濾
將線性紋理過濾設置爲放大過濾器和縮小過濾器
Device->SetSamplerState(0,D3DSAMP_MAGFILTER,D3DTEXF_LINEAR);
Device->SetSamplerState(0,D3DSAMP_MINFILTER,D3DTEXF_LINEAR);
#各向異性紋理過濾
將各向異性紋理過濾設置爲放大過濾器和縮小過濾器
Device->SetSamplerState(0,D3DSAMP_MAGFILTER,D3DTEXF_ANISOTROPIC);
Device->SetSamplerState(0,D3DSAMP_MINFILTER,D3DTEXF_ANISOTROPIC);
使用各向異性紋理過濾時,必須對D3DSAMP_MAXANISOTROPIC水平值進行設定,該值決定了各向異性過濾的質量水平
用IDirect3DDevice9::GetDeviceCaps函數檢查返回的D3DCAPS9結構參數,
Device->SetSamplerState(0,D3DSAMP_MAXANISOTROPIC,4);

多級漸進紋理
多級漸進紋理過濾器主要用於控制IDirect3D使用多級漸進紋理的方式,
可以對多級漸進紋理過濾器如下設置:
Device->SetSamplerState(0,D3DSAMP_MIPFILTER,Filter);
Filter值:
D3DTEXF_NONE 禁用多級漸進紋理過濾器
D3DTEXF_POINT 通過使用該過濾器,Direct3D將選擇尺寸與屏幕三角形最接近的那一級紋理,一旦選擇了某一紋理,Direct3D就會用指定

的放大過濾器和縮小過濾器對該級紋理進行過濾
D3DTEXF_LINEAR 通過使用該過濾器,Direct3D將取與屏幕三角形尺寸最接近的兩個紋理級,用指定的放大過濾器和縮小過濾器對每級紋理

進行過濾,然後在將這兩級紋理進行線性組合,從而形成最終的顏色值。


尋址模式
Direct3D定義了4種用來處理紋理座標值超出[0,1]區間的紋理映射模式,它們分別是:重複尋址模式,邊界顏色尋址模式,箝位尋址模式

以及鏡像尋址模式
重複尋址模式
Device->SetSampleState(0,D3DSAMP_ADDRESSU,D3DTADDRESS_WRAP);
Device->SetSampleState(0,D3DSAMP_ADDRESSV,D3DTADDRESS_WRAP);
邊界顏色尋址模式
Device->SetSampleState(0,D3DSAMP_ADDRESSU,D3DTADDRESS_BORDER);
Device->SetSampleState(0,D3DSAMP_ADDRESSV,D3DTADDRESS_BORDER);
Device->SetSampleState(0,D3DSAMP_BORDERCOLOR,0x000000ff);
箝位尋址模式
Device->SetSampleState(0,D3DSAMP_ADDRESSU,D3DTADDRESS_CLAMP);
Device->SetSampleState(0,D3DSAMP_ADDRESSV,D3DTADDRESS_CLAMP);
鏡像尋址模式
Device->SetSampleState(0,D3DSAMP_ADDRESSU,D3DTADDRESS_MIRROR);
Device->SetSampleState(0,D3DSAMP_ADDRESSV,D3DTADDRESS_MIRROR);

場景添加紋理的步驟:
1 構造組成物體的頂點,併爲其指定紋理座標
2 用函數D3DXCreateTextureFromFile爲IDirect3DTexture9接口加載一種紋理
3 設置縮小過濾器,放大過濾器和多級漸進紋理過濾器
4 繪製物體前,用函數IDirect3DDevice9::SetTexture來設定與該物體關聯的紋理

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章