본문 바로가기

Library/Computer Graphics

History of Global Illumination : Ray Tracing and Radiosity 초창기 컴퓨터 그래픽스는 상당히 조악했다. 컴퓨터 그래픽스의 선구자로 일컫어지는 이안 서덜랜드(Ivan Sutherland)의 스캐치패드(SketchPad, M.I.T. 1963)는 선, 점과 같은 기본적인 도형만을 그릴 수 있을 뿐이었다. 그 후로, 래스터 그래픽이 발전함에 따라 쉐이딩 알고리즘 적용할 수 있게 되었고, 솔리드 렌더링(solid rendering)이 가능해지게 된다. 물론, 이때의 쉐이딩이란, 광원과 폴리곤의 표면과의 각도를 계산하여 단일한 색으로 표면을 칠하는 정도였을 뿐이다. 이와 같은 방법은 도형의 생김새와 방향에 대해서 알 수 있게 해주었지만, 실사와 같은 이미지(photorealistic image)와는 거리가 멀었다. Gouraud와 Phong은 보간법을 사용하여 보다 현실적.. 더보기
정점 혼합(Vertex Blending, a.k.a. Skinning) 3D로 모델링된 사람의 팔을 실제로 움직인다고 하자. 뼈는 강체(rigid)와 동일하게 생각할 수 있으므로, 뼈를 구성하는 폴리곤들은 단일한 변환 행렬에 의해 변환될 수 있다. 그러나, 팔에 피부를 구성하는 페이스들이 입혀져 있을 때, 이것을 뼈와 동일하게 변환한다면 변환 중 피부가 연결되지 않고 찢어지게 된다. 사람의 피부는 실제로 탄력성을 가지고 있기 때문에, 관절의 회전에 따라 피부의 늘어나는 비율이 그만큼 다르기 때문이다. 즉, 인체의 팔을 구성하는 피부의 경우, 3D로 표현할 때 하나의 변환 행렬로 표현할 수 없다. 정점 혼합(vertex blending)은 이 문제에 대한 해결 방법이다. 정점 혼합은 스키닝(skinning)과 같은 이름으로도 알려져 있는데, 정점에 적용되는 변환 행렬에 대해 .. 더보기
Transforming Normal Vector 페이스(face)를 하나 생성했을 때, 페이스에 대한 법선 벡터(normal vector)는 여러모로 유용하게 쓰인다. 만약, 페이스에 어떤 변환 행렬 A를 적용했을 때, A의 법선 벡터에도 이 변환 행렬을 적용할 수 있을까? 즉, A의 변환 뒤의 법선 벡터와, 변환 전의 페이스에 A를 적용한 결과가 같을까? 이것은 명확하게 정의되지 않는다. 왜냐하면, 컴퓨터에서의 부동 소수점은 그 자체가 정확하지 않기 때문이다. 단순히 같은 변환을 적용하여 원하는 정도의 정밀도의 값을 얻을 수 있는 경우도 있겠지만, 미묘하게 값이 맞지 않는 경우도 있을 수 있다. 그래서, 단순히 같은 변환을 적용하는 것보다, 변환 행렬이 적용된 페이스의 법선 벡터를 다시 계산하는 것이 좋다. 그러나, 법선 벡터를 재계산하는 것은 비교.. 더보기
Stanford Bunny / Happy Buddha / Dragon Stanford Bunny, Only wireframe, 69451 faces Stanford Happy Buddha, Only wireframe, 1087716 faces Standford Dragon, Only wireframe, 1132830 faces 이들 파일들은 스탠포드 CG 연구실에서 배포하는 ply 파일을 읽은 것이며, OpenGL을 사용하여 렌더링 했다. 드래곤과 붓다는 상대적으로 폴리곤이 많은 편이라, 쉐이딩을 적용하지 않으면 제대로 모습을 알아보기 힘들다. 쉐이딩을 적용하지 않은 와이어프레임만으로는 대단히 허전해 보인다. 위의 ply 파일을 구하려면, 아래의 스탠포드 CG 연구실에 대한 링크를 참조하라. 모델링 파일에서 데이터를 읽어들일 때 비디오 메모리에 페이스를 생성하지 않는다면,.. 더보기
3DS File Loader Implementation 3ds 파일을 읽어들이는 것은 쉽고, 재미있는 일이다. 오토데스크(Autodesk)에서 공식적으로 파일 포맷을 공개하지 않았기 때문에 비공식적으로 바이너리를 분석할 수 밖에 없지만, 이것은 큰 문제는 아니다. 이미 3ds 바이너리 포맷을 잘 분석한 문서가 존재하며, 간혹 이 문서에 나타나지 않는 데이터 조각들이 있긴 하지만 그다지 필요한 정보가 아니기 때문이다. 3ds 파일 포맷은, 데이터 조각들의 모음으로 구성되어 있고, 문서에서는 보통 이들을 chunk라고 표현한다(여기서는 그냥 데이터 조각이라고 부르기로 한다). 데이터 조각은 2 바이트 id와, 데이터 조각 자체의 크기를 나타내는 4 바이트 정수형을 합친, 6 바이트 헤더를 가진다. 데이터 조각들은 헤더 외에 데이터 종류에 따라 추가적인 데이터를 .. 더보기
Global Illumination : Ray Casting and Ray Tracing 지역 조명 모델에서는 광원에서 빛이 방출되고, 표면에 충돌했을 때 관찰자에게 빛이 도달할 때까지 다른 빛의 영향을 받지 않는 것으로 가정한다. 하지만, 실제 자연 현상은 이보다 복잡하다. 전역 조명 모델은 표면에서 반사되는 빛에, 다른 물체에서의 반사, 굴절 따위를 반영한 빛을 고려한다. 보통, 전역 조명 모델에서는 빛이 표면과 부딪히는 순간, 반사, 굴절, 흡수, 자체 발광의 4가지 요소를 사용하여 근사한다. 그리고 빛이 입사하는 순간, 자체 발광을 제외한 방출되는 빛의 총량은 들어온 빛의 총량보다 많아질 수 없다. 즉, 입사되는 빛 중 반사되는 빛의 양이 60%라고 했을 때, 굴절되는 빛이 입사된 빛의 40%를 넘을 수 없다. 표면에서 방출되는 빛이 그대로 관찰자에게 도달한다고 가정하는 지역 조명 모.. 더보기
Create OpenGL 3.x RenderingContext with WGL WGL을 사용하여 OpenGL 3.x 렌더링 컨텍스트(RC)를 얻어내는 과정은, 이전의 RC를 얻어내는 과정과 크게 다르지 않다. 간단히 설명하면, 원하는 RC를 얻어내기 전에, 레거시(legacy) RC를 생성하고, 이를 바탕으로 원하는 속성을 기술한 구조체와 함께 wglCreateContextAttribsARB를 호출하는 것이 전부이다. 사실, OpenGL 3.0 이상의 구현에서 wglCreateContext는 wglCreateContextAttribsARB에서 Attribs에 해당하는 인자 값을 널로 호출하는 것이다. 대략적인 코드는 다음과 같다. // get default RenderingContext HDC hDC = GetDC(hWnd); HGLRC hRC = wglCreateContext(h.. 더보기
CS_OWNDC with WGL (OpenGL Extentions for Windows) OpenGL은 대단히 잘 구성되어 있는 크로스 플랫폼 그래픽 라이브러리이지만, 확장 기능(OpenGL Extentions)과 연관된 플랫폼 이식 작업은 그렇게 쉬운 편은 아니다. OpenGL은 플랫폼 의존적인 부분을 표준으로 포함하고 있지 않으며, 윈도우를 생성하는 작업과 같은 하드웨어 의존적인 구현을 여기에 의존하고 있기 때문이다. OpenGL 코드를 다른 플랫폼으로 이식할 때, 렌더링 코드는 수정할 필요가 거의 없지만, 플랫폼 의존적인 벤더 확장 부분을 수정하는 것은 생각보다 잔손이 많이 가는 작업이다. 그 중에서도, 특히 WGL(OpenGL Extentions for Windows, 위글)은 GDI DC(DeviceContext) 관리에 주의해야 할 부분이 있다. 보통, Win32 윈도우를 생성할 .. 더보기
Using OpenGL 3.x Implementations OpenGL 3.2 스펙은 2009.8.3에 발표되었다. 당연히, 각 그래픽 하드웨어 벤더들은 OpenGL 3.2 extention 형태로 제공하기 시작했다. NVIDIA의 경우, ForceWare 190.18 이상에서 OpenGL 3.1 / 3.2 구현을 제공하며, ATI는 Catalyst 9.2 이상에서 해당 OpenGL 구현을 제공한다. OpenGL을 사용하여 프로그래밍을 하고자 할 때, 가장 먼저 해야 할 일은 원하는 OpenGL 스펙을 만족하는 라이브러리를 찾는 것이다. OpenGL 1.4 버전은 대부분의 플랫폼에서 지원되며, 2.0 이상의 스펙을 원할 때는 Mesa3D와 같은 공개 구현물을 사용하면 된다. 그러나, 3.0 이상을 완전하게 구현하는 정적 라이브러리를 구하기 힘든데, 해당 라이브러.. 더보기
광원의 종류에 따른 감쇄 효과 광원은 적용하고자 하는 방식에 따라 여러 가지로 추상화할 수 있다. 먼저, 어떤 장면을 구성하고, 여기에 조명을 적용할 때, 광원이 아주 멀리 떨어져 있다고 하자. 그렇다면, 이 광원을 점으로 간주할 수 있지만, 아주 멀리 떨어져 있으므로 결국 이 광원에서 나오는 빛은 평행한 선들의 집합으로 간주해도 무리가 없을 것이다. 이런 경우를 parallel light라고 하는데, 방향성 광원, 평행적 광원 등 무엇으로 불러도 상관없지만 개념은 동일하다. parallel light는 광원이 아주 멀리 떨어져 있고, 모든 물체가 동일한 빛을 받는다고 간주하기 때문에 광원으로부터의 거리에 따른 감쇄 효과를 고려하지 않아도 무방하다. parallel light의 대표적인 것으로는 태양광을 꼽을 수 있다. 그러나, 광원.. 더보기