본문 바로가기
공부/DirectX3D

[DirectX3D] PostEffect(상수버퍼를 사용한 Fadein/Fadeout 효과)

by MY블로그 2023. 8. 18.

PostEffect.hlsl Shader 파일에 상수버퍼를 이용한 코드를 추가합니다.

cbuffer PS_Point : register(b11)
{
    float2 Point;
    float Size;
    float PointPadding;
}

Scene Class 헤더 파일에 상수버퍼에 사용할 구조체를 선언합니다.

	private 구역
    struct Point // 상수버퍼용 구조체
	{
		Vector2 point; // 시작지점 변수(x,y)
		float size; // 시야범위 변수
		float padding; // 패딩용 변수
	} _point; 
	ID3D11Buffer* PointBuffer; // 버퍼

	// control을 위한 추가 변수들
	float posx;
	float posy;
	float scale;
	// fadein, fadeout 판별용 bool변수
	bool fade;

Scene Class CPP 파일 내부에서 추가 작업 진행

// 1. 클래스 생성시 초기화
D3D11_BUFFER_DESC desc = { 0 };
desc.ByteWidth = sizeof(Point);
desc.Usage = D3D11_USAGE_DYNAMIC;
desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;//상수버퍼
desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
desc.MiscFlags = 0;
desc.StructureByteStride = 0;
HRESULT hr = D3D->GetDevice()->CreateBuffer(&desc, NULL, &PointBuffer);
assert(SUCCEEDED(hr));
D3D->GetDC()->PSSetConstantBuffers(11, 1, &PointBuffer);
posx = App.GetHalfWidth();
posy = App.GetHalfHeight();
scale = 200;
fade = true;

// 2. Update()함수에서 지속적으로 값을 넣어 갱신함
_point.point.x = posx;
_point.point.y = posy;
_point.size = scale;
D3D11_MAPPED_SUBRESOURCE mappedResource;
D3D->GetDC()->Map(PointBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
memcpy_s(mappedResource.pData, sizeof(Point), &_point, sizeof(Point));
D3D->GetDC()->Unmap(PointBuffer, 0);

// 3. 추가적으로 필요한 기능은 개인 취향껏 구현
Post Effect 기능을 사용한 시야 범위조절 및 fadein, fadeout 효과 구현

gui & dwrite 를 사용하여 런타임중의 값변경을 좌측상단에 표시하였습니다.

시야의 범위가 점점 좁아지면 FadeOut, 점점 넓어지면 Fadein

댓글