遊戲開發基礎(六)

來源:互聯網
上載者:User

 

第六章
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來設定與該物體關聯的紋理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.