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)
{
// 如果紋理資源已經存在,則返回,否則創建
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層
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)