Texture is Data, Material is Behavior

텍스처와 머테리얼. 우리는 두 개념을 제대로 이해하고 있는가?
남에게 설명할 수 있을 만큼 충분히 정리한 상태일까?
대화하다 보면 쉽게 뒤섞이는 두 가지를 지금 여기서 잡고 가고자 한다.

텍스처는 전통적으로 repeated pattern을 의미했다. 벽지의 반복되는 무늬가 텍스처라 할 수
있겠다. 그러나 오늘날 그래픽스에서 텍스처는 GPU에 올라온 이미지를 가리키게 되었다.
이 2D 이미지는 색, 거칠기, 노멀, 금속성 정보 등을 가진 데이터다. 지나가다 하늘이 너무
예뻐서 사진으로 찍었다. 그걸 렌더링할 때 사용하면 텍스처다. 이때 텍스처에서 픽셀로 가져오기
위한 주소가 UV좌표다.

머테리얼은 오브젝트 표면이 빛과 어떻게 상호작용하는지를 정한다. 이를테면 어떤 셰이딩 모델을
쓸 지, 얼마나 반짝일 지 정도가 머테리얼이다. 즉 surface를 어떤 규칙을 가지고 렌더링할 지를
명시한다.

예시를 들어보자.
벽지를 렌더링할려고 한다. 거기에 쓰일 사진은 분명 텍스처다. 그러나 그 벽이 어떤 광택을 가지는지,
얼마나 금속을 닮았는지(즉 얼마나 매끈한지)는 텍스처만으로는 알 수 없다.

여기까지만 보면 분명하게 구분되는 것 같지만 사실 머테리얼은 텍스처를 포함하고 있다.
텍스처 없이도 머테리얼은 가능하지만, 텍스처는 머테리얼 없이는 렌더링될 수 없다.
텍스처는 단독으로 화면에 그려지는 것이 아니라, 머테리얼에 의해 해석되어 렌더링된다.
좀 더 풀어서 텍스처가 무엇을 그릴지에 대한 정보라면 머테리얼은 그것을 어떻게 보이게 할지
정한다. 좀 더 직관적으로, 텍스처는 코드가 아니지만, 머테리얼은 셰이더 코드로 표현된다.
그럼 왜 텍스처 없이도 머테리얼이 가능한 지 명확해진다. 셰이더 코드에서 단색을 넣으면 된다.

결국 렌더링은 데이터가 아니라 규칙으로 결정된다.
그리고 그 규칙을 정의하는 것이 바로 머테리얼이다.

지금까지의 설명이 확 와닿지 않을 수 있다. 그럴 때는 텍스처와 머테리얼이 동일하다고 느껴지는 상황을 정리하면 된다.
그건 바로 머테리얼의 여러 속성 중 Albedo(Base Color) 하나만 사용하는 경우다. 특히 빛이 없는 상황에서는
다른 속성들은 사용되지 않기 때문에 이런 현상을 관찰할 수 있다.

제미나이 Nano Banana 2가 생성한 이미지다.
생각보다 잘 만들어진 거 같아 첨부한다.

(여담) geometry는 최대한 간단하게, material은 최대한 복잡한 걸로

오늘날 렌더링은 결국 눈속임에 가깝다.
초기에는 디테일을 표현하기 위해 vertex의 개수를 늘려 geometry을 촘촘하게 만드는 방식이
주를 이루었다. 그러나 모델을 복잡하게 만드는 건 GPU에서의 계산 비용을 크게 늘렸다. 그래서 게임 그래픽스는
geometry는 비교적 단순한 폴리곤 구조로 유지하고, 표면의 디테일은 normal map과 같은 텍스처를 통해
보완하는 방향으로 발전했다. 2000년대 초반 게임 속 각진 폴리곤들은 그 과도기였다.

그렇다고 그래픽 품질의 개선이 단순히 하드웨어적 발전과 그에 따라 달라지던 geometry의 퀄리티에 의존했던 건
아니다. 머테리얼, 셰이딩, 라이팅 기술이 함께 발전하면서, 비교적 단순한 geometry로도 더 사실적인 결과를
만들어낼 수 있게 되었다. 최신 물리 기반 렌더링(Physically Based Rendering)도 결국 머테리얼 기술의 일환이다.
오늘날 렌더링은 geometry보다는 material과 shading을 통해 디테일을 만들어내는 방향으로 발전해왔다.
여전히 리얼함을 위해선 눈속임이 필요하다.