绘制纹理
基于上一节绘制简单矩形的流程,绘制纹理只需要修改和补充以下几点
1.着色器加入纹理、纹理坐标信息和采样器
//头文件Cube.hlsli
Texture2D g_Tex : register(t0);
SamplerState g_SamLinear : register(s0);
struct VertexIn
{
float3 posL : POSITION;
float2 tex : TEXCOORD;
};
struct VertexOut
{
float4 posH : SV_POSITION;
float2 tex : TEXCOORD;
};
// 像素着色器
#include "Cube.hlsli"
float4 PS(VertexOut pIn) : SV_Target
{
float4 texColor = g_Tex.Sample(g_SamLinear, pIn.tex);
return texColor;
}
2.创建纹理视图和采样器状态
ID3D11ShaderResourceView
ID3D11SamplerState
// 初始化木箱纹理
HR(CreateDDSTextureFromFile(m_pd3dDevice.Get(), L"..\\Texture\\WoodCrate.dds", nullptr, m_pWoodCrate.GetAddressOf()));
// 初始化采样器状态
D3D11_SAMPLER_DESC sampDesc;
ZeroMemory(&sampDesc, sizeof(sampDesc));
sampDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
sampDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP;
sampDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;
sampDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;
sampDesc.ComparisonFunc = D3D11_COMPARISON_NEVER;
sampDesc.MinLOD = 0;
sampDesc.MaxLOD = D3D11_FLOAT32_MAX;
HR(m_pd3dDevice->CreateSamplerState(&sampDesc, m_pSamplerState.GetAddressOf()));
3.像素着色阶段设置采样器和纹理视图
m_pd3dImmediateContext->PSSetSamplers(0, 1, m_pSamplerState.GetAddressOf());
m_pd3dImmediateContext->PSSetShaderResources(0, 1, m_pWoodCrate.GetAddressOf());
注意: 设置时起始的槽索引和着色器中注册采样器和纹理的槽序号对应,这里都使用的索引0