Skip to content

Commit 5c54a00

Browse files
+ 第九章的水体项目添加纹理
1 parent 57f5cdb commit 5c54a00

File tree

7 files changed

+173
-28
lines changed

7 files changed

+173
-28
lines changed

Chapter 9 Texturing/Core/Shaders/defaultVS.hlsl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ cbuffer VSConstants : register(b0)
22
{
33
float4x4 modelToWorld;
44
float4x4 gTexTransform;
5+
float4x4 gMatTransform;
56
};
67

78
cbuffer PassConstants : register(b1)
@@ -40,7 +41,7 @@ VertexOut main(VertexIn vin)
4041

4142
// 直接返回纹理
4243
float4 texC = mul(float4(vin.TexC, 0.0f, 1.0f), gTexTransform);
43-
vout.TexC = texC.xy;
44+
vout.TexC = mul(texC, gMatTransform).xy;
4445

4546
return vout;
4647
}

Chapter 9 Texturing/GameApp.cpp

Lines changed: 161 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,9 @@ void GameApp::Cleanup(void)
8585
m_VertexBufferLand.Destroy();
8686
m_IndexBufferLand.Destroy();
8787
m_IndexBufferWaves.Destroy();
88+
89+
m_VertexBufferBox.Destroy();
90+
m_IndexBufferBox.Destroy();
8891
}
8992

9093
void GameApp::Update(float deltaT)
@@ -307,6 +310,7 @@ void GameApp::buildShapesData()
307310
// box
308311
item.modelToWorld = Transpose(Matrix4(AffineTransform(Matrix3::MakeScale(2.0f, 2.0f, 2.0f), Vector3(0.0f, 1.0f, 0.0f))));
309312
item.texTransform = Transpose(Matrix4(kIdentity));
313+
item.matTransform = Transpose(Matrix4(kIdentity));
310314
item.indexCount = (UINT)box.Indices32.size();
311315
item.startIndex = boxIndexOffset;
312316
item.baseVertex = boxVertexOffset;
@@ -319,6 +323,7 @@ void GameApp::buildShapesData()
319323
// grid
320324
item.modelToWorld = Transpose(Matrix4(kIdentity));
321325
item.texTransform = Transpose(Matrix4(AffineTransform(Matrix3::MakeScale(8.0f, 8.0f, 1.0f))));
326+
item.matTransform = Transpose(Matrix4(kIdentity));
322327
item.indexCount = (UINT)grid.Indices32.size();
323328
item.startIndex = gridIndexOffset;
324329
item.baseVertex = gridVertexOffset;
@@ -330,6 +335,7 @@ void GameApp::buildShapesData()
330335

331336

