1. 程式人生 > >Directx11教程39 紋理映射(9)

Directx11教程39 紋理映射(9)

準備 dx11 mes tran ice mfile 產生 ref 綠色

原文:Directx11教程39 紋理映射(9)

    在myTutorialD3D11_32中,我們在PlaneModelClass中增加一個紋理TextureClass* m_Texture;讀入一個grass的紋理,程序執行後的效果如下:

技術分享圖片

完整的代碼請參考:

工程文件myTutorialD3D11_32

代碼下載:

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

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

      在myTutorialD3D11_33中,我們移去了Model類中的紋理資源視圖成員變量,同時也移去了textureclass類,而用一個紋理管理類TexManagerClass管理所有的紋理資源,這樣的話,可以更方便的管理紋理,之前把紋理資源放在每個Model 類中,這樣每個模型只能對應一個紋理,很不方便。

     紋理管理類很簡單,就是用一個vector存儲所有的紋理資源視圖std::vector<ID3D11ShaderResourceView*> m_TextureRVs;資源管理類會存儲資源的名字,以及資源本身,通過createTex函數返回紋理資源,如果紋理資源不存在,創建紋理資源。

ID3D11ShaderResourceView* TexManagerClass::createTex(ID3D11Device* device,string filename)
    {

    // 如果紋理資源已經存在,則返回,否則創建

    for(int i = 0; i < m_TextureRVs.size(); ++i)
        if(! m_TextureNames[i].compare(filename) )
            return m_TextureRVs[i];

    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;

    ID3D11ShaderResourceView* rv = 0;

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

    m_TextureNames.push_back(filename);
    m_TextureRVs.push_back(rv);

    return rv;
    }

    在GraphicsClass中,我們定義成員變量TexManagerClass*  m_TexManager;在渲染函數中,最後一個參數直接用m_TexManager->createTex(m_D3D->GetDevice(),string("grass.dds"))這樣的方式得到紋理資源。

//把plane頂點和索引數據放入緩沖區,準備渲染
m_PlaneModel->Render(m_D3D->GetDeviceContext());
//用light shader texture渲染

result = m_LightTexShader->Render(m_D3D->GetDeviceContext(), m_PlaneModel->GetIndexCount(), worldMatrix, viewMatrix, projectionMatrix,
    light, material, camera,m_TexManager->createTex(m_D3D->GetDevice(),string("grass.dds")));
if(!result)
    {
    return false;
    }

//執行平移操作,得到最終的模型世界矩陣
D3DXMatrixRotationX(&worldMatrix1, -1.57); //pai/2
D3DXMatrixTranslation(&worldMatrix2, 0.0, 0.0, 8.0);
D3DXMatrixMultiply(&worldMatrix3, &worldMatrix1, &worldMatrix2);
result = m_LightTexShader->Render(m_D3D->GetDeviceContext(), m_PlaneModel->GetIndexCount(), worldMatrix3, viewMatrix, projectionMatrix,
    light, material, camera,m_TexManager->createTex(m_D3D->GetDevice(),string("stone01.dds")));
if(!result)
    {
    return false;
    }

程序執行後界面如下,因為兩個平面使用的是同一個model,漫反射系數一樣,所以正面的墻也有綠色。

技術分享圖片

   在myTutorialD3D11_34中,我們改變ps代碼,直接使用紋理做為Kd,這樣效果就好很多。

技術分享圖片

  

完整的代碼請參考:

工程文件myTutorialD3D11_33

工程文件myTutorialD3D11_34

代碼下載:

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

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

Directx11教程39 紋理映射(9)