8. Textures

햄스터·2025년 6월 14일

ComputerGraphics

목록 보기
7/11

Textures

Texture가 뭘까요?
Texture란 any space에서든, 반복 되는 패턴을 Texture라고 칭합니다.

Physical Space에선 우리가 보는 Image Pattern을 이야기합니다.

Computer Graphics에선, texture는 GPU Memory에 있는 Image를 의미합니다.
원래는 벽지처럼 반복되는 패턴을 뜻했는데,
지금은 그냥 GPU Memory에 있는 Image를 texture라고 불러요.

Why use textures?

Geometry는 작게 유지하면서, Pattern / Material만 바꾸는 형태를 갖고 싶어서
Texture를 씁니다.

그러면 복잡하게 geometry의 삼각형마다 패턴을 일일이 입력할 게 아니라, 한번에 입힐 수 있게 됩니다.

이론적으로는 Geometry Modeling도 가능합니다. 만,

이런 구름같은 걸 볼 때, 이걸 그리려고 생각해보면, 시뮬레이션이 보통이 아니겠죠.
물방울의 산란, 그에 따른 반사, 통과, 겹침까지 전부 고려를 해야 하는데,
그렇게 한들 뭐 배경으로 쓰일 구름에 뭐가 남겠습니까.

그래서 그냥 사진을 찍어서 붙이자.가 기본 기조입니다.

Orange를 Modeling하고 싶다고 합시다.

이렇게 오렌지색 구체를 모델링했더니, 탁구공이 됐죠.
오렌지의 그 표면이 없어졌습니다.


이 우둘투둘한 표면을 모델링 하기 위해 수많은 polygon을 써도 됩니다. 가능은 해요.
근데 너무 costly하죠.

그래서, 오렌지의 사진을 찍어서, 이미 있는 geometry에 껍데기로 씌우자. 하는 것입니다.


물론 이런 우둘투둘함이나 빛의 반사 등은 그대로 사진을 입혀버리면 잘 반영이 안 됩니다.
그에 대한 대안으로 Bump mapping이나 Displacement Mapping이 존재합니다.

Texture Mapping

surface material을, 특히 Shading Parameter를 정의하는 기술입니다.
이 때 surface material이 surface의 position에 따라 변하게 하는 기법입니다.

Diffuse Texture Mapping

polygon의 내부를 채울 때 image의 color를 씁니다.
Texture mapping의 가장 기초가 됩니다.

Mapping 2D texture to 3D Surface

2D 이미지를 3D surface에 붙이려면 어떻게 할까요?

2D를 주면 3D surface position이 나오던가,
3D surface position을 주면 2D surface position이 나오던가
둘 중 하나는 해야 합니다.

Texture는 2D고, (s,t)(s,t)(u,v)(u,v)로 씁니다.
Surface는 (x,y,z)(x,y,z)로 된 3D function이구요.

그래서 forwardbackward의 2가지 mapping approach가 존재하게 됩니다.

forward는 2D texture에서 시작해서 계산 후 3D Surface에 쓰는 것이고,
backward는 3D Surface에서 시작해서 2D Texture의 어디서 찾아올 지 정하는 것입니다.


(s,t)(s,t)는 이미지 그 자체의 좌표죠.

World coordinate는 개념적으로 매핑이 일어나는 곳이구요.
우린 Texture Coordinate와 World Coordinate를 잘 연결시키면 됩니다.

Forward Mapping


2D의 포지션이 3D에서 어디 있을지 찾는 기법입니다.
x=x(s,t),y=y(s,t),z=z(s,t)x = x(s,t), y = y(s,t), z = z(s,t)로 변환하면 되죠.
개념적으론 맞죠?
근데 이렇게 하면 이미지를 재사용할 수 없습니다.
이미지 1개당 surface 1개씩 나오거든요.

그래서 Backward를 씁니다.

Backward Mapping

