Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- DESC
- vertex
- 동기화
- C++
- C언어
- CommandList
- UE4
- DirectX
- Direct3D
- 다이렉트X 튜토리얼
- GPU
- View
- DirectXTK
- 다중표본화
- 프로그래밍
- CPU
- Direct3D Init
- engine
- 게임수학
- 코딩
- swapchain
- Direct Init
- 세팅
- 다이렉트X
- RenderTargetView
- DirectX12
- Input Assembler
- c
- 전처리문
- 다이렉트 초기화
Archives
- Today
- Total
비타Cpp
6장 연습 문제 본문
"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