• Home
  • About
    • 게임 개발자 유정룡 photo

      게임 개발자 유정룡

      포트폴리오

    • Learn More
    • Email
    • Github
    • Bitbucket
  • Projects
    • All Projects
    • All Tags

Direct3D11 공부 40일차(RenderTarget)

02 Aug 2021

Reading time ~2 minutes

RenderTarget

화면은 파이프 라인의 마지막 단계 OM을 거쳐 RTV(RenderTargetView)에 연결된 BackBuffer로 랜더 되어 출력이 된다.

현재 사용하고 있는 D3D클래스를 보면 RTV와 Backbuffer(texture)가 있다.

RTV와 Backbuffer를 서로 연결 해주고, OM에서 RTV를 거쳐 System에 RTV에 연결되어 있던 Backbuffer에 랜더가 되고 Backbuffer에 랜더된 Texture가 Present에 호출에 의해 화면에 출력이 된다.

이것을 활용해서 블러효과나 흑백효과등 화면 자체에 이펙트를 주는 PostEffect를 만들 수 있다.

RenderTarget Class

RenderTarget.h
#pragma once

class RenderTarget
{
public:
	RenderTarget(UINT width = 0, UINT height = 0, DXGI_FORMAT format = DXGI_FORMAT_R8G8B8A8_UNORM);
	~RenderTarget();

	ID3D11RenderTargetView* RTV() { return rtv; }
	ID3D11ShaderResourceView* SRV() { return srv; }

	void SaveTexture(wstring file);

	void PreRender(class DepthStencil* depthStencil);

private:
	UINT width, height;
	DXGI_FORMAT format;

	ID3D11Texture2D* texture;
	ID3D11RenderTargetView* rtv;
	ID3D11ShaderResourceView* srv;
};
RenderTarget.cpp
#include "Framework.h"
#include "RenderTarget.h"

RenderTarget::RenderTarget(UINT width, UINT height, DXGI_FORMAT format)
	: format(format)
{
	this->width = (width < 1) ? (UINT)D3D::Width() : width;
	this->height = (height < 1) ? (UINT)D3D::Height() : height;

	D3D11_TEXTURE2D_DESC textureDesc;
	ZeroMemory(&textureDesc, sizeof(D3D11_TEXTURE2D_DESC));
	textureDesc.Width = this->width;
	textureDesc.Height = this->height;
	textureDesc.ArraySize = 1;
	textureDesc.Format = format;
	textureDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
	textureDesc.MipLevels = 1;
	textureDesc.SampleDesc.Count = 1;
	Check(D3D::GetDevice()->CreateTexture2D(&textureDesc, NULL, &texture));

	D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
	ZeroMemory(&rtvDesc, sizeof(D3D11_RENDER_TARGET_VIEW_DESC));
	rtvDesc.Format = format;
	rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
	Check(D3D::GetDevice()->CreateRenderTargetView(texture, &rtvDesc, &rtv));

	D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
	ZeroMemory(&srvDesc, sizeof(D3D11_SHADER_RESOURCE_VIEW_DESC));
	srvDesc.Format = format;
	srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
	srvDesc.Texture2D.MipLevels = 1;
	Check(D3D::GetDevice()->CreateShaderResourceView(texture, &srvDesc, &srv));
}

RenderTarget::~RenderTarget()
{
	SafeRelease(texture);
	SafeRelease(rtv);
	SafeRelease(srv);
}

void RenderTarget::SaveTexture(wstring file)
{
	Check(D3DX11SaveTextureToFile(D3D::GetDC(), texture, D3DX11_IFF_PNG, file.c_str()));
}

void RenderTarget::PreRender(DepthStencil * depthStencil)
{
	D3D::GetDC()->OMSetRenderTargets(1, &rtv, depthStencil->DSV());
	D3D::Get()->Clear(Color(0,0,0,1), rtv, depthStencil->DSV());
}

현재 화면이나 원하는 크기를 받아와서 텍스처를 만들어 준다.

그런 뒤, RenderTargetView를 만들고, ResourceView를 만들어준다.

DepthTencil Class

DepthTencil.h
#pragma once

class RenderTarget
{
public:
	RenderTarget(UINT width = 0, UINT height = 0, DXGI_FORMAT format = DXGI_FORMAT_R8G8B8A8_UNORM);
	~RenderTarget();

	ID3D11RenderTargetView* RTV() { return rtv; }
	ID3D11ShaderResourceView* SRV() { return srv; }

	void SaveTexture(wstring file);

	void PreRender(class DepthStencil* depthStencil);

private:
	UINT width, height;
	DXGI_FORMAT format;

	ID3D11Texture2D* texture;
	ID3D11RenderTargetView* rtv;
	ID3D11ShaderResourceView* srv;
};
DepthTencil.cpp

```#include “Framework.h” #include “RenderTarget.h”

RenderTarget::RenderTarget(UINT width, UINT height, DXGI_FORMAT format) : format(format) { this->width = (width < 1) ? (UINT)D3D::Width() : width; this->height = (height < 1) ? (UINT)D3D::Height() : height;

D3D11_TEXTURE2D_DESC textureDesc;
ZeroMemory(&textureDesc, sizeof(D3D11_TEXTURE2D_DESC));
textureDesc.Width = this->width;
textureDesc.Height = this->height;
textureDesc.ArraySize = 1;
textureDesc.Format = format;
textureDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
textureDesc.MipLevels = 1;
textureDesc.SampleDesc.Count = 1;
Check(D3D::GetDevice()->CreateTexture2D(&textureDesc, NULL, &texture));

D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
ZeroMemory(&rtvDesc, sizeof(D3D11_RENDER_TARGET_VIEW_DESC));
rtvDesc.Format = format;
rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
Check(D3D::GetDevice()->CreateRenderTargetView(texture, &rtvDesc, &rtv));

D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
ZeroMemory(&srvDesc, sizeof(D3D11_SHADER_RESOURCE_VIEW_DESC));
srvDesc.Format = format;
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
srvDesc.Texture2D.MipLevels = 1;
Check(D3D::GetDevice()->CreateShaderResourceView(texture, &srvDesc, &srv)); }

RenderTarget::~RenderTarget() { SafeRelease(texture); SafeRelease(rtv); SafeRelease(srv); }

void RenderTarget::SaveTexture(wstring file) { Check(D3DX11SaveTextureToFile(D3D::GetDC(), texture, D3DX11_IFF_PNG, file.c_str())); }

void RenderTarget::PreRender(DepthStencil * depthStencil) { D3D::GetDC()->OMSetRenderTargets(1, &rtv, depthStencil->DSV()); D3D::Get()->Clear(Color(0,0,0,1), rtv, depthStencil->DSV()); }

```

그려지는 오브젝트의 깊이를 판단하여 어떤 오브젝트를 그려줄지 결정해준다.



DirectX Share Tweet +1