(转载请注明出处)
有点时间没更新了,原因是找了一个多星期的bug结果发现是少了一次加法运算。。。。
不过反正没人看也就没影响啦!_(:3」∠)_
这次的目的是做一个旋转的彩色立方体:
这是自己在学D3D11的时候做过的一个例子,现在搬到D3D12上, 这次增加的内容有:
- 常量缓存
- 深度缓存
顶点/索引缓存
- 常量缓存, 常量缓存可以放一些GPU只读的数据, 这里就是存放的是转换矩阵,D3D12中,常量缓存是以256字节对齐的(D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT), 所以请注意.
这样可以创建一个常量缓存并创建CBV绑定到一个DESCRIPTOR上
- 常量缓存, 常量缓存可以放一些GPU只读的数据, 这里就是存放的是转换矩阵,D3D12中,常量缓存是以256字节对齐的(D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT), 所以请注意.
// 创建常量缓存
if (SUCCEEDED(hr)) {
hr = m_pd3dDevice->CreateCommittedResource(
&CD3D12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_UPLOAD),
D3D12_HEAP_MISC_NONE,
&CD3D12_RESOURCE_DESC::Buffer(D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT),
D3D12_RESOURCE_USAGE_GENERIC_READ,
nullptr,
IID_ID3D12Resource,
reinterpret_cast<void**>(&m_pCBufferMatrix)
);
}
// 绑定到常量缓存视图
if (SUCCEEDED(hr)) {
D3D12_CONSTANT_BUFFER_VIEW_DESC cbvDesc = {};
cbvDesc.BufferLocation = m_pCBufferMatrix->GetGPUVirtualAddress();
cbvDesc.SizeInBytes = D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT;
m_pd3dDevice->CreateConstantBufferView(
&cbvDesc,
m_aCpuHandleCSU[CSU_MatrixCBuffer]
);
}
这部分代码中, 使用D3D12_HEAP_TYPE_UPLOAD是因为我们每帧都要改写,这样比较方便, 相应的, 效率可能就会损失点.
还有就是之前提到的把所有相同的DESCRIPTOR集中放到一起, 所以写了个简单的框架, 使用m_aCpuHandleXXX数组存放的.
我们在这里存放3个矩阵: 世界、视角、透视转换矩阵
2. 深度缓存, 深度缓存的作用就不用说了, 灵活使用可以获取到不错的效果, 创建DSV绑定到DESCRIPTOR. 这里不使用模板, 仅仅使用深度:
// 创建深度缓存
if (SUCCEEDED(hr)) {
D3D12_RESOURCE_DESC resourceDesc = CD3D12_RESOURCE_DESC::Tex2D(
DXGI_FORMAT_R32_TYPELESS, m_uBufferWidth, m_uBufferHeight,
1, 1, 1, 0,
D3D12_RESOURCE_MISC_ALLOW_DEPTH_STENCIL,
D3D12_TEXTURE_LAYOUT_UNKNOWN, 0
);
D3D12_CLEAR_VALUE dsvClearValue;
dsvClearValue.Format = DXGI_FORMAT_D32_FLOAT;
dsvClearValue.DepthStencil.Depth = 1.0f;
dsvClearValue.DepthStencil.Stencil = 0;
hr = m_pd3dDevice->CreateCommittedResource(
&CD3D12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT),
D3D12_HEAP_MISC_NONE,
&resourceDesc,
D3D12_RESOURCE_USAGE_DEPTH,
&dsvClearValue,
II