DirectX 使用深度缓冲

这段代码展示了如何使用DirectX11创建图形渲染管线,包括设备和上下文的创建、交换链、渲染目标、深度缓冲的设置,以及绘制三角形的过程,涉及到顶点缓冲、索引缓冲、着色器的绑定和使用。
#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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值