갬장장이
'computer graphics' 카테고리의 글 목록 (3 Page)

computer graphics

computer graphics/3D Graphics

[3DGraphics] 14. Flat shading and Mesh loading

Dynamic lighting과 shading에 대해 알아보자. 3차원 물체에 빛을 쏘아 명암을 입히려 할때, 이를 어떻게 구현할까? 빛을 shading하는 기법에도 여러가지가 있는데, 그 중 가장 단순한 flat shading부터 살펴보자. flat shading은 단순히 각 폴리곤들마다 받는 빛을 계산해 폴리곤별로 색을 렌더링해주는 기법이다. 더 자세히 살펴보기 전에, 우선 Directional light에 대해 알아보자. 어떤 광원으로부터 쏘아진 광자가 물체에 다다를 때 광원까지의 거리가 멀 수록 물체에 부딪히는 광자들이 이루는 각의 크기가 작아짐을 볼 수 있다. 이는 달리말해 광원의 거리가 무한히 멀다면 이 각이 0도에 수렴하고, 이는 즉 모든 빛이 같은 방향에서 들어온다는 것을 의미한다. 이러한..

computer graphics/3D Graphics

[3DGraphics] 13. Geometry shader

Geometry shader을 알아보자. Geometry shader는 TA(Triangle assembly) 이루 얻은 삼각형들을 가지고 각 삼각형들에 대해 연산을 처리해주는 모듈로, Vertex shader에서는 접근할 수 없었던 정보들에 접근 가능하다. TA에서 조립된 삼각형들에는 id가 부여되는데, Geometry shader에서는 이 id와 함께 그 삼각형에 포함된 각 정점들의 정보를 얻을 수 있다. Geometry shader의 차별점은 한 가지 더 있는데, 기존 Vertex shader에서 어떤 한 정점의 성질을 바꾸면 그 정점을 indices로 갖는 모든 삼각형들이 영향을 받는 것에 반해, Geometry shader는 이미 개별적인 삼각형으로 분리가 된 상태로 정보들을 받아오기 때문에 설..

computer graphics/3D Graphics

[3DGraphics] 12. Vertex shader

Vertex shader에 대해 살펴보자. 우리의 기존 파이프라인에서는 Vertex들과 관련된 연산을 VT(Vertex Transformer)에서 처리해주고 있었다. 그러나 이를 하나의 과정으로 분리시켜 Vertex들과 관련된 연산을 처리해주는 Vertex shader가 dx8부터 등장했다. 현재 VT역할을 맡고 있는 코드는 Pipeline.h의 ProcessVertices 함수인데, 이 함수가 하는 역할을 별도의 모듈로 분리시켜보자. 우선 rotation과 translation 관련 연산을 처리해주는 함수들 및 변수들을 전부 Pipeline 클래스에서 삭제해주자. 또 Vertex shader는 입력받은 Vertex와 다른 타입의 Vertex를 반환할 수도 있기 때문에 Pipeline의 ProcessVe..

computer graphics/3D Graphics

[3DGraphics] 11. Z-buffer

이전에 Occlusion에 대해 다룰 때(6. backface_culling 참고) 우리는 한 가지 문제를 해결하지 못한 채 남겨두었다. 바로 여러 3D모델들이 서로를 가리지 못하는 현상이었는데, 위 사진처럼 오브젝트가 겹칠 때 제대로 가려지지 않는 모습을 볼 수 있다. 이를 해결하기 위한 가장 단순한 방법이 Painter's algorithm인데, 단순히 각 폴리곤들마다 z값 하나를 부여해 그 z값 순으로 정렬 후 뒤에서부터 그려내는 방식이다. 그러나 이 방법으로는 오브젝트들이 서로 겹쳐있지 않은 경우에는 해결되지만, 오브젝트들이 겹치게 되는 순간 해결할 수 없게 된다. 고로 이 문제를 완전히 해결하기 위해서는 우리는 폴리곤보다 더 작은 단위, 즉 픽셀 단위로 z값을 구해 어떤 픽셀에 무얼 그려야 하는..

computer graphics/3D Graphics

[3DGraphics] 10. Perspective correction

