Directx11教程40 紋理映射(10)
本章嘗試使用紋理行列式,或者說紋理數組,在ps中,使用2個紋理,最終的像素顏色,是光照顏色*紋理1采樣顏色*紋理2采樣顏色,主要是想達到如下的效果:
把這兩個圖像以及光照產生的顏色融合生成以下圖像:
為此我們新建一個lighttex2.ps文件,在其中定義:
//兩個紋理,可用於紋理混合,bump mapping等等
Texture2D shaderTexture[2];
SamplerState SampleType;
…
float4 textureColor1 = shaderTexture[0].Sample(SampleType, input.tex);
float4 textureColor2 = shaderTexture[1].Sample(SampleType, input.tex);
…
textureColor = saturate((textureColor1 + textureColor2)/2.0);
//2.2是gamma校正值
finalcolor = finalcolor * pow(textureColor, 2.2)
另外定義一個LightTex2ShaderClass,專門用來處理lightex2.vs和lighttex2.ps,在該類中,我們通過
// 設置ps shader資源.
deviceContext->PSSetShaderResources(0, 2, texArray);
裝入一個紋理數組。
最後就是Graphics渲染類的修改,我們在左側再畫一面墻,是用一個紋理,而正面的墻,使用紋理融合。
m_textures[0] = m_TexManager->createTex(m_D3D->GetDevice(),string("stone01.dds"));
m_textures[1] = m_TexManager->createTex(m_D3D->GetDevice(),string("dirt01.dds"));
…
//執行平移操作,得到最終的模型世界矩陣
D3DXMatrixRotationX(&worldMatrix1, -1.57); //pai/2
D3DXMatrixTranslation(&worldMatrix2, 0.0, 0.0, 8.0);
D3DXMatrixMultiply(&worldMatrix3, &worldMatrix1, &worldMatrix2);
result = m_LightTex2Shader->Render(m_D3D->GetDeviceContext(), m_PlaneModel->GetIndexCount(), worldMatrix3, viewMatrix, projectionMatrix,
light, material, camera,m_textures);
if(!result)
{
return false;
}
//執行平移操作,得到最終的模型世界矩陣
D3DXMatrixRotationZ(&worldMatrix1, -1.57); //pai/2
D3DXMatrixTranslation(&worldMatrix2, -10.0, 0.0, 0.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;
}
程序執行的界面如下:
完整的代碼請參考:
工程文件myTutorialD3D11_35
代碼下載:
http://files.cnblogs.com/mikewolf2002/d3d1127-28.zip
http://files.cnblogs.com/mikewolf2002/pictures.zip
Directx11教程40 紋理映射(10)