본문 바로가기
Kua Devlog/DirectX12

DX12 3D 게임 프로그래밍 입문 연습문제 6장-2

by Dev-WhaleShark 2020. 9. 2.

해당 포스트는 DirectX12를 이용한 3D 게임 프로그래밍 입문 서적에 출제되는 
각 챕터의 연습문제들에 대한 저의 풀이입니다.

문제가 간단하거나 설명 또는 증명과 같은 방식의 문제 또는 제가 해결하지 못한 문제들은 스킵하였습니다.


연습문제 8

상자 예제를, 상자를 와이어프레임 모드로 렌더링 하도록 수정하라.

간단하게 PSO(piperine state object)에서 RasterizerState Desc의 FillMode를 D3D12_FILL_MODE_WIREFRAME로 지정해줍니다.

psoDesc.RasterizerState.FillMode = D3D12_FILL_MODE_WIREFRAME;


연습문제 9

상자 예제에서 후면 선별을 비활성화하라 또한 후면 선별 대신 전면 선별을 사용해보라.

PSO에서 RasterizerState Desc의 CullMode
D3D12_CULL_MODE_FRONT(전면 선별)
D3D12_CULL_MODE_NONE(선별 X)
D3D12_CULL_MODE_BACK(후면 선별)

결과는 다음과 같습니다.


연습문제 12 

상자 예제에서 뷰포트를 후면 버퍼의 왼쪽 절반으로 설정하라.

다음과 같이 간단하게 설정할 수 있습니다.

mScreenViewport.Width    = static_cast<float>(mClientWidth / 2);


연습문제 13

가위 판정을 도입해서, 후면 버퍼 중심에 놓인 너비 mClientWidth / 2, 높이 mClientHeight / 2
직사각형 외부에 있는 모든 픽셀을 폐기하라.

mScissorRect = { 0, 0, mClientWidth / 2, mClientHeight / 2 };

위와 같이 설정해주면 됩니다.


연습문제 14

상자 예제를, 상수 버퍼를 이용해서 색상이 시간에 따라 애니메이션이 되도록 수정하라.
매끄러운 가감속 함수를 이용해서 색이 자연스럽게 변하게 할 것.

부드러운 색상 변환 애니메이션을 위해 계속해서 변하는 값을 상수 버퍼로 올려줍니다.
연습 문제6에서 상수 버퍼에 추가한 시간 gTime을 사용해 PS(픽셀 셰이더)를 수정해줍니다.

float4 PS(VertexOut pin) : SV_Target
{

	float4 SmoothColor = pin.Color;
	SmoothColor.x = smoothstep(0, 1, sin(gTime));
	
	return SmoothColor;
}

smoothstep는 HLSL의 내장함수입니다.

smoothstep(min, max, x)
x가 min~max 사이의 값인 경우에 대해 0,1사이에서 부드럽게 변하는 에르미트 보간법(Hermite interpolation)을 반환합니다.
자세한 사항은 위키 백과나 HLSL 문서를 참고해주세요.

다음과 같이 색상이 부드럽게 변하는 모습을 보실 수 있습니다.


연습문제 15

float4 PS(VertexOut pin) : SV_Target
{
	clip(pin.Color.r - 0.5f);
	return pin.Color;
}

픽셀 셰이더를 다음과 같이 수정하고 실행해본 뒤 내장함수 clip가 하는 일을 추측하라.

clip(x) 인자값 x가 0보다 작으면 현재 픽셀들을 버립니다.


연습문제 16

상자 예제를, 픽셀 셰이더가 보간된 정점 색상과 상수 버퍼를 통해 주어진 gPulseColor 색상 사이에서 매끄럽게 진동하는 색상을 출력하도록 수정하라.

gTime처럼 상수 버퍼로 gPulseColor을 추가해줍니다.

struct ObjectConstants
{
	XMFLOAT4X4 WorldViewProj = MathHelper::Identity4x4();
	float Time = 0.0f;
	XMFLOAT4 pColor;
};

추가 후 update에서 pColor 설정해주고

objConstants.pColor = XMFLOAT4(Colors::Red);

셰이더 코드를 연습문제와 같이 수정해줍니다.

cbuffer cbPerObject : register(b0)
{
	float4x4 gWorldViewProj; 
	float gTime;
	float4 gPulseColor;
};


float4 PS(VertexOut pin) : SV_Target
{
	const float pi = 3.1415926;

	float s = 0.5 * sin(2 * gTime - 0.25f * pi) + 0.5f;
	float4 c = lerp(pin.Color, gPulseColor, s);

	return c;
}

'Kua Devlog > DirectX12' 카테고리의 다른 글

DX12 3D 게임 프로그래밍 입문 연습문제 6장-1  (1) 2020.09.01