DirectX 11

포워드 렌더링(Forward Rendering) vs 디퍼드 렌더링(Deferred Rendering)

포워드 렌더링 물체를 그리고 그 물체에 대한 라이팅을 적용하는 순서로 렌더링. N개의 광원과 M개의 물체가 있는 씬에서 NxM번의 드로우 콜이 필요하다. 그래서 물체가 많을 때에는 성능 저하가 심하다 디퍼드 렌더링 포워드 렌더링을 사용함으로써 생기는 성능 저하를 방지하게 위해 멀티 렌더 타겟(MRT)를 지원하는 경우 사용할 수 있다. N개의 광원과 M개의 물체가 있는 씬에서 N+M번의 드로우 콜이 필요 과정 1. 모든 물체에 대해 화면 해상도 크기의 렌더 타겟에 물체 고유의 색상(라이트를 적용하기 전 색상을 의미. Material 자체의 Diffuse, Emmisivem, Ambient, Specular 색상), 깊이 값, 노말 벡터 등을 저장 2. 똑같은 크기의 다른 렌더 타겟에 Light를 누적시킨 ..

상수 버퍼, 구조화 버퍼, D3D11_BUFFER_DESC

상수 버퍼 : CPU에서 write해서 GPU로 보내주면 GPU에서는 Read만 가능 구조화 버퍼 : CPU에서 접근 가능 여부를 설정해줄 수 있으며, 이에 따라 바인딩해줘야 하는 자원 뷰(Resource View)가 다르다. 사용자 정의 구조체로 구성할 수 있으며, 대용량 버퍼를 셰이더로 넘겨줘야 할 때 적합 D3D11_USAGE enumeration 설명 D3D11_USAGE_DEFAULT GPU Read & Write -> RWStructuredBuffer에 사용 D3D11_USAGE_IMMUTABLE Only GPU Read(CPU Access, GPU Write 불가) D3D11_USAGE_DYNAMIC CPU Write, GPU Read만 가능 -> 상수 버퍼와 StructuredBuffer에..

ID3D11DeviceContext::Map 상황별 사용

GPU에서 쓴 정보를 CPU로 가져와서 읽을 때 Map // (GPU에서 써준)구조화 버퍼에 있는 본 정보 m_BoneBuffer를 m_BoneDataBuffer로 복사한다. CDevice::GetInst()->GetContext()->CopyResource(m_BoneDataBuffer, m_BoneBuffer->GetBuffer()); D3D11_MAPPED_SUBRESOURCEMap = {}; // D3D11_MAP타입의 3번째 인자는 D3D11_MAP_READ로 CDevice::GetInst()->GetContext()->Map(m_BoneDataBuffer->GetBuffer(), 0, D3D11_MAP_READ, 0, &Map); // m_vecBoneMatrix로 복사 memcpy(&m_ve..

DirectX 2D 포트폴리오 - 메이플 스토리 모작

Limitation - 저번 포트폴리오를 작업할때는 시간에 쫒겨서 작업하느라 이번에는 미리 할 수 있는 작업들은 미리미리 해놓고, 컨텐츠도 무리다 싶으면 과감하게 빼서 여유 있게 마무리해보자는 느낌으로 작업했는데 만들고 보니 생각보다 컨텐츠도 부족하고, 다른 분들의 결과물을 보니 많이 부족하다고 느낀다. 자쿰맵을 만들때 시간이 엄청 오래 걸릴 것으로 예상했는데 생각보다 그렇게 오래 걸리진 않아서 시간이 남으니 거기서 부터 계획이 좀 어긋났던것 같다. 이미 구현한 오브젝트 풀을 사용해봤는데 아무래도 엄청나게 많은 몬스터가 나와서 동시에 여러마리가 죽고 리젠되고 이런 상황이 아니다보니 오브젝트 풀을 써도 성능 개선이 거의 없는 것 같아서 아쉽다. 그리고 언리얼 공부의 중요성을 부쩍 느낀터라, 데드 라인까지 ..

포트폴리오 2022.04.18

Particle 구현을 위한 Structured Buffer, Compute Shader 그리고 Geometry Shader