s=s(x,y,z),t=t(x,y,z)s = s(x,y,z), t = t(x,y,z)입니다.

x,y,z를 줬을 때 어디서 읽어와야 하냐? 를 찾는 기법이죠.

근데 엄청 오래걸려서 보통은 미리 정의된 매핑 (pre-defined texture coordinate mapping)을 씁니다.

Vertex에는 3가지 attribute가 있습니다.
Position, Normal, Texture Coordinate.
Texture Coordinate가 이 매핑입니다.

그래서 rasterizer가 interpolate할 때,
적당히 갖고 있는 Texture Coordinate를 이용하여 interpolate할 수 있게 됩니다.

그래도, 간단한 geometry들은 우리가 직접 mapping할 수 있습니다.

먼저,

구나 실린더같은 간단한 surface에 텍스처를 mapping합니다.


그 후에, 그 간단한 surface 내에 원하는 intermediate surface를 집어넣고,

외부에 있는 map을 normal vector를 이용해 projection시켜 매핑할 수 있습니다.

how to do in practice?

실제로는 우리가 직접 texture mapping을 하지는 않습니다. (못합니다.)
3D modeling artist들이 만든 pre-defined texture coordinates를 이용하죠.

또 그림 한 장에 필요한 texture를 다 집어넣는 texture atlas 기법도 씁니다.

Texture Sampling and Featuring

Resampling

texture와 fragment는 둘 다 Raster Image입니다.

그리고 Texture나 Fragment나, 둘 다 Sampling을 쓰기 때문에, 얼마나 Dense하게 했는지, 얼마나 Sparse하게 했는지를 알 수 있는 Sampling Rate가 존재하고,

만약 그 Sampling Rate가 안 맞는다면 정말 거슬리는 현상aliasing이 발생합니다.

Magnification vs Minification

실제 surface resolution이 더 커서 texture가 확대되는 현상인 magnification,
실제 surface resolution이 더 작아서 texture가 축소되는 현상인 minification.

그리고 축소할 때 더 큰 문제가 생깁니다. 왜냐면 Interpolation으로 커버되지 않거든요.

4칸을 1픽셀로 줄여야 한다면 4칸 중 어디서 값을 얻어와야 합니까?
그게 문제가 됩니다.

Magnification의 경우,

하나의 Texel이 window space에서 인접한 pixel들로 확장되기 때문에,
그걸 그대로 쓰던가,
예쁘게 window space에서 interpolate해줄 수 있습니다.


fragment들이 인접한 Texel에서 색을 끌어와 쓴다면, Nearest Point Sampling이고,
자신 근처의 Texel 4개의 색에서 색을 얻어 Interpolate한다면
Bilinear Interpolation입니다.

Minification의 경우,

이렇게 고주파의 정보가 촘촘하게 sampling되지 않으면,
Surface Resolution < Texture ResolutionMinification alias 문제가 생깁니다.

아마 surface space에선 흰색만 찍힐거에요.


끝으로 갈수록 촘촘해지니까, aliasing 문제가 생기죠. 지글지글해보이죠.
이게 Sampling Rate가 모자라서 원래 signal에서 다 못 들고 오는
Undersampling입니다.

Pre-integration for minification

그래서 여러번 샘플링을 한 것처럼 미리 합쳐놓는 Pre-integration을 사용합니다.

가로-세로로 미리 합쳐놓는 Data Structure인 summed-area tables를 이용하던가,
그 사이에 있는 mipmapping을 사용합니다.
(mipmapping은 OpenGL 표준입니다.)

Mipmapping


4칸을 합쳐서 1칸으로 내리고, 4칸을 합쳐서 1칸으로 내리고..
이 구조를 Mipmap이라고 부릅니다.


그리고 이 Mipmap level에 대해 각 level의 중간쯤에서 Linear Interpolation을 한번 더 들어가는 기법이 Trilinear Interpolation이라고 합니다.

profile
햄스터가 세상을 지배한다.

0개의 댓글