#include "pch.h"
#include "Direct3DBase.h"
using namespace DirectX;
using namespace Microsoft::WRL;
using namespace Windows::UI::Core;
using namespace Windows::Foundation;
using namespace Windows::Graphics::Display;
// 构造函数。
Direct3DBase::Direct3DBase()
{
}
// 初始化运行所需的 Direct3D 资源。
void Direct3DBase::Initialize(CoreWindow^ window)
{
m_window = window;
CreateDeviceResources();
CreateWindowSizeDependentResources();
}
// 重新创建所有设备资源并将其设置回当前状态。
void Direct3DBase::HandleDeviceLost()
{
// 重置这些成员变量,以确保 UpdateForWindowSizeChange 重新创建所有资源。
m_windowBounds.Width = 0;
m_windowBounds.Height = 0;
m_swapChain = nullptr;
CreateDeviceResources();
UpdateForWindowSizeChange();
}
// 以下是依赖设备的资源。
void Direct3DBase::CreateDeviceResources()
{
// 此标志为与 API 默认设置具有不同颜色渠道顺序的图面
// 添加支持。要与 Direct2D 兼容,必须满足此要求。
UINT creationFlags = D3D11_CREATE_DEVICE_BGRA_SUPPORT;
#if defined(_DEBUG)
// 如果项目处于调试生成过程中,请通过带有此标志的 SDK 层启用调试。
creationFlags |= D3D11_CREATE_DEVICE_DEBUG;
#endif
// 此数组定义此应用程序将支持的 DirectX 硬件功能级别组。
// 请注意,应保留顺序。
// 请不要忘记在应用程序的说明中声明其所需的
// 最低功能级别。除非另行说明,否则假定所有应用程序均支持 9.1。
D3D_FEATURE_LEVEL featureLevels[] =
{
D3D_FEATURE_LEVEL_11_1,
D3D_FEATURE_LEVEL_11_0,
D3D_FEATURE_LEVEL_10_1,
D3D_FEATURE_LEVEL_10_0,
D3D_FEATURE_LEVEL_9_3,
D3D_FEATURE_LEVEL_9_2,
D3D_FEATURE_LEVEL_9_1
};
// 创建 Direct3D 11 API 设备对象和对应的上下文。
ComPtr<ID3D11Device> device;
ComPtr<ID3D11DeviceContext> context;
DX::ThrowIfFailed(
D3D11CreateDevice(
nullptr, // 指定 nullptr 以使用默认适配器。
D3D_DRIVER_TYPE_HARDWARE,
nullptr,
creationFlags, // 设置调试和 Direct2D 兼容性标志。
featureLevels, // 此应用程序可以支持的功能级别的列表。
ARRAYSIZE(featureLevels),
D3D11_SDK_VERSION, // 对于 Windows 应用商店应用程序,始终将此值设置为 D3D11_SDK_VERSION。
&device, // 返回创建的 Direct3D 设备。
&m_featureLevel, // 返回所创建设备的功能级别。
&context // 返回设备的即时上下文。
)
);
// 获取 Direct3D 11.1 API 设备和上下文接口。
DX::ThrowIfFailed(
device.As(&m_d3dDevice)
);
DX::ThrowIfFailed(
context.As(&m_d3dContext)
);
}
// 分配在窗口 SizeChanged 事件中更改的所有内存资源。
void Direct3DBase::CreateWindowSizeDependentResources()
{
// 存储窗口绑定,以便下次我们获取 SizeChanged 事件时,可避免
// 在大小相同的情况下重新生成所有内容。
m_windowBounds = m_window->Bounds;
// 计算必要的交换链并呈现目标大小(以像素为单位)。
float windowWidth = ConvertDipsToPixels(m_windowBounds.Width);
float windowHeight = ConvertDipsToPixels(m_windowBounds.Height);
// 交换链的宽度和高度必须基于窗口的
// 横向宽度和高度。如果窗口在纵向
// 方向,则必须使尺寸反转。
m_orientation = DisplayProperties::CurrentOrientation;
bool swapDimensions =
m_orientation == DisplayOrientations::Portrait ||
m_orientation == DisplayOrientations::PortraitFlipped;
m_renderTargetSize.Width = swapDimensions ? windowHeight : windowWidth;
m_renderTargetSize.Height = swapDimensions ? windowWidth : windowHeight;
if(m_swapChain != nullptr)
{
// 如果交换链已存在,请调整其大小。
DX::ThrowIfFailed(
m_swapChain->ResizeBuffers(
2, // 双缓冲交换链。
static_cast<UINT>(m_renderTargetSize.Width),
static_cast<UINT>(m_renderTargetSize.Height),
DXGI_FORMAT_B8G8R8A8_UNORM,
0
)
);
}
else
{
// 否则,使用与现有 Direct3D 设备相同的适配器新建一个。
DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {0};
swapChainDesc.Width = static_cast<UINT>(m_renderTargetSize.Width); // 匹配窗口的大小。
swapChainDesc.Height = static_cast<UINT>(m_renderTargetSize.Height);
swapChainDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; // 这是最常用的交换链格式。
swapChainDesc.Stereo = false;
swapChainDesc.SampleDesc.Count = 1; // 请不要使用多采样。
swapChainDesc.SampleDesc.Quality = 0;
swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
swapChainDesc.BufferCount = 2; // 使用双缓冲最大程度地减小延迟。
swapChainDesc.Scaling = DXGI_SCALING_NONE;
swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; // 所有 Windows 应用商店应用程序都必须使用此 SwapEffect。
swapChainDesc.Flags = 0;
ComPtr<IDXGIDevice1> dxgiDevice;
DX::ThrowIfFailed(
m_d3dDevice.As(&dxgiDevice)
);
ComPtr<IDXGIAdapter> dxgiAdapter;
DX::ThrowIfFailed(
dxgiDevice->GetAdapter(&dxgiAdapter)
);
ComPtr<IDXGIFactory2> dxgiFactory;
DX::ThrowIfFailed(
dxgiAdapter->GetParent(
__uuidof(IDXGIFactory2),
&dxgiFactory
)
);
Windows::UI::Core::CoreWindow^ window = m_window.Get();
DX::ThrowIfFailed(
dxgiFactory->CreateSwapChainForCoreWindow(
m_d3dDevice.Get(),
reinterpret_cast<IUnknown*>(window),
&swapChainDesc,
nullptr, // 在所有显示中都允许。
&m_swapChain
)
);
// 确保 DXGI 不会一次对多个帧排队。这样既可以减小延迟,
// 又可以确保应用程序将只在每个 VSync 之后呈现,从而最大程度地降低功率消耗。
DX::ThrowIfFailed(
dxgiDevice->SetMaximumFrameLatency(1)
);
}
// 为交换链设置正确方向,并生成
// 用于呈现到旋转交换链的 3D 矩阵变换。
DXGI_MODE_ROTATION rotation = DXGI_MODE_ROTATION_UNSPECIFIED;
switch (m_orientation)
{
case DisplayOrientations::Landscape:
rotation = DXGI_MODE_ROTATION_IDENTITY;
m_orientationTransform3D = XMFLOAT4X4( // 0 度 Z 旋转
1.0f, 0.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f
);
break;
case DisplayOrientations::Portrait:
rotation = DXGI_MODE_ROTATION_ROTATE270;
m_orientationTransform3D = XMFLOAT4X4( // 90 度 Z 旋转
0.0f, 1.0f, 0.0f, 0.0f,
-1.0f, 0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f
);
break;
case DisplayOrientations::LandscapeFlipped:
rotation = DXGI_MODE_ROTATION_ROTATE180;
m_orientationTransform3D = XMFLOAT4X4( // 180 度 Z 旋转
-1.0f, 0.0f, 0.0f, 0.0f,
0.0f, -1.0f, 0.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f
);
break;
case DisplayOrientations::PortraitFlipped:
rotation = DXGI_MODE_ROTATION_ROTATE90;
m_orientationTransform3D = XMFLOAT4X4( // 270 度 Z 旋转
0.0f, -1.0f, 0.0f, 0.0f,
1.0f, 0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f
);
break;
default:
throw ref new Platform::FailureException();
}
DX::ThrowIfFailed(
m_swapChain->SetRotation(rotation)
);
// 创建交换链后台缓冲区的呈现目标视图。
ComPtr<ID3D11Texture2D> backBuffer;
DX::ThrowIfFailed(
m_swapChain->GetBuffer(
0,
__uuidof(ID3D11Texture2D),
&backBuffer
)
);
DX::ThrowIfFailed(
m_d3dDevice->CreateRenderTargetView(
backBuffer.Get(),
nullptr,
&m_renderTargetView
)
);
// 创建深度模具视图。
CD3D11_TEXTURE2D_DESC depthStencilDesc(
DXGI_FORMAT_D24_UNORM_S8_UINT,
static_cast<UINT>(m_renderTargetSize.Width),
static_cast<UINT>(m_renderTargetSize.Height),
1,
1,
D3D11_BIND_DEPTH_STENCIL
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
Direct3DApp_HillWaveExample.rar (24个子文件)
Direct3DApp_HillWaveExample
BasicTimer.h 2KB
Renderer.h 1003B
DirectXHelper.h 1000B
SimplePixelShader.hlsl 690B
Direct3DApp_HillWaveExample3.vcxproj 8KB
pch.h 131B
Renderer.cpp 6KB
Package.appxmanifest 1KB
Direct3DApp_HillWaveExample3.vcxproj.filters 2KB
Direct3DApp_HillWaveExample3.h 2KB
WaterModel.cpp 5KB
Assets
SplashScreen.png 2KB
SmallLogo.png 329B
Logo.png 801B
StoreLogo.png 429B
WaterModel.h 823B
pch.cpp 21B
Direct3DBase.cpp 10KB
HillModel.cpp 3KB
SimpleVertexShader.hlsl 830B
Direct3DBase.h 1KB
Direct3DApp_HillWaveExample3.cpp 5KB
Direct3DApp_HillWaveExample3.v11.suo 5KB
HillModel.h 412B
共 24 条
- 1
资源评论
- y_keven2012-12-04对资源的描述一点不详细,下载下来发现与初衷不符合
- joycelwxr2013-09-09good code, it's useful for the learning dx
- 计算机视觉魔术师2014-04-10是windows 8 Metro程序,不是Desktop的,运行了一下,效果不错,代码注释也详细。
RaymondCode
- 粉丝: 133
- 资源: 12
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功