332337
item.texTransform = Transpose(Matrix4(kIdentity));
338+
item.matTransform = Transpose(Matrix4(kIdentity));
333339
for (int i = 0; i < 5; ++i)
334340
{
335341
Matrix4 leftCylWorld = Transpose(Matrix4(AffineTransform(Vector3(-5.0f, 1.5f, -10.0f + i * 5.0f))));
@@ -394,6 +400,7 @@ void GameApp::renderShapes(GraphicsContext& gfxContext)
394400
ObjectConstants obc;
395401
obc.World = item.modelToWorld;
396402
obc.texTransform = item.texTransform;
403+
obc.matTransform = item.matTransform;
397404
gfxContext.SetDynamicConstantBufferView(0, sizeof(obc), &obc);
398405

399406
gfxContext.SetDynamicDescriptor(3, 0, item.srv);
@@ -411,6 +418,13 @@ void GameApp::renderShapes(GraphicsContext& gfxContext)
411418

412419
void GameApp::buildLandAndWaves()
413420
{
421+
TextureManager::Initialize(L"Textures/");
422+
423+
const ManagedTexture* MatTextures[3] = {};
424+
MatTextures[0] = TextureManager::LoadFromFile(L"grass", true);
425+
MatTextures[1] = TextureManager::LoadFromFile(L"water1", true);
426+
MatTextures[2] = TextureManager::LoadFromFile(L"WoodCrate01", true);
427+
414428
GeometryGenerator geoGen;
415429
GeometryGenerator::MeshData grid = geoGen.CreateGrid(160.0f, 160.0f, 50, 50);
416430

@@ -427,6 +441,7 @@ void GameApp::buildLandAndWaves()
427441
vertices[i].Pos = p;
428442
vertices[i].Pos.y = GetHillsHeight(p.x, p.z);
429443
vertices[i].Normal = GetHillsNormal(p.x, p.z);
444+
vertices[i].TexC = grid.Vertices[i].TexC;
430445
}
431446

432447
std::vector<std::uint16_t> indices = grid.GetIndices16();
@@ -458,7 +473,56 @@ void GameApp::buildLandAndWaves()
458473
}
459474
}
460475
m_IndexBufferWaves.Create(L"wave index buff", (UINT)waveIndices.size(), sizeof(std::uint16_t), waveIndices.data());
476+
m_verticesWaves.resize(m_waves.VertexCount());
477+
478+
// box
479+
{
480+
GeometryGenerator geoGen;
481+
GeometryGenerator::MeshData box = geoGen.CreateBox(8.0f, 8.0f, 8.0f, 3);
482+
auto totalVertexCount = box.Vertices.size();
461483

484+
std::vector<Vertex> vertices(totalVertexCount);
485+
486+
UINT k = 0;
487+
for (size_t i = 0; i < box.Vertices.size(); ++i, ++k)
488+
{
489+
vertices[k].Pos = box.Vertices[i].Position;
490+
vertices[k].Normal = box.Vertices[i].Normal;
491+
vertices[k].TexC = box.Vertices[i].TexC;
492+
}
493+
494+
std::vector<std::uint16_t> indices;
495+
indices.insert(indices.end(), std::begin(box.GetIndices16()), std::end(box.GetIndices16()));
496+
497+
// GPUBuff类,自动把对象通过上传缓冲区传到了对应的默认堆中
498+
m_VertexBufferBox.Create(L"vertex buff box", (UINT)vertices.size(), sizeof(Vertex), vertices.data());
499+
m_IndexBufferBox.Create(L"index buff box", (UINT)indices.size(), sizeof(std::uint16_t), indices.data());
500+
}
501+
502+
// build render item
503+
m_renderItemLand.modelToWorld = Transpose(Matrix4(kIdentity));
504+
m_renderItemLand.texTransform = Transpose(Matrix4(AffineTransform(Matrix3::MakeScale(5.0f, 5.0f, 1.0f))));
505+
m_renderItemLand.matTransform = Transpose(Matrix4(kIdentity));
506+
m_renderItemLand.diffuseAlbedo = XMFLOAT4(1.0f, 1.0f, 1.0f, 1.0f);
507+
m_renderItemLand.fresnelR0 = XMFLOAT3(0.01f, 0.01f, 0.01f);
508+
m_renderItemLand.roughness = 0.125f;
509+
m_renderItemLand.srv = MatTextures[0]->GetSRV();
510+
511+
m_renderItemWaves.modelToWorld = Transpose(Matrix4(kIdentity));
512+
m_renderItemWaves.texTransform = Transpose(Matrix4(AffineTransform(Matrix3::MakeScale(5.0f, 5.0f, 1.0f))));
513+
m_renderItemWaves.matTransform = Transpose(Matrix4(kIdentity));
514+
m_renderItemWaves.diffuseAlbedo = XMFLOAT4(1.0f, 1.0f, 1.0f, 1.0f);
515+
m_renderItemWaves.fresnelR0 = XMFLOAT3(0.2f, 0.2f, 0.2f);
516+
m_renderItemWaves.roughness = 0.0f;
517+
m_renderItemWaves.srv = MatTextures[1]->GetSRV();
518+
519+
m_renderItemBox.modelToWorld = Transpose(Matrix4(AffineTransform(Vector3{ 3.0f, 2.0f, -9.0f })));
520+
m_renderItemBox.texTransform = Transpose(Matrix4(kIdentity));
521+
m_renderItemBox.matTransform = Transpose(Matrix4(kIdentity));
522+
m_renderItemBox.diffuseAlbedo = XMFLOAT4(1.0f, 1.0f, 1.0f, 1.0f);
523+
m_renderItemBox.fresnelR0 = XMFLOAT3(0.1f, 0.1f, 0.1f);
524+
m_renderItemBox.roughness = 0.25f;
525+
m_renderItemBox.srv = MatTextures[2]->GetSRV();
462526
}
463527

