DirectX
-
[53] - Lighting(Illumination) - 2Graphics 2021. 9. 15. 18:18
이전에 이론적으로 Phong 모델이 무엇인지 공부했습니다. 이번에는 D3D을 바탕으로 구현한 Engine을 뜯어보면서 어떤 식으로 구성하면 좋을지 배워봅니다. (hw3d/hw3d at T24.1-End · planetchili/hw3d (github.com)) Chili에게 많은 Insight을 얻을 수 있습니다. 비록 영어이긴 하지만 양질의 정보를 제공해줍니다. ((28) C++ 3D DirectX Tutorial [Dynamic Lighting / Graphics Debugger] Part 1 - YouTube) 3D fundamental 시리즈는 솔직히 Fundamental이라고 볼 수 없는 난이도였습니다. 설명도 부족하고 알아듣기도 어려워서 3D graphics의 기초는 대학 강의시간에 배웠던 것..
-
[52] - Lighting(Illumination)Graphics 2021. 9. 13. 21:43
일반적으로 빛을 받는 부분은 밝고 빛을 덜 받는 부분은 상대적으로 어둡습니다. 물체의 뒷면은 빛이 잘 들지 않아 그림자가 생기기도 합니다. 그림자는 따로 배우고 빛이 받는 부분에 대한 Shading을 배워봅니다. Illumination은 기본적으로 광[光]의 변화 및 조건에 따른 색깔[Colour]의 변화에 주된 목적이 있습니다. Phong model 가장 널리 알려지고 자주 사용되는 대표적인 Lighting 모델입니다. 물론 Phong model보다 나은 모델들이 여러 존재하긴 하지만 배우는 입장에선 기본부터 하는 것이 좋다고 생각합니다. Physically Based Rendering(PBR)이라는 스키마도 존재하긴 합니다. 이 Phong model은 크게 네 가지 요소들로 이루어져 있습니다. 1. ..
-
[51] - imguiGraphics 2021. 8. 28. 23:23
(ocornut/imgui: Dear ImGui: Bloat-free Graphical User interface for C++ with minimal dependencies (github.com)) Imgui이라고 하며 GUI[Graphical User Interface]입니다. IM은 Immediate Mode의 약자이며 GUI는 흔히 쓰는 그대로 Graphical User Interface입니다. 대부분 C++로 작성되었으며 Platform independent입니다. 따라서 OpenGL이든 D3D이든 Vulkan이든 적당히 버무려서 사용할 수 있습니다. IMGUI의 Core을 떼어다가 적당히 손을 보면 된다는 뜻입니다. 게다가 이미 만들어져 있는 특정 플랫폼을 위한 Adapter들도 상당히 많이 ..
-
[50] - Texture - 2Graphics 2021. 8. 26. 23:17
Texture에 대한 약간의 공부를 진행했습니다. Texture, texel, pixel 등 이들이 어떻게 관리되고 어떤 식으로 Mapping이 되는지 개략적인 이해는 했습니다. D3D에서는 이 Texture을 어떤 식으로 관리할 수 있을지 배워봅니다. Pixel은 모호하게 표현하면 하나의 이미지와 같습니다. 따라서 우리는 가장 먼저 이미지를 우리의 Engine에 불러올 수 있도록 할 라이브러리가 필요합니다. 여기에는 많은 Tool이 존재합니다. DirectX Toolkit에도 이미지를 불러올 수 있는 기능이 존재하지만 이것을 사용하게 되면 Texture에 대한 많은 부분이 Black Box인 상태로 남기 때문에 공부를 하는 목적에 부합하지 않습니다. 따라서 이는 협상의 여지가 없이 GDI Plus라는 ..
-
[49] - Texture - 1Graphics 2021. 8. 17. 17:47
육면체는 총 8개의 Vertices가 있고 Vertex Shader - Tessellation - Geometry Shader 등을 거쳐서 Fragment/Pixel Shader에 이르면 최종적인 외형을 결정하게 됩니다. 최종적 외형[最終的外形]이라는 것은 Colour, Illumination, Texture 등등을 이릅니다. 오늘은 Image Texturing에 대한 공부를 할 것입니다. Rasterization에서 Fragment를 생성했으니 이들은 다음 Shader로 넘어갑니다. 그 전에 Fragment Shader와 Pixel Shader의 차이점이 있는지 확인해 봅니다. 크게 다른 점은 없고 OpenGL과 D3D의 단어 선택적 차이와 Graphics Pipepline을 구성하는 약간의 구조적인 ..
-
[48] - RasterizationGraphics 2021. 8. 13. 22:30
Rasterization Texture에 대한 공부를 하려면 Rasterization Stage에 대한 공부를 해야 합니다. Rasterization 전 단계까지 예를 들어서 정점[Vertex]이 여덟 개인 육면체를 CPU로부터 넘겨받았다고 가정하겠습니다. IA Stage에서 받은 이 Vertex들은 삼각형의 조각으로 정리가 됩니다. 한첨 전에 배운 것을 떠올려 보면 Vertex의 stride를 정의하고 Description을 정의하던 파트가 분명 존재했습니다. figure 1b의 ByteWidth, StrcutureByteStride와 같은 Description을 통해서 버퍼의 정보를 정해주어 전달을 받은 Vertex를삼각형으로 재구성합니다. 이렇게 처리된 Vertex들을 Rasterization 단계..
-
[31] - (C++) For each, Move Semantics, Lambdas, Uniform Initialization - 3Graphics 2021. 8. 5. 15:12
Lambdas 오래 전에 웹 파이썬 프로그래밍 수업을 들을 때 처음 접했던 개념입니다. 학기가 끝나갈 무렵, 앞으로 이런 것들을 공부할 것이라며 알려주었던 기억이 납니다. 전날 눈이 쏟아져 온세상이 차분하게 가라앉은 어느 겨울이었습니다. 돌이켜보면 그 순간과 지금 이 순간 저는 별로 변한 것이 없습니다. 참 괴로운 일이 아닐 수 없습니다. MSDN의 기본적인 설명은 Lambda는 함수의 argument나 촉발된 곳에서 Anonymous function object의 정의를 간편하게 해주기 위해 C++11 표준부터 지원된 기능이라고 합니다. Anonymous Function(closure)역시 lambda의 다른 이름입니다. 더 엄밀하게 표현을 하면 closure는 lambda expression을 Enc..
-
[30] - (C++) For each, Move Semantics, Lambdas, Uniform Initialization - 2Graphics 2021. 8. 3. 21:24
아직 Move semantics에 대한 이야기가 끝난 것이 아닙니다. 이 move constructor가 언제 호출되는지 알아야 실험 코드를 작성하든 말든 할 것입니다. 그런데 어떤 상황에서는 move ctor가 호출이 되어야 하는데 호출이 안 되는 경우가 있었습니다. 반대로 안 되어야 하는데 되는 경우도 있었습니다. 그래서 애를 많이 먹었는데 이유를 찾아보니 C++17 표준부터 규칙이 약간 바뀌었다는 점과 컴파일러에 달렸다는 사실을 알게 되었습니다. 그리고 오류가 나지 않은 것은 단순히 운이 좋았던 것 뿐이라는 사실도 알았습니다. 기본적으로 다음의 이유들이 move ctor을 invoke합니다. 1. 어떤 object가 std::move로 생성될 때. 2. 어떤 object가 std::forward(s..