목록Season 1 (107)
Graphics Programming
구 또는 원통형 물체에 양 끝이 이어지는 텍스처를 입힐 때, 샘플링의 래핑 모드를 GL_REPEAT로 하는 게 자연스럽다. 이러면 버텍스마다 uv 좌표가 0.0 ~ 1.0 사이가 아니라 계산 상의 문제로 0.2 ~ 1.2이여도 텍스처가 좀 옆으로 회전할 뿐 샘플링이 제대로 될...까? 애초에 버텍스의 uv 좌표가 이런 상태로 버텍스 셰이더 -> ... -> 프래그먼트 셰이더를 거치면 u = 1.2와 u = 0.4인 버텍스 사이의 픽셀들에서는 u가 선형 보간되어 1.2 -> 0.4로 변한다. 그러면 텍스처의 왼쪽 끝과 오른쪽 끝이 자연스레 이어지는 것이 아니라 중간 부분이 뒤집혀서 출력된다. 간단한 해결책은 uv를 프래그먼트 셰이더에서 직접 계산하는 것이다. 이러면 연산량이 더 많아지지만 내가 만들고 있는..
문제: https://www.hackerrank.com/challenges/matrix-rotation 난이도 Hard이지만 코드포스로 따지면 Div2 B 정도 되는 문제다. m×n 배열을 바깥 테두리부터 한 층씩 잘라내어 각각 r번 돌리고 다시 합쳐서 출력하면 된다. 이 때 r이 너무 크니 r을 테두리 길이로 나눈 나머지 만큼만 돌린다. 절차형 언어면 그냥 배열을 직접 조작해서 풀었는데 하스켈이니 리스트와 배열을 왔다갔다 하면서 풀어야 한다. mutable array를 사용하면 하스켈을 쓰는 의미가 퇴색되니 쓰지 않는다. 먼저 입력을 받는다. 배열 원소가 최대 90000개여서 String으로 읽으면 I/O 하다 시간 초과가 날 것 같으니 ByteString으로 읽는다. import Control.Mon..
Tools - Install Software 선택. 세 개를 체크하고 업데이트한다.이제부터 노가다를 해야 한다. 프로젝트 속성에서 SDK는 최신 버전으로 선택할 수 있다.하지만 Output 탭에 가보면 플레이어 최신 버전이 없고 구버전으로 실행된다. C:\사용자\AppData\Local\FlashDevelop\Settings\Platforms\AS3 로 가면 air.xml과 flashplayer.xml이 있다. 목록이 여기서 끝나면 FlashDevelop\Apps\flashsa 디렉토리를 확인하고 빠진 최신 버전들을 추가한다.내 경우는 25.0, 26.0이 빠져있었다. value와 swf-version은 동일하게 1씩 증가하는데확실히 하려면 https://www.adobe.com/devnet/artic..
크로스 플랫폼 환경에서 작업하거나 극단적인 리눅스 진영 사람들을 많이 접하면 표준은 무조건 지켜야만 하며, 네이티브 코드가 죄악이라는 세뇌를 점차 당한다. 하지만 목적에 따라 어느 API를 쓸지 신중하게 결정해야 한다. C++로 작성되었고 윈도우즈에서만 돌아가는 게임을 예로 들어보자. 무언가 새 기능을 구현해야 하는데 파일시스템 API가 필요하다. 선택지가 적어도 4가지가 있다. 1. 게임 엔진의 파일시스템 모듈게임 엔진에는 대개 파일 I/O를 래핑한 모듈 혹은 서브시스템이 들어있다. 이 경우는 C++로 작성했으니 C 런타임 라이브러리 또는 C++ STL을 래핑했을 것이고, 사용법도 비슷할 것이다. 2. C 런타임 라이브러리 (CRT)게임 엔진이나 네이티브 API에 대한 사전지식이 필요 없고 STL보다 ..
스켈레탈 애니메이션은 대충 본 계층도에 버텍스 스키닝을 한다는 정도로만 알고 있었는데, Frank D. Luna의 에서 개념과 구현 방법을 확실히 숙지하고, 코딩을 시작한 것이 아니라... 몇 주를 밍기적거리다 저번 주말에 구현했다. 일단 지금까지는 Wavefront OBJ 모델만 썼는데 OBJ 포맷은 뼈대도 애니메이션도 지원하지 않기 때문에 블렌더로 뼈대 애니메이션을 급조하고 DAE 포맷으로 익스포트했다. 예전에 모델 로더를 처음 만들 때만 해도 DAE 로더를 작성하려 했지만 무슨 이유에선가 OBJ 로더만 만들고 말았는데, 이번 기회에 Assimp 라이브러리를 이용해서 DAE 로더를 작성했다. 구현은 ogldev 튜토리얼을 참고했는데 내 경우는 기존 엔진에 버텍스 스키닝을 통합하려니 셰이더를 전부 손봐..
HDR은 forward/deferred rendering에 무관하게 기존 렌더링 파이프라인에 쉽게 끼워넣을 수 있는 테크닉이다. 일반적인 모니터는 RGB 채널 별로 256가지 강도만 표현할 수 있고 OpenGL의 기본 프레임버퍼(default framebuffer)도 마찬가지다. 기본 프레임버퍼에 출력할 때 프래그먼트 셰이더의 출력은 0.0에서 1.0 사이로 clamping된다. 따라서 여러 광원으로부터 빛을 받아 최종 셰이딩 값이 1.0을 넘어서는 부분은 모두 똑같이 하얀색으로 보인다. HDR은 최종 셰이딩한 색상을 기본 프레임버퍼에 기록하는 대신, 별도로 생성된 고해상도 부동소수점 프레임버퍼에 기록한다. 이 부동소수점 텍스처를 소스로 사용하여, 톤 매핑(tone mapping)한 결과를 기본 프레임버..
디퍼드 셰이딩을 구현하려고 오랜만에 프로젝트를 열었다. 그런데 렌더러 설계가 내가 왜 이렇게 했는지 도저히 이해할 수 없는 상태다. 왜 재질이 셰이더 프로그램을 생성하고, 두 물체가 같은 재질을 공유하는데 속성 설정이 다르면 매 프레임마다 셰이더를 다시 컴파일하는 거지... 그래서 디퍼드 셰이딩은 건드리지도 못하고 기존의 포워드 셰이딩 코드를 장기간 리팩토링하고 있다. 리팩토링하면 설계만 바뀌어야지 동작이 깨지면 안되는데 깨져버렸다. 방향광에 의한 섀도우 매핑을 리팩토링하다 렌더러가 그만... 원본 코드와 대조하며 하루를 꼬박 보냈지만 소용이 없었다. GLintercept를 써가며 모든 오류 메시지를 해결했지만 섀도우 매핑은 살아나지 않았다. 섀도우 매핑을 구현하려면 렌더 패스가 2단계 필요하다. 1. ..
윈도우즈용 GHC와 cabal을 설치하고, cabal을 통해서 sqlite3 라이브러리를 설치하려고 다음 명령을 실행하면 cabal install HDBC-sqlite3 missing C library: sqlite3 가 포함된 오류 메시지가 뜨면서 설치가 실패할 것이다. c로 작성된 sqlite3 소스 코드가 필요하기 때문이다. 다음과 같은 절차를 밟아서 해결할 수 있다. 1. hdbc-sqlite3를 설치하려면 이러이러한 선행 라이브러리가 필요하다고 오류 메시지가 뜰 수 있다. 나의 경우 utf8-string 라이브러리와 hdbc 라이브러리를 설치하라고 떴다. 이것들은 그냥 cabal install utf8-string / cabal install hdbc 를 실행하면 설치된다. 2. sqlite3 ..