Skip to content

Commit 032aa49

Browse files
+ 第九章基础代码(拷贝自第八章)
1 parent 2bd8a9f commit 032aa49

File tree

254 files changed

+121894
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

254 files changed

+121894
-0
lines changed

Chapter 9 Texturing/Chapter 9 Texturing.vcxproj

Lines changed: 433 additions & 0 deletions
Large diffs are not rendered by default.

Chapter 9 Texturing/Chapter 9 Texturing.vcxproj.filters

Lines changed: 828 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 189 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,189 @@
1+
//
2+
// Copyright (c) Microsoft. All rights reserved.
3+
// This code is licensed under the MIT License (MIT).
4+
// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
5+
// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
6+
// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
7+
// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
8+
//
9+
// Developed by Minigraph
10+
//
11+
// Author: James Stanard
12+
//
13+
14+
#include "pch.h"
15+
#include "BufferManager.h"
16+
#include "GraphicsCore.h"
17+
#include "CommandContext.h"
18+
#include "EsramAllocator.h"
19+
20+
namespace Graphics
21+
{
22+
DepthBuffer g_SceneDepthBuffer;
23+
ColorBuffer g_SceneColorBuffer;
24+
ColorBuffer g_OverlayBuffer;
25+
ColorBuffer g_HorizontalBuffer;
26+
27+
DXGI_FORMAT DefaultHdrColorFormat = DXGI_FORMAT_R11G11B10_FLOAT;
28+
}
29+
30+
#define T2X_COLOR_FORMAT DXGI_FORMAT_R10G10B10A2_UNORM
31+
#define HDR_MOTION_FORMAT DXGI_FORMAT_R16G16B16A16_FLOAT
32+
#define DSV_FORMAT DXGI_FORMAT_D32_FLOAT
33+
34+
void Graphics::InitializeRenderingBuffers( uint32_t bufferWidth, uint32_t bufferHeight )
35+
{
36+
GraphicsContext& InitContext = GraphicsContext::Begin();
37+
38+
// const uint32_t bufferWidth1 = (bufferWidth + 1) / 2;
39+
// const uint32_t bufferWidth2 = (bufferWidth + 3) / 4;
40+
// const uint32_t bufferWidth3 = (bufferWidth + 7) / 8;
41+
// const uint32_t bufferWidth4 = (bufferWidth + 15) / 16;
42+
// const uint32_t bufferWidth5 = (bufferWidth + 31) / 32;
43+
// const uint32_t bufferWidth6 = (bufferWidth + 63) / 64;
44+
// const uint32_t bufferHeight1 = (bufferHeight + 1) / 2;
45+
// const uint32_t bufferHeight2 = (bufferHeight + 3) / 4;
46+
// const uint32_t bufferHeight3 = (bufferHeight + 7) / 8;
47+
// const uint32_t bufferHeight4 = (bufferHeight + 15) / 16;
48+
// const uint32_t bufferHeight5 = (bufferHeight + 31) / 32;
49+
// const uint32_t bufferHeight6 = (bufferHeight + 63) / 64;
50+
51+
EsramAllocator esram;
52+
53+
esram.PushStack();
54+
55+
g_SceneColorBuffer.Create(L"Main Color Buffer", bufferWidth, bufferHeight, 1, DefaultHdrColorFormat, esram);
56+
// g_VelocityBuffer.Create(L"Motion Vectors", bufferWidth, bufferHeight, 1, DXGI_FORMAT_R32_UINT);
57+
// g_PostEffectsBuffer.Create(L"Post Effects Buffer", bufferWidth, bufferHeight, 1, DXGI_FORMAT_R32_UINT);
58+
59+
esram.PushStack(); // Render HDR image
60+
61+
// g_LinearDepth[0].Create(L"Linear Depth 0", bufferWidth, bufferHeight, 1, DXGI_FORMAT_R16_UNORM);
62+
// g_LinearDepth[1].Create(L"Linear Depth 1", bufferWidth, bufferHeight, 1, DXGI_FORMAT_R16_UNORM);
63+
// g_MinMaxDepth8.Create(L"MinMaxDepth 8x8", bufferWidth3, bufferHeight3, 1, DXGI_FORMAT_R32_UINT, esram);
64+
// g_MinMaxDepth16.Create(L"MinMaxDepth 16x16", bufferWidth4, bufferHeight4, 1, DXGI_FORMAT_R32_UINT, esram);
65+
// g_MinMaxDepth32.Create(L"MinMaxDepth 32x32", bufferWidth5, bufferHeight5, 1, DXGI_FORMAT_R32_UINT, esram);
66+
67+
g_SceneDepthBuffer.Create(L"Scene Depth Buffer", bufferWidth, bufferHeight, DSV_FORMAT, esram);
68+
69+
// esram.PushStack(); // Begin opaque geometry
70+
//
71+
// esram.PushStack(); // Begin Shading
72+
//
73+
// g_SSAOFullScreen.Create(L"SSAO Full Res", bufferWidth, bufferHeight, 1, DXGI_FORMAT_R8_UNORM);
74+
//
75+
// esram.PushStack(); // Begin generating SSAO
76+
// g_DepthDownsize1.Create(L"Depth Down-Sized 1", bufferWidth1, bufferHeight1, 1, DXGI_FORMAT_R32_FLOAT, esram);
77+
// g_DepthDownsize2.Create(L"Depth Down-Sized 2", bufferWidth2, bufferHeight2, 1, DXGI_FORMAT_R32_FLOAT, esram);
78+
// g_DepthDownsize3.Create(L"Depth Down-Sized 3", bufferWidth3, bufferHeight3, 1, DXGI_FORMAT_R32_FLOAT, esram);
79+
// g_DepthDownsize4.Create(L"Depth Down-Sized 4", bufferWidth4, bufferHeight4, 1, DXGI_FORMAT_R32_FLOAT, esram);
80+
// g_DepthTiled1.CreateArray(L"Depth De-Interleaved 1", bufferWidth3, bufferHeight3, 16, DXGI_FORMAT_R16_FLOAT, esram);
81+
// g_DepthTiled2.CreateArray(L"Depth De-Interleaved 2", bufferWidth4, bufferHeight4, 16, DXGI_FORMAT_R16_FLOAT, esram);
82+
// g_DepthTiled3.CreateArray(L"Depth De-Interleaved 3", bufferWidth5, bufferHeight5, 16, DXGI_FORMAT_R16_FLOAT, esram);
83+
// g_DepthTiled4.CreateArray(L"Depth De-Interleaved 4", bufferWidth6, bufferHeight6, 16, DXGI_FORMAT_R16_FLOAT, esram);
84+
// g_AOMerged1.Create(L"AO Re-Interleaved 1", bufferWidth1, bufferHeight1, 1, DXGI_FORMAT_R8_UNORM, esram);
85+
// g_AOMerged2.Create(L"AO Re-Interleaved 2", bufferWidth2, bufferHeight2, 1, DXGI_FORMAT_R8_UNORM, esram);
86+
// g_AOMerged3.Create(L"AO Re-Interleaved 3", bufferWidth3, bufferHeight3, 1, DXGI_FORMAT_R8_UNORM, esram);
87+
// g_AOMerged4.Create(L"AO Re-Interleaved 4", bufferWidth4, bufferHeight4, 1, DXGI_FORMAT_R8_UNORM, esram);
88+
// g_AOSmooth1.Create(L"AO Smoothed 1", bufferWidth1, bufferHeight1, 1, DXGI_FORMAT_R8_UNORM, esram);
89+
// g_AOSmooth2.Create(L"AO Smoothed 2", bufferWidth2, bufferHeight2, 1, DXGI_FORMAT_R8_UNORM, esram);
90+
// g_AOSmooth3.Create(L"AO Smoothed 3", bufferWidth3, bufferHeight3, 1, DXGI_FORMAT_R8_UNORM, esram);
91+
// g_AOHighQuality1.Create(L"AO High Quality 1", bufferWidth1, bufferHeight1, 1, DXGI_FORMAT_R8_UNORM, esram);
92+
// g_AOHighQuality2.Create(L"AO High Quality 2", bufferWidth2, bufferHeight2, 1, DXGI_FORMAT_R8_UNORM, esram);
93+
// g_AOHighQuality3.Create(L"AO High Quality 3", bufferWidth3, bufferHeight3, 1, DXGI_FORMAT_R8_UNORM, esram);
94+
// g_AOHighQuality4.Create(L"AO High Quality 4", bufferWidth4, bufferHeight4, 1, DXGI_FORMAT_R8_UNORM, esram);
95+
// esram.PopStack(); // End generating SSAO
96+
//
97+
// g_ShadowBuffer.Create(L"Shadow Map", 2048, 2048, esram);
98+
//
99+
// esram.PopStack(); // End Shading
100+
//
101+
// esram.PushStack(); // Begin depth of field
102+
// g_DoFTileClass[0].Create(L"DoF Tile Classification Buffer 0", bufferWidth4, bufferHeight4, 1, DXGI_FORMAT_R11G11B10_FLOAT);
103+
// g_DoFTileClass[1].Create(L"DoF Tile Classification Buffer 1", bufferWidth4, bufferHeight4, 1, DXGI_FORMAT_R11G11B10_FLOAT);
104+
//
105+
// g_DoFPresortBuffer.Create(L"DoF Presort Buffer", bufferWidth1, bufferHeight1, 1, DXGI_FORMAT_R11G11B10_FLOAT, esram);
106+
// g_DoFPrefilter.Create(L"DoF PreFilter Buffer", bufferWidth1, bufferHeight1, 1, DXGI_FORMAT_R11G11B10_FLOAT, esram);
107+
// g_DoFBlurColor[0].Create(L"DoF Blur Color", bufferWidth1, bufferHeight1, 1, DXGI_FORMAT_R11G11B10_FLOAT, esram);
108+
// g_DoFBlurColor[1].Create(L"DoF Blur Color", bufferWidth1, bufferHeight1, 1, DXGI_FORMAT_R11G11B10_FLOAT, esram);
109+
// g_DoFBlurAlpha[0].Create(L"DoF FG Alpha", bufferWidth1, bufferHeight1, 1, DXGI_FORMAT_R8_UNORM, esram);
110+
// g_DoFBlurAlpha[1].Create(L"DoF FG Alpha", bufferWidth1, bufferHeight1, 1, DXGI_FORMAT_R8_UNORM, esram);
111+
// g_DoFWorkQueue.Create(L"DoF Work Queue", bufferWidth4 * bufferHeight4, 4, esram);
112+
// g_DoFFastQueue.Create(L"DoF Fast Queue", bufferWidth4 * bufferHeight4, 4, esram);
113+
// g_DoFFixupQueue.Create(L"DoF Fixup Queue", bufferWidth4 * bufferHeight4, 4, esram);
114+
// esram.PopStack(); // End depth of field
115+
//
116+
// g_TemporalColor[0].Create(L"Temporal Color 0", bufferWidth, bufferHeight, 1, DXGI_FORMAT_R16G16B16A16_FLOAT);
117+
// g_TemporalColor[1].Create(L"Temporal Color 1", bufferWidth, bufferHeight, 1, DXGI_FORMAT_R16G16B16A16_FLOAT);
118+
// TemporalEffects::ClearHistory(InitContext);
119+
//
120+
// esram.PushStack(); // Begin motion blur
121+
// g_MotionPrepBuffer.Create(L"Motion Blur Prep", bufferWidth1, bufferHeight1, 1, HDR_MOTION_FORMAT, esram);
122+
// esram.PopStack(); // End motion blur
123+
//
124+
// esram.PopStack(); // End opaque geometry
125+
//
126+
// esram.PopStack(); // End HDR image
127+
//
128+
// esram.PushStack(); // Begin post processing
129+
//
130+
// // This is useful for storing per-pixel weights such as motion strength or pixel luminance
131+
// g_LumaBuffer.Create(L"Luminance", bufferWidth, bufferHeight, 1, DXGI_FORMAT_R8_UNORM, esram);
132+
// g_Histogram.Create(L"Histogram", 256, 4, esram);
133+
//
134+
// // Divisible by 128 so that after dividing by 16, we still have multiples of 8x8 tiles. The bloom
135+
// // dimensions must be at least 1/4 native resolution to avoid undersampling.
136+
// //uint32_t kBloomWidth = bufferWidth > 2560 ? Math::AlignUp(bufferWidth / 4, 128) : 640;
137+
// //uint32_t kBloomHeight = bufferHeight > 1440 ? Math::AlignUp(bufferHeight / 4, 128) : 384;
138+
// uint32_t kBloomWidth = bufferWidth > 2560 ? 1280 : 640;
139+
// uint32_t kBloomHeight = bufferHeight > 1440 ? 768 : 384;
140+
//
141+
// esram.PushStack(); // Begin bloom and tone mapping
142+
// g_LumaLR.Create(L"Luma Buffer", kBloomWidth, kBloomHeight, 1, DXGI_FORMAT_R8_UINT, esram);
143+
// g_aBloomUAV1[0].Create(L"Bloom Buffer 1a", kBloomWidth, kBloomHeight, 1, DefaultHdrColorFormat, esram);
144+
// g_aBloomUAV1[1].Create(L"Bloom Buffer 1b", kBloomWidth, kBloomHeight, 1, DefaultHdrColorFormat, esram);
145+
// g_aBloomUAV2[0].Create(L"Bloom Buffer 2a", kBloomWidth / 2, kBloomHeight / 2, 1, DefaultHdrColorFormat, esram);
146+
// g_aBloomUAV2[1].Create(L"Bloom Buffer 2b", kBloomWidth / 2, kBloomHeight / 2, 1, DefaultHdrColorFormat, esram);
147+
// g_aBloomUAV3[0].Create(L"Bloom Buffer 3a", kBloomWidth / 4, kBloomHeight / 4, 1, DefaultHdrColorFormat, esram);
148+
// g_aBloomUAV3[1].Create(L"Bloom Buffer 3b", kBloomWidth / 4, kBloomHeight / 4, 1, DefaultHdrColorFormat, esram);
149+
// g_aBloomUAV4[0].Create(L"Bloom Buffer 4a", kBloomWidth / 8, kBloomHeight / 8, 1, DefaultHdrColorFormat, esram);
150+
// g_aBloomUAV4[1].Create(L"Bloom Buffer 4b", kBloomWidth / 8, kBloomHeight / 8, 1, DefaultHdrColorFormat, esram);
151+
// g_aBloomUAV5[0].Create(L"Bloom Buffer 5a", kBloomWidth / 16, kBloomHeight / 16, 1, DefaultHdrColorFormat, esram);
152+
// g_aBloomUAV5[1].Create(L"Bloom Buffer 5b", kBloomWidth / 16, kBloomHeight / 16, 1, DefaultHdrColorFormat, esram);
153+
// esram.PopStack(); // End tone mapping
154+
//
155+
// esram.PushStack(); // Begin antialiasing
156+
// const uint32_t kFXAAWorkSize = bufferWidth * bufferHeight / 4 + 128;
157+
// g_FXAAWorkQueue.Create(L"FXAA Work Queue", kFXAAWorkSize, sizeof(uint32_t), esram);
158+
// g_FXAAColorQueue.Create(L"FXAA Color Queue", kFXAAWorkSize, sizeof(uint32_t), esram);
159+
// g_FXAAWorkCounters.Create(L"FXAA Work Counters", 2, sizeof(uint32_t));
160+
// InitContext.ClearUAV(g_FXAAWorkCounters);
161+
// esram.PopStack(); // End antialiasing
162+
//
163+
// esram.PopStack(); // End post processing
164+
//
165+
// esram.PushStack(); // GenerateMipMaps() test
166+
// g_GenMipsBuffer.Create(L"GenMips", bufferWidth, bufferHeight, 0, DXGI_FORMAT_R11G11B10_FLOAT, esram);
167+
// esram.PopStack();
168+
169+
g_OverlayBuffer.Create(L"UI Overlay", g_DisplayWidth, g_DisplayHeight, 1, DXGI_FORMAT_R8G8B8A8_UNORM, esram);
170+
g_HorizontalBuffer.Create(L"Bicubic Intermediate", g_DisplayWidth, bufferHeight, 1, DefaultHdrColorFormat, esram);
171+
172+
esram.PopStack(); // End final image
173+
174+
InitContext.Finish();
175+
}
176+
177+
void Graphics::ResizeDisplayDependentBuffers(uint32_t NativeWidth, uint32_t NativeHeight)
178+
{
179+
g_OverlayBuffer.Create(L"UI Overlay", g_DisplayWidth, g_DisplayHeight, 1, DXGI_FORMAT_R8G8B8A8_UNORM);
180+
g_HorizontalBuffer.Create(L"Bicubic Intermediate", g_DisplayWidth, NativeHeight, 1, DefaultHdrColorFormat);
181+
}
182+
183+
void Graphics::DestroyRenderingBuffers()
184+
{
185+
g_SceneDepthBuffer.Destroy();
186+
g_SceneColorBuffer.Destroy();
187+
g_OverlayBuffer.Destroy();
188+
g_HorizontalBuffer.Destroy();
189+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
//
2+
// Copyright (c) Microsoft. All rights reserved.
3+
// This code is licensed under the MIT License (MIT).
4+
// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
5+
// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
6+
// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
7+
// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
8+
//
9+
// Developed by Minigraph
10+
//
11+
// Author: James Stanard
12+
//
13+
14+
#pragma once
15+
16+
#include "ColorBuffer.h"
17+
#include "DepthBuffer.h"
18+
#include "GpuBuffer.h"
19+
#include "GraphicsCore.h"
20+
21+
namespace Graphics
22+
{
23+
extern DepthBuffer g_SceneDepthBuffer; // D32_FLOAT_S8_UINT
24+
extern ColorBuffer g_SceneColorBuffer; // R11G11B10_FLOAT
25+
extern ColorBuffer g_OverlayBuffer; // R8G8B8A8_UNORM
26+
extern ColorBuffer g_HorizontalBuffer; // For separable (bicubic) upsampling
27+
28+
void InitializeRenderingBuffers(uint32_t NativeWidth, uint32_t NativeHeight );
29+
void ResizeDisplayDependentBuffers(uint32_t NativeWidth, uint32_t NativeHeight);
30+
void DestroyRenderingBuffers();
31+
32+
} // namespace Graphics

Chapter 9 Texturing/Core/Camera.cpp

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
//
2+
// Copyright (c) Microsoft. All rights reserved.
3+
// This code is licensed under the MIT License (MIT).
4+
// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
5+
// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
6+
// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
7+
// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
8+
//
9+
// Developed by Minigraph
10+
//
11+
// Author: James Stanard
12+
//
13+
14+
#include "pch.h"
15+
#include "Camera.h"
16+
#include <cmath>
17+
18+
using namespace Math;
19+
20+
void BaseCamera::SetLookDirection( Vector3 forward, Vector3 up )
21+
{
22+
// Given, but ensure normalization
23+
Scalar forwardLenSq = LengthSquare(forward);
24+
forward = Select(forward * RecipSqrt(forwardLenSq), -Vector3(kZUnitVector), forwardLenSq < Scalar(0.000001f));
25+
26+
// Deduce a valid, orthogonal right vector
27+
Vector3 right = Cross(forward, up);
28+
Scalar rightLenSq = LengthSquare(right);
29+
right = Select(right * RecipSqrt(rightLenSq), Quaternion(Vector3(kYUnitVector), -XM_PIDIV2) * forward, rightLenSq < Scalar(0.000001f));
30+
31+
// Compute actual up vector
32+
up = Cross(right, forward);
33+
34+
// Finish constructing basis
35+
m_Basis = Matrix3(right, up, -forward);
36+
m_CameraToWorld.SetRotation(Quaternion(m_Basis));
37+
}
38+
39+
void BaseCamera::Update()
40+
{
41+
m_PreviousViewProjMatrix = m_ViewProjMatrix;
42+
43+
m_ViewMatrix = Matrix4(~m_CameraToWorld);
44+
m_ViewProjMatrix = m_ProjMatrix * m_ViewMatrix;
45+
m_ReprojectMatrix = m_PreviousViewProjMatrix * Invert(GetViewProjMatrix());
46+
47+
m_FrustumVS = Frustum( m_ProjMatrix );
48+
m_FrustumWS = m_CameraToWorld * m_FrustumVS;
49+
}
50+
51+
52+
void Camera::UpdateProjMatrix( void )
53+
{
54+
float Y = 1.0f / std::tanf( m_VerticalFOV * 0.5f );
55+
float X = Y * m_AspectRatio;
56+
57+
float Q1, Q2;
58+
59+
// ReverseZ puts far plane at Z=0 and near plane at Z=1. This is never a bad idea, and it's
60+
// actually a great idea with F32 depth buffers to redistribute precision more evenly across
61+
// the entire range. It requires clearing Z to 0.0f and using a GREATER variant depth test.
62+
// Some care must also be done to properly reconstruct linear W in a pixel shader from hyperbolic Z.
63+
if (m_ReverseZ)
64+
{
65+
Q1 = m_NearClip / (m_FarClip - m_NearClip);
66+
Q2 = Q1 * m_FarClip;
67+
}
68+
else
69+
{
70+
Q1 = m_FarClip / (m_NearClip - m_FarClip);
71+
Q2 = Q1 * m_NearClip;
72+
}
73+
74+
SetProjMatrix( Matrix4(
75+
Vector4( X, 0.0f, 0.0f, 0.0f ),
76+
Vector4( 0.0f, Y, 0.0f, 0.0f ),
77+
Vector4( 0.0f, 0.0f, Q1, -1.0f ),
78+
Vector4( 0.0f, 0.0f, Q2, 0.0f )
79+
) );
80+
}

0 commit comments

Comments
 (0)