분류 전체보기

개발/그래픽스

[3DGraphics] 19. Implementing Vec4, Mat4

크기 4짜리 벡터와 4x4 행렬을 우리 프레임워크가 지원가능하도록 만들어보자. 더 자세히 들어가기 전에, 우리의 프레임워크는 row vector(가로로 긴 형태의 벡터)를 기본값으로 한다는 걸 예전 글에서도 언급한 적 있다. (DirectX 또한 row vector를 기본값으로 한다 - https://nicoschertler.wordpress.com/2012/01/27/directx-and-matrices/) 때문에 행렬-벡터 연산 또한 이에 맞추어 계산된디. (실제로 아래 코드에서 .Translation() 함수를 살펴보면 우리가 흔히 아는 변환행렬의 꼴을 transpose한 모습, 즉 tx ty tz가 행렬 아랫부분에 위치하고 있음을 알 수 있다.) 왜 4x4를 지원해야 하는가에 대한 설명은 잠시 뒤..

개발/그래픽스

[3DGraphics] 18. Specular highlights

물체가 질감에 따라 다르게 보이는 이유는 무엇일까? 질감에 따라 표면의 울퉁불퉁한 정도가 다르고, 때문에 빛이 표면에서 반사되는 방향이 표면 자체의 방향과 일치하지 않기 때문이다. 이번 포스트에서는 이러한 질감을 구현하기 위해 물체의 Diffuse와 Specular한 정도에 따라서 빛이 적절한 수준으로 퍼지게 만들어 보다 현실적인 그래픽을 그려보겠다. 구현에 앞서 한가지 질문을 던져보겠다. 반짝거리는 금속과 같은 물체에 보이는 "광"은 왜 나타나는 것일까? 빛이 물체의 표면에 맞고 반사되어 카메라(관찰자)를 향해 맞는다면 그 부분이 더 밝게 보이기 때문에 광이 보이는 것이다. 이를 컴퓨터그래픽스에서는 어떻게 구현해야 할까? 단순히 어떤 빛이 물체의 표면 위의 점 A에 맞고 튕겨나온 반사광이 카메라가 위치..

일상

성장하는 나

작대기 3개 어느덧 제 군생활이 절반 이상 지나갔네요... 그중 특히 2022년은 제 인생 전체를 통틀어서 가장 많은 변화를 겪은 해가 아니었나 생각합니다. 개인적인 일들도 있었고, 무엇보다 군대라는 공간 속에서 제 스스로 정말 많이, 아주 많이 변화했다고 생각합니다. 대체 뭐가 그렇게 달라졌느냐고 물으신다면, 저는 크게 다음 두 가지, 내 목표를 이루기 위한 능력들을 갖춰나가는 지적 성장, 그리고 보다 더 나은 사람이 되기 위한 내적 성장 을 이루었다고 말씀드리고 싶습니다. 저는 끊임없이 학습하고 스스로를 더 나은 사람으로 만들어나가는 것을 멈추지 않아 왔습니다. 지식을 추구하는 것은 제 가장 큰 즐거움 중 하나이고, 삶의 원동력이 되기 때문입니다. 그런 저에게 입대는 하나의 시련처럼만 느껴졌습니다. ..

개발/그래픽스

[3DGraphics] 17. Phong shading & Per-pixel lighting

오늘은 phong shading, 정확히는 per-pixel lighting을 살펴보자. phong shading은 per-pixel lighting에 추가적으로 다른 개념들이 사용된 셰이딩 방법이지만, 일단은 편의를 위해 phong shading이라고 표현하겠다. 지난번 글에서 우리의 파이프라인의 point light에 한가지 문제가 있음을 언급했다. 이 사진을 보면 이해가 빠르다. 바로 빛이 거리의 영향을 받지 않는 문제이다. 그러나 우리는 분명 지난 시간에 거리에 따른 빛의 명암을 구현했는데, 이게 무슨 일일까? 물체를 기울여보면 그 문제의 원인에 대해 대략 감을 잡을 수 있다. 우리가 빛과 물체의 거리를 측정할 때는 정점을 기준으로 하고 있다. 그리고 정점과 정점 사이의 공간에 대해서는 두 정점에..

개발/그래픽스

[3DGraphics] 16. Point lights

Directional light로는 표현할 수 없는 상황들이 게임 속에는 다수 존재한다. 빛과 물체의 상대적인 위치에 따라 물체에 가해지는 명암이 달라지는 경우 특히 그러한데, 방 안에 전구가 있고 그 전구를 기점으로 물체가 빙글빙글 돌아갈 때의 명암을 생각하면 쉽다. 또한 빛과 물체의 거리와 상관없이 빛의 세기가 일정한 directional light와는 다르게, 먼 물체일 수 록 더 어둡게 표현하고 싶다면 다른 형태의 빛이 필요하다. 이런 상황들에서 사용할 수 있는 게 바로 point light 이다. 상대적인 위치에 따라 명암을 동적으로 계산할 뿐만 아니라, 거리에 따라 빛이 감소(dropoff)하기도 한다. 이는 1/(거리)^2 에 비례한 형태로 나타나는데, 이때 명암을 단순히 1/x^2로 설정해..

개발/그래픽스

[3DGraphics] 15. Gouraud shading

Gouraud shading에 대해 알아보자. Gouraud shading은 flat shading과 다르게 폴리곤 별로 색상 하나를 지정해주는 방식의 shading이 아니라 모든 폴리곤들에 대해 색을 interpolate 시켜서 부드러운 명암 효과를 줄 수 있다. 이를 시각적으로 쉽게 알아보기 위해서는 구 오브젝트에 셰이딩을 적용시켜보는 게 가장 직관적인데, 이를 위해 우선 구를 제작해보자. 구형 오브젝트를 만드는 방법은 여러가지가 있지만 이번 글에서는 위도와 경도를 이용한 방법을 사용하겠다. 이 방법을 사용해 일단 모든 정점들을 생성하고 (격자의 교점) 그 정점들이 생성하는 모든 폴리곤들을 점과 맵핑해 생성한 후 위 뚜껑과 아래 뚜껑을 제작하면 구 생성이 종료된다. 이를 구현하기 위해 우리는 z축(꼭..

개발/그래픽스

[3DGraphics] 14. Flat shading and Mesh loading

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

개발/수학

[Mathematics] 28. 회전목마

바로 이전 포스트에서 우리는 회전목마와 상자의 운동을 행렬곱으로 표현해보았다. 그러나 해당 방식은 물체가 회전목마에서 닿았다 떨어졌다 하는 상황에서 동적으로 변경해줄 수 없다는 문제가 있다. 즉 게임 내의 회전하는 원판 장애물 등으로는 활용할 수 없다는 이야기다. 이번 포스트에서는 Move parents라는 개념을 사용해 이를 개선해보자. 사실 지난 포스트에서 다룬 회전운동을 표현하는 수학적 원리는 전부 동일하다. 단 이제부터는 각 오브젝트가 Move parents를 가질 수 있고, 만약 Move parents가 있을 경우 이 오브젝트의 transform은 Global transform 대신 Local transform을 통해 표현한다. 이를 회전목마 운동에 대입시켜보자. 우선 회전목마는 move par..