#include"mGraphics.h"
#include<xutility> //std::size
#include<DirectXMath.h> //Matrix Vetor
#include<d3dcompiler.h>
#pragma comment(lib,"d3d11.lib")
#pragma comment(lib,"d3dcompiler.lib")
mGraphics::mGraphics(HWND outputWindowHandle)
:outputWindowHandle(outputWindowHandle)
{
DXGI_SWAP_CHAIN_DESC sd = {};
sd.BufferDesc.Width = 0;
sd.BufferDesc.Height = 0;
sd.BufferDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
sd.BufferDesc.RefreshRate.Numerator = 0;
sd.BufferDesc.RefreshRate.Denominator = 0;
sd.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
sd.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
sd.SampleDesc.Count = 1;
sd.SampleDesc.Quality = 0;
sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
sd.BufferCount = 1;
sd.OutputWindow = outputWindowHandle;
sd.Windowed = TRUE;
sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
sd.Flags = 0;
D3D11CreateDeviceAndSwapChain(
nullptr,
D3D_DRIVER_TYPE_HARDWARE,
nullptr,
0,
nullptr,
0,
D3D11_SDK_VERSION,
&sd,
&pSwap,
&pDevice,
nullptr,
&pContext
);
//创建 目标渲染视图
Microsoft::WRL::ComPtr<ID3D11Resource> pBackBuffer;
pSwap->GetBuffer(0, __uuidof(ID3D11Resource), &pBackBuffer); //从交换链获取buffer
pDevice->CreateRenderTargetView(pBackBuffer.Get(), nullptr, &pTarget);
//深度缓冲状态
D3D11_DEPTH_STENCIL_DESC dsDesc; //深度和模板测试的结构体
dsDesc.DepthEnable = TRUE; //开启深度测试
dsDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL; //是否写入深度缓冲"MASK_ALL"或"MASK_ZERO"
dsDesc.DepthFunc = D3D11_COMPARISON_LESS; //比较方式,枚举8种
Microsoft::WRL::ComPtr<ID3D11DepthStencilState> pDSState;
pDevice->CreateDepthStencilState(&dsDesc, &pDSState); //创建深度模板状态对象,封装合并输出阶段的深度模板测试所需信息
pContext->OMSetDepthStencilState(pDSState.Get(), 1u); //参数:深度-模板测试接口指针,模板引用
//创建 2D纹理资源,用于写入深度
D3D11_TEXTURE2D_DESC texDesc{};
texDesc.Width = 800; //宽度纹素数量
texDesc.Height = 600; //高度
texDesc.MipLevels = 1u; //mipmap数量,1u表示一个多采样纹理,0u表示生成完整一套子纹理
texDesc.ArraySize = 1u; //纹理数组中的纹理数
texDesc.Format = DXGI_FORMAT_D32_FLOAT; //存储格式
texDesc.SampleDesc.Count = 1u; //采样描述//每个像素多采样数,1表示无抗锯齿,
texDesc.SampleDesc.Quality = 0u; //质量0~1
texDesc.Usage = D3D11_USAGE_DEFAULT; //访问属性,GPU读写
texDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL; //资源绑定到渲染管线的位置,(使用位运算"|"多选)
Microsoft::WRL::ComPtr<ID3D11Texture2D> pDepthStencil;
pDevice->CreateTexture2D(&texDesc, nullptr, &pDepthStencil);//创建纹理 不需要第二个参数进行 初识化纹理
//创建深度缓冲
D3D11_DEPTH_STENCIL_VIEW_DESC DSVDesc{};
DSVDesc.Format = DXGI_FORMAT_D32_FLOAT; //格式
DSVDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D; //使用2D纹理作为深度缓冲区
DSVDesc.Texture2D.MipSlice = 0u; //union 此处指定使用Texture2D结构体,使用的第一个mipmap索引
pDevice->CreateDepthStencilView(pDepthStencil.Get(), &DSVDesc, &pDSV);//使用纹理创建深度模板缓冲
//在输出 使用深度缓冲
pContext->OMSetRenderTargets(1u, pTarget.GetAddressOf(), pDSV.Get());
}
void mGraphics::EndFrame()
{
pSwap->Present(1u, 0u);
}
void mGraphics::ClearBuffer(float red ,float green,float blue)
{
float color[4]{ red,green,blue,1.f };
pContext->ClearRenderTargetView(pTarget.Get(), color);
pContext->ClearDepthStencilView(pDSV.Get(), D3D11_CLEAR_DEPTH, 1.0f, 0u);//每帧开始时清除深度缓冲
}
void mGraphics::DrawTriangle(float angle,float z)
{
//顶点着色器常量缓冲
struct ConstantBuff
DirectX 使用深度缓冲
于 2022-02-15 20:51:01 首次发布
这段代码展示了如何使用DirectX11创建图形渲染管线,包括设备和上下文的创建、交换链、渲染目标、深度缓冲的设置,以及绘制三角形的过程,涉及到顶点缓冲、索引缓冲、着色器的绑定和使用。

最低0.47元/天 解锁文章
2481

被折叠的 条评论
为什么被折叠?