멀티쓰레드와 구조화버퍼를 이용해서 Compute Shader에서 파티클의 Alive 여부부터 Position, Color 등을 설정하고 Update할 수 있도록 했다. 아래 RWStructuredBuffer는 주석에서도 볼 수 있듯이 C++코드(CPU)에서가 아니라, 셰이더 코드(GPU)에서만 읽기/쓰기가 가능하게 하기 위해서 'RW'를 붙였고 C++코드에서 SRV(Shader Resource View)가 아니라 Unordered Access View(UAV)를 Set해줘야 한다. [numthreads(64, 1, 1)] 이라고 쓰여진 부분은 3차원 Cube를 생각했을때 x, y, z방향으로 각각 64개, 1개, 1개의 그룹을 만든다는 의미이고 64개에 분포되어 들어갈 쓰레드의 수는 C++코드에서 Com..

Texture, Render Target 그리고 Surface란?

렌더 타겟(Render Target) - 말 그대로 Device가 렌더링을 수행할 타겟이 되는 텍스쳐이다. 이미 우리가 알고 있듯이 DirectX에선 Resource를 파이프라인에 직접 바인딩하는 것이 아니라, 그 Resource의 View를 바인딩 해야 한다. 예를 들어, 화면에 무언가 그려내기 위해서는 백버퍼에 그려야 하는데 이 의미는 백버퍼가 렌더 타겟이 된다는 의미이고, 렌더 타겟에 무언가 그리려면 백버퍼에 대한 Render Target View를 Output Merger단계에 바인딩 해야 한다. 백버퍼가 렌더 타겟이 되는 경우가 흔히 아는 경우지만 렌더 타겟을 백버퍼가 아니라 (사용자가 지정한)텍스쳐로 할 수도 있는데, 이때는 렌더링을 텍스쳐의 Surface에 해야 한다. GetBuffer로 백..

[포트폴리오 구조] AlphaBlend 적용 방법

SpriteComponent이던, StaticMeshComponent이던 Material을 갖고 있다. Material은 멤버로 아래와 같은 녀석들을 갖고 있다. CSharedPtr m_Shader; std::vector m_TextureInfo; Vector4 m_BaseColor; float m_Opacity; class CMaterialConstantBuffer* m_CBuffer; CSharedPtr m_RenderStateArray[(int)RenderState_Type::Max]; enum class RenderState_Type { Blend, Rasterizer, DepthStencil, Max }; 여기서 m_RenderStateArray에 RenderState_Type::Blend에 미..

DirectX의 더블 버퍼링

WinAPI에서도 화면에 게임의 장면을 그려내기 위해서 매 프레임마다 화면에 출력을 해줄때 화면이 깜빡거리는 현상이 있었다. 그때는 BitBlt를 이용해서 따로 만들어둔 버퍼에 게임 장면을 다 그리고 화면으로 매 프레임마다 고속 복사 해주는 방식으로 해결했다. DirectX에서는 다르지만 조금 더 효율적인 방법인 '더블 버퍼링(Double Buffering)'이라는 기법으로 깜빡거리는 현상을 해결한다. 위의 사진에서 볼 수 있듯이, 전면버퍼(Front Buffer)와 후면버퍼(Back Buffer) 두개의 버퍼를 둔다. 전면버퍼를 화면에 출력되는 버퍼이고 후면 버퍼는 다음 프레임에 출력될 장면을 그려주는 버퍼이다. 후면버퍼에 다음 프레임 장면을 그려주고 그 장면을 출력할 차례가 되면 후면버퍼였던 버퍼가 ..

안티 앨리어싱(Anti-Aliasing), 멀티 샘플링(Multi-Sampling), 알파 포괄도 변환(Alpha-To-Coverage)

알파 포괄도 변환(Alpha-To-Coverage) BlendState를 만들려고 CreateBlendState를 호출하려고 하면 D3D11_BLEND_DESC를 채워주고 인자로 그 주소값을 넣어줘야 하는데, Description에 보면 AlphaToCoverageEnable라는 멤버가 있다. AlphaToCoverageEnable에 대한 설명을 읽어보자 내가 이해한 것을 쉽게 정리하자면 한 픽셀에서 그 도형에서 차지하는 비율과 알파를 곱한 것이다. 예를 들어서 어떤 한 픽셀의 면적의 0.3만큼 어떤 도형이 차지하고, 그 픽셀 알파값이 0.5면 0.3 * 0.5 = 0.15로 그 픽셀의 알파값을 정하는 것이다. 이렇게 하면 경계선이 약간 blur처리된 것 처럼 보여서 계단 현상이 완화될 수도 있을 것 같..