# D3D12渲染技术之纹理案例

154 篇文章 33 订阅

## 指定纹理坐标

GeometryGenerator :: CreateBox生成箱子的纹理坐标，以便将整个纹理图像映射到箱子的每个面上。 为简洁起见，我们仅显示正面，背面和顶面的顶点定义。 另请注意，我们省略了顶点构造函数中法线和切线向量的坐标（纹理坐标以粗体显示）。

GeometryGenerator::MeshData GeometryGenerator::CreateBox(
float width, float height, float depth,
uint32 numSubdivisions)
{
MeshData meshData;
Vertex v[24];

float w2 = 0.5f*width;
float h2 = 0.5f*height;
float d2 = 0.5f*depth;

// Fill in the front face vertex data.
v[0] = Vertex(-w2, -h2, -d2, …, 0.0f, 1.0f);
v[1] = Vertex(-w2, +h2, -d2, …, 0.0f, 0.0f);
v[2] = Vertex(+w2, +h2, -d2, …, 1.0f, 0.0f);
v[3] = Vertex(+w2, -h2, -d2, …, 1.0f, 1.0f);

// Fill in the back face vertex data.
v[4] = Vertex(-w2, -h2, +d2, …, 1.0f, 1.0f);
v[5] = Vertex(+w2, -h2, +d2, …, 0.0f, 1.0f);
v[6] = Vertex(+w2, +h2, +d2, …, 0.0f, 0.0f);
v[7] = Vertex(-w2, +h2, +d2, …, 1.0f, 0.0f);
// Fill in the top face vertex data.
v[8] = Vertex(-w2, +h2, -d2, …, 0.0f, 1.0f);
v[9] = Vertex(-w2, +h2, +d2, …, 0.0f, 0.0f);
v[10] = Vertex(+w2, +h2, +d2, …, 1.0f, 0.0f);
v[11] = Vertex(+w2, +h2, -d2, …, 1.0f, 1.0f);


## 创建纹理

// Helper structure to group data related to the texture.
struct Texture
{
// Unique material name for lookup.
std::string Name;

std::wstring Filename;

Microsoft::WRL::ComPtr<ID3D12Resource> Resource = nullptr;
};

std::unordered_map<std::string, std::unique_ptr<Texture>> mTextures;

{
auto woodCrateTex = std::make_unique<Texture>();
woodCrateTex->Name = "woodCrateTex";
woodCrateTex->Filename = L"Textures/WoodCrate01.dds";
ThrowIfFailed(DirectX::CreateDDSTextureFromFile12(md3dDevice.Get(),
mCommandList.Get(), woodCrateTex->Filename.c_str(),

mTextures[woodCrateTex->Name] = std::move(woodCrateTex);
}


## 设置纹理

// Get SRV to texture we want to bind.
CD3DX12_GPU_DESCRIPTOR_HANDLE tex(
mSrvDescriptorHeap->GetGPUDescriptorHandleForHeapStart());
tex.Offset(ri->Mat->DiffuseSrvHeapIndex, mCbvSrvDescriptorSize);

…

// Bind to root parameter 0. The root parameter description specifies which
// shader register slot this corresponds to.
cmdList->SetGraphicsRootDescriptorTable(0, tex);


## 纹理转换

在这里插入代码片// Output vertex attributes for interpolation across triangle.
float4 texC = mul(float4(vin.TexC, 0.0f, 1.0f), gTexTransform);
vout.TexC = mul(texC, gMatTransform).xy;


1、砖纹理沿墙壁被拉伸， 墙顶点当前具有范围[0,1]中的纹理坐标。 我们将纹理坐标放大4倍，以将它们放大到范围[0,4]，这样纹理将在墙上重复四到四次。
2、天空飘动的云层， 通过将纹理坐标转换为时间的函数，云在天空上就可以飘动了。
3、纹理旋转有时对粒子效果非常有用，例如，我们会随着时间的推移旋转火球纹理。

vin.TexC ---> float4(vin.Tex, 0.0f, 1.0f)


vout.TexC = mul(float4(vin.TexC, 0.0f, 1.0f), gTexTransform).xy;


Demo下载地址：链接：https://pan.baidu.com/s/1X0Vikf6qGYGPKU-Nwf-wYA 密码：h79q

02-19 1585
10-04 1219
03-05
07-03 1273
09-28 1263
04-10 318
05-23 3559
01-26 3532
07-12 1802
02-01 6543
09-29 1001
09-30 699
03-23 835
11-22 212
01-23 355

### “相关推荐”对你有帮助么？

• 非常没帮助
• 没帮助
• 一般
• 有帮助
• 非常有帮助

¥2 ¥4 ¥6 ¥10 ¥20

1.余额是钱包充值的虚拟货币，按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载，可以购买VIP、C币套餐、付费专栏及课程。