464528
float GameApp::GetHillsHeight(float x, float z) const
@@ -482,8 +546,6 @@ XMFLOAT3 GameApp::GetHillsNormal(float x, float z)const
482546

483547
void GameApp::renderLandAndWaves(GraphicsContext& gfxContext)
484548
{
485-
gfxContext.SetDynamicConstantBufferView(0, sizeof(m_waveWorld), &m_waveWorld);
486-
487549
PassConstants psc;
488550
// https://www.cnblogs.com/X-Jun/p/9808727.html
489551
// C++代码端进行转置,HLSL中使用matrix(列矩阵)
@@ -503,31 +565,82 @@ void GameApp::renderLandAndWaves(GraphicsContext& gfxContext)
503565
gfxContext.SetDynamicConstantBufferView(1, sizeof(psc), &psc);
504566

505567
// land
506-
// 设置顶点视图
507-
gfxContext.SetVertexBuffer(0, m_VertexBufferLand.VertexBufferView());
508-
// 设置索引视图
509-
gfxContext.SetIndexBuffer(m_IndexBufferLand.IndexBufferView());
568+
{
569+
// 设置顶点视图
570+
gfxContext.SetVertexBuffer(0, m_VertexBufferLand.VertexBufferView());
571+
// 设置索引视图
572+
gfxContext.SetIndexBuffer(m_IndexBufferLand.IndexBufferView());
510573

511-
MaterialConstants mc;
512-
mc.DiffuseAlbedo = { 0.2f, 0.6f, 0.2f, 1.0f };
513-
mc.FresnelR0 = { 0.01f, 0.01f, 0.01f };
514-
mc.Roughness = 0.125f;
515-
gfxContext.SetDynamicConstantBufferView(2, sizeof(mc), &mc);
574+
// 设置常量缓冲区数据
575+
ObjectConstants obc;
576+
obc.World = m_renderItemLand.modelToWorld;
577+
obc.texTransform = m_renderItemLand.texTransform;
578+
obc.matTransform = m_renderItemLand.matTransform;
579+
gfxContext.SetDynamicConstantBufferView(0, sizeof(obc), &obc);
516580

517-
// 绘制
518-
gfxContext.DrawIndexedInstanced(m_IndexBufferLand.GetElementCount(), 1, 0, 0, 0);
581+
gfxContext.SetDynamicDescriptor(3, 0, m_renderItemLand.srv);
582+
583+
MaterialConstants mc;
584+
mc.DiffuseAlbedo = { m_renderItemLand.diffuseAlbedo.x, m_renderItemLand.diffuseAlbedo.y, m_renderItemLand.diffuseAlbedo.z, m_renderItemLand.diffuseAlbedo.w };
585+
mc.FresnelR0 = m_renderItemLand.fresnelR0;
586+
mc.Roughness = m_renderItemLand.roughness;
587+
gfxContext.SetDynamicConstantBufferView(2, sizeof(mc), &mc);
588+
589+
// 绘制
590+
gfxContext.DrawIndexedInstanced(m_IndexBufferLand.GetElementCount(), 1, 0, 0, 0);
591+
}
592+
519593

520594
// waves
521-
gfxContext.SetIndexBuffer(m_IndexBufferWaves.IndexBufferView());
595+
{
596+
gfxContext.SetIndexBuffer(m_IndexBufferWaves.IndexBufferView());
597+
598+
gfxContext.SetDynamicVB(0, m_verticesWaves.size(), sizeof(Vertex), m_verticesWaves.data());
522599

523-
gfxContext.SetDynamicVB(0, m_verticesWaves.size(), sizeof(Vertex), m_verticesWaves.data());
600+
// 设置常量缓冲区数据
601+
ObjectConstants obc;
602+
obc.World = m_renderItemWaves.modelToWorld;
603+
obc.texTransform = m_renderItemWaves.texTransform;
604+
obc.matTransform = Transpose(m_renderItemWaves.matTransform);
605+
gfxContext.SetDynamicConstantBufferView(0, sizeof(obc), &obc);
606+
607+
gfxContext.SetDynamicDescriptor(3, 0, m_renderItemWaves.srv);
608+
609+
MaterialConstants mc;
610+
mc.DiffuseAlbedo = { m_renderItemWaves.diffuseAlbedo.x, m_renderItemWaves.diffuseAlbedo.y, m_renderItemWaves.diffuseAlbedo.z, m_renderItemWaves.diffuseAlbedo.w };
611+
mc.FresnelR0 = m_renderItemWaves.fresnelR0;
612+
mc.Roughness = m_renderItemWaves.roughness;
613+
gfxContext.SetDynamicConstantBufferView(2, sizeof(mc), &mc);
614+
615+
// 绘制
616+
gfxContext.DrawIndexedInstanced(m_IndexBufferWaves.GetElementCount(), 1, 0, 0, 0);
617+
}
618+
619+
// box
620+
{
621+
// 设置顶点视图
622+
gfxContext.SetVertexBuffer(0, m_VertexBufferBox.VertexBufferView());
623+
// 设置索引视图
624+
gfxContext.SetIndexBuffer(m_IndexBufferBox.IndexBufferView());
524625

525-
mc.DiffuseAlbedo = { 0.0f, 0.2f, 0.6f, 1.0f };
526-
mc.FresnelR0 = { 0.1f, 0.1f, 0.1f };
527-
mc.Roughness = 0.0f;
528-
gfxContext.SetDynamicConstantBufferView(2, sizeof(mc), &mc);
529-
// 绘制
530-
gfxContext.DrawIndexedInstanced(m_IndexBufferWaves.GetElementCount(), 1, 0, 0, 0);
626+
// 设置常量缓冲区数据
627+
ObjectConstants obc;
628+
obc.World = m_renderItemBox.modelToWorld;
629+
obc.texTransform = m_renderItemBox.texTransform;
630+
obc.matTransform = m_renderItemBox.matTransform;
631+
gfxContext.SetDynamicConstantBufferView(0, sizeof(obc), &obc);
632+
633+
gfxContext.SetDynamicDescriptor(3, 0, m_renderItemBox.srv);
634+
635+
MaterialConstants mc;
636+
mc.DiffuseAlbedo = { m_renderItemBox.diffuseAlbedo.x, m_renderItemBox.diffuseAlbedo.y, m_renderItemBox.diffuseAlbedo.z, m_renderItemBox.diffuseAlbedo.w };
637+
mc.FresnelR0 = m_renderItemBox.fresnelR0;
638+
mc.Roughness = m_renderItemBox.roughness;
639+
gfxContext.SetDynamicConstantBufferView(2, sizeof(mc), &mc);
640+
641+
// 绘制
642+
gfxContext.DrawIndexedInstanced(m_IndexBufferBox.GetElementCount(), 1, 0, 0, 0);
643+
}
531644
}
532645

