@@ -85,6 +85,9 @@ void GameApp::Cleanup(void)
85
85
m_VertexBufferLand.Destroy ();
86
86
m_IndexBufferLand.Destroy ();
87
87
m_IndexBufferWaves.Destroy ();
88
+
89
+ m_VertexBufferBox.Destroy ();
90
+ m_IndexBufferBox.Destroy ();
88
91
}
89
92
90
93
void GameApp::Update (float deltaT)
@@ -307,6 +310,7 @@ void GameApp::buildShapesData()
307
310
// box
308
311
item.modelToWorld = Transpose (Matrix4 (AffineTransform (Matrix3::MakeScale (2 .0f , 2 .0f , 2 .0f ), Vector3 (0 .0f , 1 .0f , 0 .0f ))));
309
312
item.texTransform = Transpose (Matrix4 (kIdentity ));
313
+ item.matTransform = Transpose (Matrix4 (kIdentity ));
310
314
item.indexCount = (UINT)box.Indices32 .size ();
311
315
item.startIndex = boxIndexOffset;
312
316
item.baseVertex = boxVertexOffset;
@@ -319,6 +323,7 @@ void GameApp::buildShapesData()
319
323
// grid
320
324
item.modelToWorld = Transpose (Matrix4 (kIdentity ));
321
325
item.texTransform = Transpose (Matrix4 (AffineTransform (Matrix3::MakeScale (8 .0f , 8 .0f , 1 .0f ))));
326
+ item.matTransform = Transpose (Matrix4 (kIdentity ));
322
327
item.indexCount = (UINT)grid.Indices32 .size ();
323
328
item.startIndex = gridIndexOffset;
324
329
item.baseVertex = gridVertexOffset;
@@ -330,6 +335,7 @@ void GameApp::buildShapesData()
330
335
331
336
332
337
item.texTransform = Transpose (Matrix4 (kIdentity ));
338
+ item.matTransform = Transpose (Matrix4 (kIdentity ));
333
339
for (int i = 0 ; i < 5 ; ++i)
334
340
{
335
341
Matrix4 leftCylWorld = Transpose (Matrix4 (AffineTransform (Vector3 (-5 .0f , 1 .5f , -10 .0f + i * 5 .0f ))));
@@ -394,6 +400,7 @@ void GameApp::renderShapes(GraphicsContext& gfxContext)
394
400
ObjectConstants obc;
395
401
obc.World = item.modelToWorld ;
396
402
obc.texTransform = item.texTransform ;
403
+ obc.matTransform = item.matTransform ;
397
404
gfxContext.SetDynamicConstantBufferView (0 , sizeof (obc), &obc);
398
405
399
406
gfxContext.SetDynamicDescriptor (3 , 0 , item.srv );
@@ -411,6 +418,13 @@ void GameApp::renderShapes(GraphicsContext& gfxContext)
411
418
412
419
void GameApp::buildLandAndWaves ()
413
420
{
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
+
414
428
GeometryGenerator geoGen;
415
429
GeometryGenerator::MeshData grid = geoGen.CreateGrid (160 .0f , 160 .0f , 50 , 50 );
416
430
@@ -427,6 +441,7 @@ void GameApp::buildLandAndWaves()
427
441
vertices[i].Pos = p;
428
442
vertices[i].Pos .y = GetHillsHeight (p.x , p.z );
429
443
vertices[i].Normal = GetHillsNormal (p.x , p.z );
444
+ vertices[i].TexC = grid.Vertices [i].TexC ;
430
445
}
431
446
432
447
std::vector<std::uint16_t > indices = grid.GetIndices16 ();
@@ -458,7 +473,56 @@ void GameApp::buildLandAndWaves()
458
473
}
459
474
}
460
475
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 ();
461
483
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 ();
462
526
}
463
527
464
528
float GameApp::GetHillsHeight (float x, float z) const
@@ -482,8 +546,6 @@ XMFLOAT3 GameApp::GetHillsNormal(float x, float z)const
482
546
483
547
void GameApp::renderLandAndWaves (GraphicsContext& gfxContext)
484
548
{
485
- gfxContext.SetDynamicConstantBufferView (0 , sizeof (m_waveWorld), &m_waveWorld);
486
-
487
549
PassConstants psc;
488
550
// https://www.cnblogs.com/X-Jun/p/9808727.html
489
551
// C++代码端进行转置,HLSL中使用matrix(列矩阵)
@@ -503,31 +565,82 @@ void GameApp::renderLandAndWaves(GraphicsContext& gfxContext)
503
565
gfxContext.SetDynamicConstantBufferView (1 , sizeof (psc), &psc);
504
566
505
567
// 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 ());
510
573
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);
516
580
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
+
519
593
520
594
// 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 ());
522
599
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 ());
524
625
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
+ }
531
644
}
532
645
533
646
void GameApp::UpdateWaves (float deltaT)
@@ -555,14 +668,36 @@ void GameApp::UpdateWaves(float deltaT)
555
668
m_waves.Update (deltaT);
556
669
557
670
// Update the wave vertex buffer with the new solution.
558
- m_verticesWaves.clear ();
559
671
for (int i = 0 ; i < m_waves.VertexCount (); ++i)
560
672
{
561
- Vertex v ;
673
+ auto p = &m_verticesWaves[i] ;
562
674
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);
565
677
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 ();
567
682
}
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 });
568
703
}
0 commit comments