본문 바로가기

Library

David Blythe, The Direct3D 10 System DirectX 10.0 이후의 아키텍처를 자세히 알고 싶다면 필히 읽어봐야 하는 Paper. 저자는 Microsoft의 David Blythe이며, ACM Transactions on Graphics에 2007년 7월 발표된 문서. 그동안 DirectX 10에 대해서 단편적인 API 설명에 진저리가 났던 사람들에게 좋은 자료가 될 것이다. 더보기
빛의 밝기(birghtness), 색상(color) "If it looks like computer graphics, it is not good computer graphics." - Jeremy Birn 그런 의미에서, '진짜 빛'을 다루는 사진 예술가들의 이야기도 들어보는게 좋을 것 같다. 밝기(brightness) 광원의 속성 가운데서 사진가에게 가장 중요한 것 하나를 꼽으라면 광원의 밝기이다. 대부분은 더 밝은 빛이 더 좋은 빛이다. 지극히 기초적인 수준에서 이야기하자면, 빛이 충분히 밝지 못하면 사진을 얻을 수 없다. 만일 빛이 우리가 필요로 하는 최저치보다 더 밝으면, 아마도 더 좋은 사진을 얻을 수 있을 것이다. 필름을 사용하는 사진가는 빛이 더 많으면 더 작은 조리개와 더 빠른 셔터 속도를 사용할 수 있다. 설사 사진가가 더 작은 렌즈 조리.. 더보기
Global Illumination Algorithms 대부분의 경우, 완전한 전역 조명 알고리즘은 계산량이 대단히 많기 때문에, 실시간성을 중요하다면 이와 같은 알고리즘을 적용하기는 힘들다. 최근에는 GPU를 사용하여 가속화된 전역 조명 알고리즘들이 많이 등장하기는 했지만, 복잡한 씬(scene)에서의 계산량을 실시간으로 처리하기에는 아직도 충분하지 않다. 그러나, 실시간 측면에서 전역 조명 알고리즘을 적용하는 것은 불가능한 것은 아니다. 해당 씬의 에너지 흐름이 안정된 상태라면, 어느 정도 조명 효과를 미리 계산해두는 것이 가능하다. 또, 조명 따위가 제한된 환경이라면 시각적 효과를 위해 렌더링 타임에 완전한 전역 조명 효과를 계산하는 것이 불가능한 것은 아니기 때문이다. 특히, 레이 트레이싱(ray tracing)이나 래디어시티(radiosity) 알고.. 더보기
단위 전략에 기반한 스마트 포인터의 생성자 스마트 포인터를 구현할 때, 단위 전략 기반의 스마트 포인터가 아니라면 다른 타입으로 생성된 스마트 포인터를 인자로 받는 생성자를 구현하는 것은 필수다. 예를 들어, Dervied 클래스가 Base 클래스를 상속 받았다면, 다음의 코드는 컴파일에 문제가 없어야 한다. smatr_ptr sp_b (new smart_ptr); // 또는, smart_ptrsp_b(new Derived); 이것은, 원시 포인터를 사용한 코드가 다음과 같기 때문이다. Base * pBase = new Derived; 문제는 스마트 포인터가 여러 템플릿 인자를 가지는, 단위 전략 기반의 스마트 포인터가 이런 형식의 생성을 지원해야 하는지 여부이다. 즉, 생성된 타입에 대한 정보만 .. 더보기
Area Lighting 제대로 된 전역 조명을 구현하려면, 그래픽 시스템에서 제공하는 조명 처리 시스템으로는 부족하다. 더구나, 기존의 Gouraud 쉐이딩에 기반한 하드웨어 T&L 기능들은 전부 폐기 예정(deprecated)이다. DirectX는 10.0 이상에서는 아예 하드웨어 T&L 기능을 제공하고 있지 않으며, 변화가 느린 OpenGL조차 고전적인 하드웨어 T&L 관련 함수들은 폐기 예정되어 있다. 즉, 좋든 싫든 이제는 프래그먼트 프로그래밍으로 조명 효과를 구현해야 하며, 이를 위해 기존의 근사 조명식들이 어떻게 유도되었는지 알아볼 필요가 있다. 먼저, 임의의 지점에서 다음과 같이 빛이 입사되고 반사된다고 생각해보자. 여기서 는 에 입사되는 빛의 단위 면적 에너지다. 즉, 에 입사되는 전체 에너지량은 의 합으로 간주.. 더보기
DirectX SDK June 2010 Release DirectX SDK가 Feb 2010 이후로 새롭게 릴리즈되었다. DirectX 10 세대에서는 오랫동안 큰 변화가 없었는데, DirectX 11 세대에 이르러서는 다시 빠르게 발전되고 있는 느낌이다. 이번 June 2010 릴리즈에서 가장 눈길을 끄는 것은 새로운 HLSL 명령어의 추가이다. 가장 흥미있는 것은 printf, errorf, abort 명령어의 추가이다. 지금까지는 쉐이더 코드의 변수 값을 알아내기 위해서는 외부 디버거를 사용하여 쉐이더 코드 내의 값들을 파악할 수 밖에 없었다. 그런데, 이번에 새로 포함된 HLSL 명령어인 printf, errorf는 Information 큐에 값을 출력할 수 있게 되었다. 이것으로, 좀 더 쉽게 쉐이더 코드를 디버깅할 수 있게 되었다. 이 기능은 쉐.. 더보기
빛의 복사도(Radiometry) 보다 나은 조명 효과를 구현하기 위해서는 전역 조명 모델을 이해해야 하며, 근본적으로 빛의 속성을 이해해야 한다. 즉, 광학(Optics)에 대한 이해가 필요하지만, 이론 물리학에서 요구하는 수준의 깊은 이해를 필요로 하는 것은 아니다. 전역 조명 모델 알고리즘의 궁극적인 목표는 어떤 장면에서 빛의 복사 에너지 방출이 안정적인 상태일 때를 최대한 근사하는 것이다. 지역 조명 모델의 환경광 / 난반사광 / 정반사광만을 사용한 근사식은 특정 상황에서만 정확한 근사식일 뿐이다. 따라서, 보다 정확한 조명을 계산하기 위해서는 아주 미세한 영역에서의 빛의 에너지를 파악해야 한다. 이를 위해서, 플럭스(flux)라고도 불리는 방사 단위를 정의하고 로 표기한다. 단위 면적 에 입사되는 빛 를 입사 광도(Irradia.. 더보기
BMP 디코더를 작성할 때 주의점 : 스캔 라인 바이트 정렬 비트맵 이미지를 다루기 위한 API가 준비되어 있는 플랫폼에서 비트맵을 처리하는 것은 매우 간단하다. 또, 플랫폼의 지원보다 더 좋은 이미지 프로세싱이 필요하다면, 외부 이미지 라이브러리를 사용하면 된다. FreeImage, ImageMagick, CxImage, DevIL 등은 잘 구현된 공개 이미지 라이브러리들이며, 이외에도 쓸만한 라이브러리들을 쉽게 찾을 수 있다. 이들을 사용하여 이미지를 읽어들이거나 필터링을 적용하는 것만 목적이라면, 사실 비트맵 이미지들의 내부 구조를 파악할 필요는 없다. 그러나, 이런 지원이 없거나 주로 사용하던 이미지 라이브러리가 해당 플랫폼에서 컴파일되지 않는다면, 이미지 파일 구조를 직접 읽어들이는 고통스러운 작업이 필요하며, 파일 내부 구조에 대한 이해가 필수적이다. .. 더보기
stdint.h : 이식성을 위한 편리한 존재 C99에서 새롭게 도입된 stdint.h는, 이식성을 염두에 둔다면 자주 써야 할 헤더 파일이다. 기존의 limits.h가 기계 의존적인 자료형의 크기를 정의한 것이라면, stdint.h는 원하는 크기의 자료형을 명확하게 선언한다. limit.h는 기계마다 다른 자료형의 크기만 알려줄 뿐이며, 원하는 크기의 자료형을 선언하는데는 크게 도움이 되지 않는다. stdint.h는 바로 이런 목적을 위해 정의된 것인데, 기존의 short, int, long과 같은 자료형을 보다 명확하게 수치로 나타낸다. 즉, 32 비트 기계에서 16 비트 크기를 가지는 정수 자료형을 명확하게 선언하고 싶다면, int16_t를 사용하고, 32 비트 정수 자료형이라면 int32_t를 사용하여 선언한다. 기본 자료형을 다시 재정의하는.. 더보기
History of Global Illumination : Ray Tracing and Radiosity 초창기 컴퓨터 그래픽스는 상당히 조악했다. 컴퓨터 그래픽스의 선구자로 일컫어지는 이안 서덜랜드(Ivan Sutherland)의 스캐치패드(SketchPad, M.I.T. 1963)는 선, 점과 같은 기본적인 도형만을 그릴 수 있을 뿐이었다. 그 후로, 래스터 그래픽이 발전함에 따라 쉐이딩 알고리즘 적용할 수 있게 되었고, 솔리드 렌더링(solid rendering)이 가능해지게 된다. 물론, 이때의 쉐이딩이란, 광원과 폴리곤의 표면과의 각도를 계산하여 단일한 색으로 표면을 칠하는 정도였을 뿐이다. 이와 같은 방법은 도형의 생김새와 방향에 대해서 알 수 있게 해주었지만, 실사와 같은 이미지(photorealistic image)와는 거리가 멀었다. Gouraud와 Phong은 보간법을 사용하여 보다 현실적.. 더보기