533646
void GameApp::UpdateWaves(float deltaT)
@@ -555,14 +668,36 @@ void GameApp::UpdateWaves(float deltaT)
555668
m_waves.Update(deltaT);
556669

557670
// Update the wave vertex buffer with the new solution.
558-
m_verticesWaves.clear();
559671
for (int i = 0; i < m_waves.VertexCount(); ++i)
560672
{
561-
Vertex v;
673+
auto p = &m_verticesWaves[i];
562674

563-
v.Pos = m_waves.Position(i);
564-
v.Normal = m_waves.Normal(i);
675+
p->Pos = m_waves.Position(i);
676+
p->Normal = m_waves.Normal(i);
565677

566-
m_verticesWaves.push_back(v);
678+
// Derive tex-coords from position by
679+
// mapping [-w/2,w/2] --> [0,1]
680+
p->TexC.x = 0.5f + p->Pos.x / m_waves.Width();
681+
p->TexC.y = 0.5f - p->Pos.z / m_waves.Depth();
567682
}
683+
684+
AnimateMaterials(deltaT);
685+
}
686+
687+
void GameApp::AnimateMaterials(float deltaT)
688+
{
689+
// Scroll the water material texture coordinates.
690+
float tu = (float)m_renderItemWaves.matTransform.GetW().GetX();
691+
float tv = (float)m_renderItemWaves.matTransform.GetW().GetY();
692+
693+
tu += 0.1f * deltaT;
694+
tv += 0.02f * deltaT;
695+
696+
if (tu >= 1.0f)
697+
tu -= 1.0f;
698+
699+
if (tv >= 1.0f)
700+
tv -= 1.0f;
701+
702+
m_renderItemWaves.matTransform.SetW({ tu, tv, 0.0f, 1.0f });
568703
}

