본문 바로가기

Library/Computer Graphics

직선과 삼각형의 교차점 검사 공간에서 직선과 삼각형의 교차 여부를 조사하는 알고리즘을 이해하기 위해서는 먼저 무게 중심(barycentric coordicate)을 이해해야 한다. 즉, 삼각형이 3개의 버텍스 로 구성되어 있을 때, 내부의 점 은 으로 표현할 수 있으며, 은 의 좌표에 미치는 의 가중치를 나타낸다. 을 만족해야 한다. 따라서, 다음과 같이 정리할 수 있다. 여기서 는 로 바꿔 쓸 수 있으며, 광선 와 삼각형의 교차점을 구하는 것은 방정식 의 해를 구하는 것과 같다. 즉, 다음의 방정식으로 표현할 수 있다. 여기서 로 정의하면, 는 크라머(Cramer)의 공식에 의해 구할 수 있다. 위의 식은 다음과 같이 다시 정리할 수 있다. 최종적으로, 이것을 의사코드로 표현하면 다음과 같다. // o is ray's origin.. 더보기
쉐이더 아키텍처를 사용하는 OpenGL 프로그래밍에서의 텍스처 매핑 OpenGL에서, 텍스처 매핑(texture mapping)을 사용하는 방법은 고정 처리 파이프라인(fixed pipeline)을 사용하느냐, 쉐이더 파이프라인을 사용하느냐 여부에 따라 달라진다. OpenGL 2.0 이전의 고정 파이프라인 구조에서는 명시적인 glActiveTexture() 사용이 중요한데, 이것은 여러 장의 텍스처를 사용하는 방법은 멀티 텍스처링이 유일하기 때문이다. 반면, 쉐이더 아키텍처를 사용하는 OpenGL 2.0 이후의 구조에서는 생성된 텍스처 개체의 바인딩 대상이 되는 텍스처 유닛과 샘플링 방법만 필요하다. 생성된 텍스처 개체를 바인딩했다면, 쉐이더의 샘플러에게는 어떤 텍스처 유닛이 사용될 것인지 전달하면 된다. 그리고, 이 부분이 가장 중요한데, 상태 설정을 위해 바인딩 되는.. 더보기
OpenGL에서 사용 가능한 최대 텍스처 유닛의 수 알아내기 OpenGL에서, GPU의 멀티 텍스처링(multi-texturing) 지원 정도는 어떻게 알아볼 수 있을까? 국내에서 출판된 OpenGL 프로그래밍 가이드(일명 레드북)는 1.4 버전 기준이기 때문에, GL_MAX_TEXTURE_UNITS에 대한 내용만 언급되어 있을 것이다. GL_MAX_TEXTURE_UNITS를 사용해보면 황당하게 작은 값에 놀랄지도 모르겠다. 그러나, 그 값은 고정 파이프라인에서의 최대 텍스처 유닛 수를 알려주는 값이기 때문에, 잘못된 것이 아니다. 최악의 경우에는 겨우 2개 정도의 텍스처 유닛만 사용 가능할지도 모르지만, 고정 파이프라인 구조로 작성되는 3D 그래픽스 프로그램은 이제 없다. OpenGL 2.0 이상의 구현은 고정 파이프라인 구조가 아니라 쉐이더를 사용하는 구조이며.. 더보기
Progressive PhotonMapping : 재작성 그동안 골치를 앓던 프로그레시브 포톤 매핑 렌더러 구현을 끝냈다. 물론, 렌더러 자체를 완전히 바닥부터 구현한 것은 아니다. 이번 일의 주 목적은 렌더러 독자 제작이 아니라, 블로그지기의 3D 그래픽스 라이브러리 테스트였기 때문이다. Toshiya의 PPM(progressive photonmapping) 렌더링 코드를 기반으로 테스트 렌더러를 작성했다. Toshiya의 코드는 glut로 작성되었으며, 레거시 렌더링 컨텍스트(GL rendering context)를 사용하며, OpenGL 3.0 이후의 표준이 아닌 ARB 확장(extensions)을 직접 사용하는 방식을 취하고 있다. Toshiya의 PPM 코드는 PPM 자체에만 중점을 두고 있기 때문에, 그 이외의 구조적인 부분은 땜빵식 코드가 대단히 .. 더보기
PIXAR's open source RenderMan, PIXIE 3D 그래픽스 렌더러를 바닥부터 직접 작성하는 것은 매우 힘든 일이다. 이것은 '명함 뒷장이면 충분한' 광선 추적(ray tracing) 알고리즘을 사용하더라도 만만치 않은 작업이다. 렌더러를 정말 간단하게 만드는 것은 쉽지만, 그렇게 만든 렌더러는 복잡한 씬을 그리는데 어마어마한 시간을 소모한다. 렌더몽키(RenderMonkey, AMD)를 사용하면 직접 렌더링 코드를 작성하지 않더라도 쉐이딩 효과를 살펴보는데 유용하지만, 쉐이더 프로그래밍 이상의 효과를 원한다면 렌더몽키는 부족하며, 이 경우 직접 렌더러를 만들거나 포기해야 한다. 픽시(Pixie)는 이런 경우 유용한 해결 방법이다. 픽시는 유명한 픽사(PIXAR)의 렌더맨(RenderMan)의 오픈소스 버전이며, LGPL이기 때문에 수정, 배포에 아.. 더보기
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) 알고.. 더보기
Area Lighting 제대로 된 전역 조명을 구현하려면, 그래픽 시스템에서 제공하는 조명 처리 시스템으로는 부족하다. 더구나, 기존의 Gouraud 쉐이딩에 기반한 하드웨어 T&L 기능들은 전부 폐기 예정(deprecated)이다. DirectX는 10.0 이상에서는 아예 하드웨어 T&L 기능을 제공하고 있지 않으며, 변화가 느린 OpenGL조차 고전적인 하드웨어 T&L 관련 함수들은 폐기 예정되어 있다. 즉, 좋든 싫든 이제는 프래그먼트 프로그래밍으로 조명 효과를 구현해야 하며, 이를 위해 기존의 근사 조명식들이 어떻게 유도되었는지 알아볼 필요가 있다. 먼저, 임의의 지점에서 다음과 같이 빛이 입사되고 반사된다고 생각해보자. 여기서 는 에 입사되는 빛의 단위 면적 에너지다. 즉, 에 입사되는 전체 에너지량은 의 합으로 간주.. 더보기
빛의 복사도(Radiometry) 보다 나은 조명 효과를 구현하기 위해서는 전역 조명 모델을 이해해야 하며, 근본적으로 빛의 속성을 이해해야 한다. 즉, 광학(Optics)에 대한 이해가 필요하지만, 이론 물리학에서 요구하는 수준의 깊은 이해를 필요로 하는 것은 아니다. 전역 조명 모델 알고리즘의 궁극적인 목표는 어떤 장면에서 빛의 복사 에너지 방출이 안정적인 상태일 때를 최대한 근사하는 것이다. 지역 조명 모델의 환경광 / 난반사광 / 정반사광만을 사용한 근사식은 특정 상황에서만 정확한 근사식일 뿐이다. 따라서, 보다 정확한 조명을 계산하기 위해서는 아주 미세한 영역에서의 빛의 에너지를 파악해야 한다. 이를 위해서, 플럭스(flux)라고도 불리는 방사 단위를 정의하고 로 표기한다. 단위 면적 에 입사되는 빛 를 입사 광도(Irradia.. 더보기