현재 우리의 파이프라인에는 한 가지 큰 문제가 있는데, 바로 텍스쳐가 뒤틀려 보이는 현상이다. 왜 이런 현상이 발생하는 지를 이해하려면 우리가 텍스쳐를 처리할 때 어떤 식으로 접근하는 지를 다시 떠올려보면 된다. (Notes 참고) 우리는 텍스쳐를 입힐 때 다음과 같은 과정들을 거친다. (파이프라인의 PST단계부터 살펴보자) 물체의 정점들의 3D 좌표를 원근을 고려해 변형시킨다. 편의상 이 변형된 좌표를 원근좌표라고 하자. 원근좌표는 3D좌표에 z를 나누는 것으로 구해준다. 이러한 연산은 PubeScreenTransformer의 Transform()에서 처리되며, Pipeline의 PostProcessTriangleVertices에서 각 정점들에 대해 .Transform()을 해주는 것으로 처리된다. /..

computer graphics/3D Graphics

[3DGraphics] 9. Pixel shader

픽셀 셰이더란, 픽셀 단위로 그래픽의 색을 지정해주는 연산을 처리하는 프로그램이다. 렌더링 파이프라인에서 가장 중요한 역할을 담당하는 부분 중 하나로 여겨진다. 지난 시간까지 작성한 우리의 파이프라인에서는 우리는 Vertex 클래스 안에 텍스쳐에 대한 정보를 넣어둔 채, 파이프라인의 Triangle Rasterizer에서 곧바로 텍스쳐를 읽어와 이를 PutPixel에 전해주는 방식을 사용했다. 그러나 이 방식은 확장성에서의 문제가 있는데, 빛이라던가, 여러 수학적 공식들을 이용해 우리가 새로운 효과를 주고 싶어도 주지 못한다는 문제가 있다. 또 애초에 모든 3D 모델들의 vertex들이 전부 텍스쳐 정보를 가지고 있을 필요도 없다. (메모리 낭비다) 때문에 우리는 기존의 이 방식을 개선하기 위해 다음과 ..

computer graphics/3D Graphics

[3DGraphics] 8. 3D Pipeline

우리가 개발한 기능들을 일련의 과정으로써 통합해 하나의 파이프라인을 구축해보자. 우리가 구축하려는 파이프라인은 사실 현대의 그래픽스 파이프라인과 비교하면 큰 차이가 있다. 우리는 90년대 그래픽스에서 사용하던 Fixed Function Pipeline을 만들어 나갈 것인데, (이미 어느 정도 만들어 둔 상태이긴 하다) 이 방식은 개발 편의성의 문제를 가진다. 현대에는 온갖 시각 효과들이 존재하는 데 이러한 방식으로는 이런 효과들 하나하나마다 개별적인 함수를 일일히 다 작성해주어야 하고, 이는 효율적이지 못한 방식이다. flameEffect1(), flameEffect2(), ... 이런 식으로 모든 효과들마다 하나하나 함수를 작성해야 한다면 일의 능률이 떨어질 수 밖에 없고, 그 함수들을 일일히 디버깅하..

computer graphics/3D Graphics

[3DGraphics] 7. Texture mapping

텍스쳐를 사용하는 이유는 우리가 현실적으로 질감을 이루는 사물의 표면들을 폴리곤만으로 다 모델링해 나타내기가 어렵기 때문이다. 때문에 평면에 이미지를 입히는 것으로 질감 및 표면의 외형을 나타낸다. 텍스쳐를 폴리곤들의 표면에 입히기 위해 텍스쳐 맵핑을 사용하는데, 텍스쳐 맵핑의 원리를 알아보기 전에 어떻게 하면 안되는지를 먼저 알아보자. 2D 게임을 만든다고 가정해보자. 어떤 스프라이트 이미지 파일을 가지고 있는데, 이걸 화면 상에서 확대시키려면 어떻게 해야 할까? 스프라이트(이미지) 자체를 선형사상을 사용해 확대시키면 될 것 같지만, 실제로 이런 방식으로 구현하게 되면 위 사진처럼 이미지 사이사이 빈 공간이 생기게 된다. 이는 스프라이트(이미지)의 픽셀의 수는 한정되어 있음에도 이를 억지로 더 넓은 범..