비타Cpp

6장 연습 문제 본문

DirectX12/연습문제

6장 연습 문제

멍C 2021. 8. 12. 16:55

"DirectX 12를 이용한 3D 게임 프로그래밍 입문" 도서의 연습문제 입니다.


1.다음 정점 구조체를 위한 D3D12_INPUT_ELEMENT_DESC 배열을 작성하라.

struct Vertex2
{
    XMFLOAT3 Pos;
    XMFLOAT3 Tangent;
    XMFLOAT3 Normal;
    XMFLOAT2 Tex0;
    XMFLOAT2 Tex1;
    XMFLOAT4 Color;//본문에서는 XMCOLOR지만, 편의를 위해 XMFLOAT4로 변경(XMCOLOR=>ARGB, Direct::Color=>RGBA)
};

 

해답:

mInputLayout =
   {
        { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT,    0, 0,  D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 },
        { "TANGENT" , 0, DXGI_FORMAT_R32G32B32_FLOAT,    0, 12, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 },
        { "NORMAL"  , 0, DXGI_FORMAT_R32G32B32_FLOAT,    0, 24, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 },
        { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT,       0, 36, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 },
        { "TEXCOORD", 1, DXGI_FORMAT_R32G32_FLOAT,       0, 44, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 },
        { "COLOR"   , 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 52, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 }
   };
    
//참고로 color.hlsl의 VertexIn부분은 이렇게 수정해야 한다.
struct VertexIn
{
	float3 PosL  : POSITION;
	float3 Tanget: TANGENT;
	float3 Normal: NORMAL;
	float2 Tex0  : TEXCOORD0;
	float2 Tex1  : TEXCOORD1;
    float4 Color : COLOR;
};

 


 

4.아래 그림에 나온 것 같은 피라미드(사각뿔)의 정점 목록과 색인 목록을 구축해서 그려보라. 밑면은 녹색으로, 꼭대기 정점은 빨간색으로 설정하라.

 

 

해답:

std::array<Vertex, 5> vertices =
    {
        Vertex({ XMFLOAT3(-1.0f, -1.0f, -1.0f), XMFLOAT4(Colors::Green  ) }),//V0
        Vertex({ XMFLOAT3(-1.0f, -1.0f, +1.0f), XMFLOAT4(Colors::Green  ) }),//V1
        Vertex({ XMFLOAT3(+1.0f, -1.0f, -1.0f), XMFLOAT4(Colors::Green  ) }),//V2
        Vertex({ XMFLOAT3(+1.0f, -1.0f, +1.0f), XMFLOAT4(Colors::Green  ) }),//V3
        Vertex({ XMFLOAT3( 0.0f, +1.0f,  0.0f), XMFLOAT4(Colors::Red    ) }) //V4
    };

std::array<std::uint16_t, 18> indices =
{
	//밑면
    0, 1, 2,
    2, 1, 3,

    //앞면
    4, 2, 0,

    //뒷면
    4, 1, 3,

    //왼면
    4, 0, 1,

    //오른면
    4, 3, 2
};


6.상자 예제를, 정점 셰이더에서 정점을 세계공간으로 변환하기 전에 다음과 같은 변환을 적용하도록 수정하라.

vin.PosL.xy += 0.5f*xin(vinL.Pos.x)*sin(3.0f*gTime);
vin.PosL.z *= 0.6f + 0.4f*sin(2.0f*gTime);

 

해답:

먼저 상수구조체인 ObjectConstants에 시간값을 저장할 float 변수를 추가해줍니다.

struct ObjectConstants
{
    XMFLOAT4X4 WorldViewProj = MathHelper::Identity4x4();
    float Time;
};

다음은 Update()에서 ObjectConstants.Time 값에 타이머의 총 시간값을 넣어줍니다.

void BoxApp::Update(const GameTimer& gt)
{
	//.....
    
	// Update the constant buffer with the latest worldViewProj matrix.
	ObjectConstants objConstants;
    XMStoreFloat4x4(&objConstants.WorldViewProj, XMMatrixTranspose(worldViewProj));
    objConstants.Time = gt.TotalTime();
    mObjectCB->CopyData(0, objConstants);
}

그리고 hlsl에 해당 계산식을 넣으면 시간에 따라 육면체가 뒤틀리게 됩니다.

 

Comments