공부/Graphics, DirectX, 포트폴리오 구조 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에 미..

[포트폴리오 구조] ResourceManager, SceneResource 그리고 각종 Manager들의 관계

1. SceneResource는 특정 Scene에만 존재하는 Resource들을 Scene마다 개별적으로 관리하게 위해 존재하는 녀석 2. 기본적으로 SceneResource에 있는건 모두 ResourceManager에도 있다 3. ResourceManager는 여러개의 매니저들(MeshManager, ShaderManager, MaterialManager, TextureManager, AnimationManager)들을 관리하고, 해당 리소스에 대한 요청을하면 ResourceManager는 해당 매니저에게 똑같은 이름의 함수를 중간에서 호출해주고 결과를 받을 뿐이다. 실질적인 동작은 각각의 매니저들이 해준다. 예를 들어서 SceneResource::LoadSequence2D를 호출하면 SceneReso..

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처리된 것 처럼 보여서 계단 현상이 완화될 수도 있을 것 같..

DirectX 용어 정리

DirectX 수업을 들으면서 개인적으로 헷갈리거나 추상적으로 느껴지는 용어들을 정리해두려고 한다 * 검색해가면서 공부한 정보들을 모은거라 틀린 부분이 있을 수 있습니다 * 엔진 - 게임 제작에 필요한 라이브러리를 모아놓은 것 드라이버 - 렌더링에 필요한 GPU에게 명령을 내릴 수 있게 만든 객체 SDK(Sofeware Development Kit) - 개발자들이 개발하는데 사용하는 도구. 컴파일러, 디버거, 문서, 라이브러리, API 등이 포함될 수 있다 뷰포트 - 간단하게 말하면 윈도우에 보여질 영역을 의미한다. DirectX에서는 뷰포트에 화면을 출력하고, 뷰포트를 윈도우 클라이언트 영역에 맞춰서 윈도우에 보여질 수 있게 한다고 한다 페이지 플리핑 - 백버퍼와 화면 버퍼를 스왑해주는 기법. 예를 들..