본문 바로가기

ComputerGraphics/Vulkan

(10)
[Vulkan] Multi Sampling Multisampling우리 프로그램은 이제 텍스처에 대해 여러 수준의 디테일(Level of Detail)을 로드할 수 있게 되었고, 이는 먼 거리에서 객체를 렌더링하건, 해상도가 낮은 상황에서 발생하는 아티팩트를 개선해 줍니다. 결과적으로 이미지는 훨씬 더 부드러워졌지만, 자세히 들여다보면 기하학 도형의 가장자리에 톱니 모양의 들쭉날쭉한 패턴이 여전히 나타나는 것을 확인할 수 있습니다. 아래 이미지로 보면 이해가 잘될겁니다. 이러한 원치 않는 효과는 Aliasing이라고 하며, 이는 화면에 렌더링할 수 있는 픽셀 수가 제한되어 있기 때문에 발생합니다.이를 해결하기 위한 여러 방법들이 있으며, 이번 장에서는 그 중 하나인 Multi Sample Anti Aliasing(MSAA)을 알아볼 것입니다. ..
[Vulkan] Mipmap 이제 우리의 프로그램은 3D 모델을 불러오고 렌더링할 수 있습니다. 이번 장에서는 mipmap 기능을 추가해보겠습니다. Mipmap은 미리 계산된, 축소된 버전의 이미지입니다. 각 mip 이미지의 너비와 높이는 이전 이미지의 절반이며, Level of Detail(LOD)의 일종으로 사용됩니다. 카메라에서 멀리 떨어진 객체는 더 작은 mip 이미지에서 텍스처를 샘플링합니다. 작은 이미지를 사용하면 렌더링 속도가 빨라지고 아티팩트를 방지할 수 있습니다. Image CreationVulkan에서는 각 mip 이미지를 VkImage의 서로 다른 mip level에 저장합니다. mip level 0은 원본 이미지이며, 이후 레벨들은 보통 mip chain이라 불립니다.mip level의 개수는 VkImage..
[Vulkan] VK_ERROR_EXTENSION_NOT_PRESENT 에러 튜토리얼 문서를 다 보고, 파일을 분할하고 있는데 instance를 분할하니까 이런 오류가 나타났다.코드를 수정하지는 않았기 때문에 헤딩을 꽤 했다. 정답은 아래의 코드가 문제였다.std::vector Instance::getRequiredExtensions(){ uint32_t glfwExtensionCount = 0; const char** glfwExtensions; glfwExtensions = glfwGetRequiredInstanceExtensions(&glfwExtensionCount); std::vector extensions(glfwExtensions, glfwExtensions + glfwExtensionCount); if (enableValidationLayers)..
[Vulkan] Loading Models Loading Models이 장에서는 실제 model 파일에서 vertex와 index 데이터를 불러와 그래픽 카드가 더 많은 일을 하도록 확장해보겠습니다.많은 그래픽스 API 튜토리얼에서는 이 단계에서 직접 OBJ 로더를 작성하도록 유도하지만, OBJ 포맷은 skeletal animation처럼 복잡한 기능을 지원하지 않기 때문에 한계가 있습니다.이 장에서는 OBJ 모델에서 mesh 데이터를 불러오되, 파일 파싱 자체보다는 불러온 데이터를 프로그램에 어떻게 통합할지에 초점을 맞춥니다. LibraryOBJ 파일에서 vertex와 face 정보를 불러오기 위해 tinyobjloader 라이브러리를 사용합니다. 이 라이브러리는 빠르고, stb_image처럼 하나의 헤더 파일만 포함하면 되기 때문에 통합이 간..
[Vulkan] Depth Buffer 이번 장에서는 Z 좌표를 도입하여 3D mesh를 위한 기반을 마련해봅시다. 3D Geometry먼저 Vertex position을 vec2 position을 사용중이였는데, 이제 vec3로 변경해봅시다. struct Vertex { glm::vec3 pos; glm::vec3 color; glm::vec2 texCoord; static std::array getAttributeDescriptions() { std::array attributeDescriptions{}; attributeDescriptions[0].binding = 0; attributeDescriptions[0].location = 0; attributeDescri..
[Vulkan] Texture Mapping 우리가 texture mapping을 하기 위해서 아래와 같은 작업을 수행해야됩니다.device 메모리를 기반으로 한 image 객체를 생성한다.image 파일에서 픽셀 데이터를 읽어와 image에 채운다.image sampler를 생성한다.shader에서 texture의 색을 샘플링할 수 있도록, combined image sampler descriptor를 추가한다.image를 만들고 데이터를 채우는 흐름은 vertex buffer 생성과 매우 유사합니다.먼저 staging resource를 만들어 픽셀 데이터를 채운 뒤, 이를 최종 image 객체로 복사합니다.특별히 staging image를 만드는 것도 가능하지만,Vulkan에서는 VkBuffer에서 VkImage 복사도 지원하며, 일부 하드웨어..
[Vulkan] Uniform Buffer Descriptor layout and buffer우리는 이제 각 vertex에 대해 임의의 attribute을 vertex shader에 전달할 수 있게 되었지만, 글로벌 변수는에 대해서는 배우지 않았습니다. 이번 장부터는 3D 그래픽스로 넘어가게 되며, 그에 따라 Model-View-Projection Matrix(일명 MVP matrix)가 필요해집니다.이 행렬을 vertex data로 포함시키는 것도 가능하지만, 그렇게 하면 메모리가 낭비되고, 변환될 때마다 vertex buffer를 갱신해야 합니다. 특히, 변환은 매 프레임마다 생길 수 있기 때문에 비효율적입니다. Vulkan에서 이 문제를 해결하는 좋은 방법은 Resource Descriptor를 사용하는 것입니다.descriptor는 sha..
[Vulkan] Vertex Buffer Vertex Buffer ~ find memory type 날라감 버퍼까지는 잘 만들었지만, 아직 메모리는 할당되지 않았습니다. vkGetBufferMemoryRequirements함수는 메모리 요구사항을 query(질의)하는 함수입니다.(createVertexBuffer에 작성하면 됩니다. ) VkMemoryRequirements memRequirements;vkGetBufferMemoryRequirements(device, vertexBuffer, &memRequirements);VkMemoryRequirements는size, aligment, memoryTypeBits 3가지 필드를 가지고 있습니다. 버퍼의 요구사항, application의 요구사항을 조합해서 올바른 memory type을 선..