전체 글(30)
-
Vulkan - 2. 안녕 삼각형
개요3D 그래픽스 API를 가르칠 때는 삼각형을 먼저 그려 봅니다. 벌칸의 경우 GLFW랑 같이 쓰는 기준으로 삼각형을 그리는 데 약 1000행 정도 필요한데요, 그래픽스 파이프라인을 세팅하고 삼각형을 그리는 데 어떤 것이 필요한지 하나씩 만들어 보고 삼각형을 띄우며, 대충 개발자가 세팅한 것들이 어떤 식으로 돌아가는지 머리 속에 그림을 그려 봅시다.오른쪽 스크롤 보니까 토 나오겠다.. 그냥 끊어 가면서 하지 왜 한 번에 하려는 건데?독자가 칼을 뽑았으면 무라도 자르고 싶어할까봐...? 이번 글은 LunarG 튜토리얼이랑 Alexander 튜토리얼을 기초로 했습니다. 목차1. 프로그램의 큰 그림2. 삼각형을 띄워 보기 2.1. 인스턴스 2.2. 확인 계층 2.3. 물리 장치와 가상(logica..
2022.06.08 -
Vulkan - 1. 벌칸의 특징, 그리고 시작을 위해 구성하기(Windows)
개요벌칸은 저수준에 대한 많은 제어가 가능하여 성능이 뛰어난 API라고 알려져 있습니다. 그래픽스 맥락에서는 대략 어느 정도를 제어할 수 있고 어떤 식으로 사용하게 될지에 대한 큰 그림을 확인하며, 사용을 위해 벌칸 API를 다운로드하고 일단 작동하는 프로그램을 만들어 봅니다.목차본문1. 특징을 간단하게만 알아보자2. 세팅하고 프로그램 돌려 보기3. 요약본문1. 특징을 간단하게만 알아보자OpenGL에서 삼각형을 하나 그릴 때 프로그램에서 뭘 만들었었는지 떠올려 봅시다.가장 먼저 OpenGL 컨텍스트를 초기화해서 창 시스템에 연결했었고, 셰이더 단계를 컴파일하고, 그것을 사용한다고 하고, 정점 버퍼 내용을 만들어서 바인드하고, 그리기 명령을 내리면 됐었습니다. OpenGL은 전역에서 보이지 않는 상태 머신..
2022.06.08 -
Vulkan
이제부터 Vulkan을 사용해 보려고 합니다. 애초에 개발 중이던 게임 프레임워크에서는 OpenGL을 사용하고 있었고 기본적으로 필요한 사항은 진작에 다 되어 있는 상황이지만, 그림자맵, 법선맵 같은 상대적인 고급 기능을 하려던 때에 Vulkan에 눈이 돌아가더라고요. 이유는 간단한데 현재 구조를 유지하면서 여러 번에 걸친 렌더링을 시키자니, 여러 경우에 대하여 모두 충족시키려니까 (특히 셰이더의)코드가 지저분해지는 느낌이었기 때문입니다(뭣보다 프로젝트를 시작할 때 템플릿 정적 다형성을 모르고 있었음). 계승 프로젝트가 필요하다고 느껴졌습니다. 그래서 최근 며칠 간 Alexander Overvoorde의 Vulkan Tutorial을 통째로 번역했는데요, 이해하기도 어렵지 않았고 성능 관련 내용도 잘 알..
2022.06.08 -
C++에서 템플릿 메타프로그래밍하다가 발생한 오류
이슈 저의 OAGLE에서는 정점 버퍼를 만드는 것을 캡슐화할 때 원래 한 종류의 정점 클래스만 사용하고 있었는데, 그것은 위치(3차원 실수 벡터), 법선(3차원 실수 벡터), 텍스처 좌표(2차원 실수 벡터), 법선을 위한 tangent와 bitangent(각각 3차원 실수 벡터인데, 탄젠트는 접선이란 뜻이지만, 엄밀히 말해 실질적 의미는 법선에 수직한 2개 그래디언트에 가까우므로 따로 번역하지 않음), 뼈 인덱스(4차원 정수 벡터), 대응 뼈 가중치(4차원 실수 벡터)로, 생각해 보면 이것저것 구현함에 있어 꽤나 무겁거나 뻣뻣한 느낌이 있습니다. 그리하여 템플릿 매개변수를 주기만 하면 그에 따라 알아서 VAO를 만들어 주는 클래스를 새로 추가했습니다. 바인드한 정점 데이터는 셰이더 코드에서 그에 맞게 읽..
2022.05.31 -
오버플로 없는 short int x 분수
이슈 저의 OAGLE에는 오디오 파일을 복호화해서 재생하는 부분이 있습니다. 단순히 재생하는 것 외에 대략적으로는 다음과 같은 기능적 요구 사항이 있습니다. 여러 개의 오디오 파일을 동시에 재생한다 각 재생 스트림의 볼륨을 따로 조정한다 마스터 볼륨 단순히 하나의 파일을 재생한다면 memcpy()의 최적화가 아주 훌륭하므로 복호화한 걸 그대로 링버퍼에 갖다가 붙이면 그만입니다. 전자는 PCM끼리 더하면 되고 후자는 PCM에 볼륨을 곱해야 합니다. 이 과정은 memcpy()에 비해 오래 걸립니다. 초당 44100 샘플이 필요하다면 SSE2 float 기준으로 초당 11025 x (n-1)회의 실수배와 벡터 합 연산이 필요한 셈입니다. 그럼에도 저는 프로그램 상의 샘플 기준으로 float를 쓰고 있었는데요,..
2022.05.25 -
1초당 목표 위치에 99% 다가가는 카메라
이슈 저는 카메라가 부드럽게 움직이게 하기 위해, 원하는 자리에 초당 99%만큼 도달하기를 원했습니다. (이것 외에도 부드럽게 움직이는 방법은 많습니다. 훅 법칙을 적용하는 경우도 있는 것으로 들었습니다.) 현재 위치가 P이고 도달해야 할 위치가 Q라면 1초 후에는 0.01P+0.99Q에 도달해야 한다는 말입니다. (Q가 정지해 있다면) 문제 단적으로 생각해서 답은 지수적인 것과 관련이 있을 것 같습니다. 문제는 구현이겠죠. 게임 프로그램에는 루프가 존재하고(보통 60fps, 144fps) 이 반복 간격은 일정하다고 보장할 수 없습니다. 가장 대표적 원인으로는 매우 사양이 낮은 기기 혹은 매우 바쁜 기기가 있겠죠. 이에 따라 각 프레임 간격이 합쳐져 눈에 띌 정도 시간인 T만큼이 흘렀을 때, g(T)만큼..
2022.05.22