목록Season 1 (107)
Graphics Programming
Johan Tibell의 ZuriHac 2015 발표: https://www.youtube.com/watch?v=_pDUq0nNjhI 그냥 동영상에 나오는 슬라이드 별로 요약한 것. 자세한 내용은 동영상 참조. ◎ 생성자의 헤더에 1워드, 필드에 1워드 소모 data Uno = Uno a -- 2워드 data Due = Due a b -- 3워드 예외: 필드 없는 생성자는 메모리 사용 X (Nothing, True 등) ◎ [1, 2] 의 메모리 표현 - 1박스 = 1워드 - 생성자마다 1워드의 오버헤드 (가비지 컬렉션 등에 이용) ◎ unboxed 타입 = 원시 기계 타입 - 관례에 의해 이름이 #로 끝난다 - 대부분 1워드를 소모 (예외: 32비트 기계에서 Double#) - unboxed 타입의 값..
원문: http://research.microsoft.com/en-us/um/people/simonpj/papers/parallel/AFP08-notes.pdf 요약 형식으로 번역. 1. 서문 다양한 반-암시적(semi-implicit) 병렬화와 쓰레드 기반 명시적 병렬화 기법들, 소프트웨어 트랜잭션 메모리, 중첩 데이터 병렬화 등을 다룬다. 독자가 하스켈의 지연 함수형 프로그래밍에 익숙하다고 가정. 2. 동시성과 병렬화의 응용 동시성 병렬 프로그램을 작성하는 것은 순차적 프로그램을 작성하는 것보다 어렵다. 하지만 그럴 만한 가치가 있다. 수행능력. 멀티코어 프로세서로 수행능력을 향상할 수 있다. 지연시간 감추기. 싱글코어 프로세서에서도 동시성으로 느린 I/O 작업의 지연시간을 숨길 수 있다. 소프트웨어..
http://codeonwort.tistory.com/235 평면 텍스처에 입체감을 주기 위해 가장 흔하게 사용하는 기법이며 튜토리얼도 수없이 많으나... 구현하는 것은 엄청 힘들었다. 셰이딩을 위해서는 법선, 탄젠트, 바이탄젠트, 광원 위치, 시선 벡터, 모델뷰 행렬 등 많은 매개변수가 필요한데, 각자 다른 좌표계에서 정의된 값들이고 이것들을 모두 탄젠트 공간으로 변환해서 계산하는 과정에서 엄청난 혼란을 겪었기 때문이다. 그렇다고 수많은 픽셀 중 하나의 값을 찍어볼 수도 없어서, C++ 코드로 똑같은 계산을 작성해서 콘솔에 찍어보며 디버깅을 했다. 철저히 검증했는데도 GPU와 CPU에서의 결과가 다르다면, 매개변수를 전달하는 과정에서 오류가 난 것이다. 실제로 프래그먼트 셰이더의 mat4 유니폼에 gl..
방향광(directional light)을 이용해 기초적인 그림자 매핑을 구현하고 나니 3년도 전에 본 그림이 생각났다. http://9gag.com/gag/1744243/lamp-level-asian 기본적인 그림자 매핑은 한 방향으로만 그림자를 그리기에 전방향으로 그릴 수가 없다. 점광원의 위치에서 여섯 방향으로 깊이 맵을 그리고 각각의 맵을 큐브맵의 여섯 면에 대응하면 되지 않을까 싶었고, 검색해보니 실제로 큐브맵을 이용해 전방향 그림자 매핑을 구현하는 것이 보편적이었다. 그림자 매핑을 여섯 번 하면 되는 아주 쉬운 작업이라고 생각하였으나 구현하는 과정에서 멘탈이 수없이 깨졌다. - 큐브맵 텍스처의 샘플링. 큐브맵 텍스처의 각 면(face)에 RGBA 텍스처가 아니라 깊이 텍스처를 붙이는 것이 가능..
하스켈로 채팅 봇을 작성하다 문제가 하나 발생했다. wuss는 secure 웹소켓 클라이언트를 만들기 위한 라이브러리다. 웹소켓 클라이언트를 생성하는 함수는 runSecureClient다. runSecureClient :: HostName -> PortNumber -> String -> ClientApp a -> IO a ClientApp은 별칭 타입이다. type ClientApp a = Connection -> IO a 따라서 실제로는 다음과 같이 사용한다. main = do runSecureClient "some_host" 443 "some_path" app app conn = do -- input and output through websocket app은 Connection만을 인자로 받는다. ..
blockwise DCT - wonderfl build flash online JPEG 압축에 쓰이는 discrete cosine transform을 구현했다. 이미지 가로, 세로 길이는 8의 배수라 가정하며 다음과 같이 작동한다. 1. 원본 이미지를 준비한다. 여기서는 간단히 펄린 노이즈를 생성했다. 2. DCT를 수행한다. 3. Quantization을 수행한다. 4. band cutting을 수행한다. 주파수 영역에서 정보가 손실될 때 복원률을 알아보기 위한 단계다. 5. IDCT를 수행한다. 6. 원본 이미지, 주파수 이미지, 복원 이미지를 화면에 그린다. DCT 이미지에 마우스를 올리면 마우스가 있는 블록의 주파수 값을 볼 수 있다. 이미지를 8x8 블록들로 나눠서 DCT를 수행하기 때문에 대응..
※ 예제 코드들은 OpenGL Super Bible에서 가져온 것입니다. - 컴퓨트 셰이더 스테이지는 별개의 파이프라인. OpenGL의 다른 셰이더들과 단절되어 있다 - 고정된 입출력이 없다 - 프로그래밍 관점에서는 다른 셰이더들과 같다 - GLSL로 작성, 셰이더 개체로 표현, 프로그램 개체에 링크됨 - 컴퓨트 셰이더는 다른 셰이더들과 섞일 수 없다 - 이미 정점, 단편 셰이더가 있는 프로그램에 컴퓨트 셰이더를 붙일 수 없음 (링크 실패) - 링크된 프로그램은 컴퓨트 셰이더만 포함하거나 그래픽스 셰이더들(정점, 테셀레이션, 기하, 단편)만을 포함한다 // 아무것도 안 하는 컴퓨트 셰이더#version 430 corelayout(local_sizee_x = 32, local_size_y = 32) in;..
Transorm Feedback - 정점, 테셀레이션, 기하 셰이더의 결과를 하나 이상의 버퍼 개체에 저장하기 위한 기능 - front end의 마지막 단계 - 프로그래밍 불가능, 고정 기능 스테이지 - 현 파이프라인의 마지막 단계에서 출력된 attribute들 중 명시한 것들이 버퍼에 기록된다 - 기하 셰이더가 없을 경우: 정점/테셀레이션 출력 정점들이 기록됨 - 기하 셰이더가 있을 경우: EmitVertex()에 의해 생성된 정점들이 저장됨 => 데이터 양이 변함 - Transform Feedback Buffer: 셰이더들의 출력을 포착하기 위해 쓰이는 버퍼 data -> TFB -> glGetBufferSubData() -> glMapBuffer() 사용법: GL에게 우리가 기록하길 원하는 출력을 ..