Chapter 9 Texturing/GameApp.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ class GameApp : public GameCore::IGameApp
2929
{
3030
Matrix4 modelToWorld;
3131
Matrix4 texTransform;
32+
Matrix4 matTransform;
3233
int indexCount;
3334
int startIndex;
3435
int baseVertex;
@@ -45,6 +46,7 @@ class GameApp : public GameCore::IGameApp
4546
XMFLOAT3 GetHillsNormal(float x, float z) const;
4647
void renderLandAndWaves(GraphicsContext& gfxContext);
4748
void UpdateWaves(float deltaT);
49+
void AnimateMaterials(float deltaT);
4850

4951
private:
5052
// 顶点结构体
@@ -73,10 +75,16 @@ class GameApp : public GameCore::IGameApp
7375
// land and waves
7476
StructuredBuffer m_VertexBufferLand;
7577
ByteAddressBuffer m_IndexBufferLand;
78+
renderItem m_renderItemLand;
79+
7680
Waves m_waves{ 128, 128, 1.0f, 0.03f, 4.0f, 0.2f };
7781
ByteAddressBuffer m_IndexBufferWaves;
7882
std::vector<Vertex> m_verticesWaves;
79-
Matrix4 m_waveWorld = Transpose(Matrix4(kIdentity));
83+
renderItem m_renderItemWaves;
84+
// box
85+
StructuredBuffer m_VertexBufferBox;
86+
ByteAddressBuffer m_IndexBufferBox;
87+
renderItem m_renderItemBox;
8088
float mSunTheta = 0.25f * XM_PI;
8189
float mSunPhi = XM_PIDIV4;
8290

341 KB
Binary file not shown.
341 KB
Binary file not shown.
42.8 KB
Binary file not shown.

Chapter 9 Texturing/d3dUtil.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ __declspec(align(16)) struct ObjectConstants
2020
{
2121
Matrix4 World = Matrix4(kIdentity); // 把物体从模型坐标转换到世界坐标
2222
Matrix4 texTransform = Matrix4(kIdentity); // 该顶点所用纹理的转换矩阵
23+
Matrix4 matTransform = Matrix4(kIdentity);
2324
};
2425

2526
__declspec(align(16)) struct PassConstants

0 commit comments

Comments
 (0)