Directx11教程(35) 紋理映射(5)


    到現在為止,我們的TextureClass初始化函數非常簡單,說白了就是一行代碼:

result = D3DX11CreateShaderResourceViewFromFile(device, filename, NULL, NULL, &m_texture, NULL);

 

    這行代碼裝入一個dds文件,而且其它選項都設置為NULL,這時系統會使用裝入文件本身的格式,比如我們裝入的tong.dds, 前面我們為其產生了mipmaps層,並且設置surface格式為DXT5(對應於D3D11中BC3壓縮格式)。這時我們可以看看生成的2d紋理使用了什么設置。

   

    首先在的D3DX11CreateShaderResourceViewFromFile后面添加下面的代碼,以便我們調試觀察紋理格式:

ID3D11Texture2D* tex;
m_texture->GetResource((ID3D11Resource**)&tex);
D3D11_TEXTURE2D_DESC texdesc;
tex->GetDesc(&texdesc);

    設置斷點后,我們可以看到texdesc的內容,Mipmaps為10,紋理格式,為DXGI_FORMAT_BC3_UNORM:

image

現在我們在GraphicsClass類中,裝入一個tong.jpg文件,

// 初始化模型對象.
result = m_Model->Initialize(m_D3D->GetDevice(), L"tong.jpg");

    再觀察texdesc的內容,可以看見mipmaps層是10,但紋理格式卻是DXGI_FORMAT_R8G8B8A8_UNORM,可見默認情況下,系統會幫我們自動創建mipmaps層,但並沒有自動選擇壓縮格式。

image

      如果想讓裝入的jpg格式的紋理也使用壓縮格式該怎么做呢?其實很很簡單,就是在  D3DX11CreateShaderResourceViewFromFile中使用一個裝入圖像信息參數,比如下面的代碼,我們裝入tong.jpg文件時,將會使用DXGI_FORMAT_BC3_UNORM的壓縮格式。

bool TextureClass::Initialize(ID3D11Device* device, WCHAR* filename)
{
    HRESULT result;
    D3DX11_IMAGE_LOAD_INFO loadInfo;
    ZeroMemory( &loadInfo, sizeof(D3DX11_IMAGE_LOAD_INFO) );
    loadInfo.BindFlags = D3D11_BIND_SHADER_RESOURCE;
    loadInfo.Format = DXGI_FORMAT_BC3_UNORM;
    loadInfo.MipLevels = D3DX11_DEFAULT; //這時會產生最大的mipmaps層。
    loadInfo.MipFilter = D3DX11_FILTER_LINEAR;
   


    // 從一個文件創建紋理資源視圖.
    result = D3DX11CreateShaderResourceViewFromFile(device, filename, &loadInfo, NULL, &m_texture, NULL);
    if(FAILED(result))
    {
        return false;
    }

    //這些代碼是調試紋理屬性的...
    ID3D11Texture2D* tex;
    m_texture->GetResource((ID3D11Resource**)&tex);
    D3D11_TEXTURE2D_DESC texdesc;
    tex->GetDesc(&texdesc);
    return true;
}

   觀察texdesc的輸出信息,可以證實我們的設置是有效的。

image

    如果在使用loadInfo的情況下,裝入我們以前的tong.dds,會是什么效果呢?我們設置LoadInfo.Format為DXGI_FORMAT_BC2_UNORM,從下面圖片可以看到此時的Format是BC2,而非tong.dds自己的BC3格式,可見LoadInfo定義的格式將會覆蓋裝入文件自己的格式。

image

當然我們也可以分開創建紋理和紋理資源,效果是一樣,分開創建的代碼如下:

ID3D11Texture2D * pTexture2D = NULL;
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
D3D11_TEXTURE2D_DESC desc;


D3DX11CreateTextureFromFile( device,filename, &loadInfo, NULL,(ID3D11Resource**)(&pTexture2D), NULL );

pTexture2D->GetDesc( &desc );

srvDesc.Format = desc.Format;
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
srvDesc.Texture2D.MostDetailedMip = 0;
srvDesc.Texture2D.MipLevels = desc.MipLevels;

device->CreateShaderResourceView( pTexture2D, &srvDesc, &m_texture );

 

完整的代碼請參考:

工程文件myTutorialD3D11_28

http://files.cnblogs.com/mikewolf2002/d3d1127-28.zip

http://files.cnblogs.com/mikewolf2002/pictures.zip


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM