본문 바로가기
Engineer/물리엔진

[번역] 렌더링 엔진 동작 원리 찍먹해보기-2

by _제이빈_ 2022. 4. 5.

원문을 공부하며 번역/의역한 것입니다. 이 과정에서 오류가 있을 수 있습니다. 오류가 있을 시 알려주시면 다시 공부해서 고치도록 하겠습니다!

Basic Shader Operation

가장 기본적인 OpenGL 연산은 Vertex position (attibutes)와 Model-World-View 공간(Uniform) 데이터를 필요로 한다.

Vertex Shader는 Attribute 뎅이터를 Model-World-View 공간 데이터로 변환하고 Fragment Shader에 전달해 준다. 그리고 Fragment shader는 받아온 Fragment의 색을 채우는 역할을 한다. 여기까지는 이전 포스트에서 OpenGL의 파이프라인을 다루면서 이해한 바 있다. 

 

Manipulating 2D/3D Views with Uniforms

원근법을 표현하기 위해서는 기본적으로 2가지 방법이 있는데, Orthogonal과 Projective가 있다.  Camera space에 맞춰서 계산을 할때 둘중 하나의 원근법으로 계산하게 된다. 이렇게 해서 Orthogonal 원근법으로 이차원의 프레임 버퍼에 들어온 화면은 아래와 같다.

그리고 Projective 원근법으로 표현이 되면 아래와 같이 이미지가 생성된다.

Applying textures to a game character

어떤 물체에 Texture를 입히기 위해서는 U-V coordinates와 Sampler를 Fragment shader에 보내줘야한다. 하지만 U-V 데이터는 Attribute이므로, Vertex shader를 먼저 지나게 된다. 그다음 fragment shader로 들어온다. 요약하면 아래와 같다.

사실 Texture는 그냥 이미지 데이터이다. OpenGL에서는 이 이미지를 GPU로 보내는데 이때 사용되는 것이 Texture Objects이다. Texture object는 Texture Unit에 위치한다. 그리고 fragment shader는 이 texture unit을 Sampler를 통해서 참조한다. 개념도는 아래와 같다.

그런 다음에 Fragment shader는 U-V Coordinates를 사용해서 sampler를 통해 캐릭터 위에 이미지를 적절하게 안착시킨다! 위 개념을 종합하면 아래와 같다.

Applying Light to a game character

Texture를 입혔으면, 이제 반사광을 입혀보자! 빛은 어디에나 존재한다. 빛이 없으면 아무것도 볼 수 없다. 비슷하게 컴퓨터 그래픽에서도 빛이 없으면 어떤 물체도 볼 수 없다. 빛의 효과를 만들어 내기 위해서는 GPU는 캐릭터의 Vertex position과 Normal coordinates가 필요하다. normal은 면의 수직인 법선백터이고, 이는 빛이 캐릭터에 미치는 영향을 적용하기 위해 사용된다. Normals는 attributes며, OpenGL 버퍼를 통해서 GPU로 전달되어진다.

 

결국 빛은  OpenGL Shader를 통해서 계산된다. OpenGL Shader는 Vertex나 Fragment shader의 역할도 할 수 있다. 하지만 필자는 Fragment shader가 보다 현실같은 결과를 보여주기 때문에 Fragment shader에서 빛을 계산하기를 추천한다.

 

Understanding Light in Computer Graphics

컴퓨터 그래픽 개발자라면 4가지 빛의 카테고리를 알아야한다.

Emissive Light : 광원이 없을 때 표면 자체에 의해 생성되는 빛을 말한다. 물체의 빛나는 색과 강도를 뜻한다.

Ambient Light : 특정 물체를 비추기 전에 여러 번 반사된 빛이다. 빛의 ambient 색상과 주변 물체의 ambient 색상에 따라 달라진다. 빛의 ambient 색상은 빛의 색상이나 강도를 의미하고, 주변 물체의 물질의 ambient 색상은 표면에서 반사된 빛의 전체적인 ambient 색상을 말한다.

Diffuse Light : 표면에 직접 부딪히는 빛이다. 입사 각도에 따라 달라지는데, 예를 들어 빛이 90도의 각도로 표면에 반사되는게 5도 정도로 반사될 때에 비해 밝은 것을 생각하면 된다. 이는 재료의 색이나 빛의 색, 조도, 빛의 방향과 물체 표면의 법선백터에 따라 달라진다. 아래가 diffuse light이다.

Specular Light : 매끄럽고 빛나는 물체에서 볼 수 있는 흰색의 번쩍이는 반사광이다. 이는 빛의 방향, 표면 정상 및 그리고 카메라의 위치에 따라 달라진다.

텍스쳐와 함께 빛 반사를 넣으면 아래와 같은 그림이 나온다.

결론

이런 지식을 활용하면 자신만의 렌더링 엔진을 만들 수 있다. 렌더링 엔진은 렌더링 관리자를 포함하고 있다. 이 관리자는 데이터를 GPU로 보내고 적절한 shader를 활성화하는 역할을 한다. 이렇게 하므로 렌더링을 다룰 수 있는 C++ 클래스를 만들 수 있을 것이다. 직접 엔진을 만들기 전에 아래 영상을 보길 추천한다.

 

반응형

댓글