본문 바로가기

STUDY/기타

Reducing Texture Memory Usage ( by Two Channel Color Encoding )

Intro

현대 게임에서 텍스처는 재질의 표현에 대한 정보를 저장하는 주요 수단입니다.
하나의 텍스처가 3D 메쉬 전체의 모든 재질을 포함하는 경우도 있습니다. 이들은 동일하게 개별적인 재질들을 표현하는데,
예를들어 벽, 지형, 식물, 잔해, 간단한 지물등이 있습니다.
이러한 단일 재질 텍스처는 종종 다양한 색상을 나타내지 않고 제한된 범위의 색조를 포함하는 반면, 
재질 표면 내의 하이라이트 및 어두운 영역 (예 : 음영 처리)으로 인한 전체 밝기 범위를 사용합니다


Texture Encoding Algorithm

위 그림은 UnitCube로 잘 알려진 RGB 색상 공간을 보여줍니다. 

각  source texel color는 이 큐브에 있는 한 점에 해당합니다.
두 채널을 사용하여 이 공간을 근사하는 것은, 우리가 source texture로부터 texel 집합에 최대한 가깝게 배치되는 표면(2차원 manifold다양체) 을 이 UnitCube 내에서 찾아야 하는 것입니다. 

디코딩 알고리즘을 단순화하기 위해, 단순 평면 또는 RGB UnitCube와 평면의 교차점을 사용할 수 있습니다(그림 22.1의 오른쪽 이미지). 
우리가 이미 luminance(휘도) 정보는 별도의 채널에서 무손실 인코딩해야 한다고 결정했기 때문에,

색상면은 RGB 공간의 원점인 0 휘도(검은색)를 통과해야 합니다. 따라서 2-channel의 단순화된 color space 압축은 단일 3차원 벡터(plane normal)로 정의됩니다.


Color Plane Estimation

평면을 대략적인 3D 점 집합(Color들의 분포들)에 맞추는 방법에는 여러 알고리즘이 존재합니다. 
color simplication(3D->2D)을 위한 최적의 plane을 찾기 위해서, 다음과 같은 준비 단계를 밟아야 합니다.

 

  1. 대부분의 이미지 파일 형식의 RGB 픽셀 색 값이 linear base color contribution(선형기반 색상)을 나타내지 않는다는 점을 기억해야 합니다. sRGB(Standard Red Green Blue) 색공간은 일반적으로 감마 값 2.2를 사용합니다. 이 알고리즘의 목적을 위해 우리는 선형 RGB color space에서 작동하도록 변환해야 합니다. 
    - 감마값 2.2를 사용하여 감마 보정을 적용할 때는 각 픽셀의 값에 감마의 역수(1/2.2 ≈ 0.4545)를 거듭제곱하여 조정합니다. (정확히는 감마곡선 사용) 선형공간으로 변환을 위해 각 픽셀에 감마를 곱하여 변환해줍니다. 
  2. 다양한 texture에 대해 받아들일만한 결과를 얻기 위해, weight를 곱해줍니다. 
    R : 1/2, G : 1, B : 1/4 으로, classic 휘도 컴포넌트 weight와 컴포넌트 평균과 같은 weight를 사용한 것의 사이값입니다.

    다행히 이러한 스케일링 요소에서는 인코딩 변경 후 인식되는 픽셀 색상의 차이가 거의 눈에 띄지 않습니다. 
    그러나 스케일링 계수는 각 텍스처에 대해 별도로 미세 조정하여 텍스처 표현을 개선하는 데 사용될 수 있습니다.
    먼저 휘도 계산에 사용된 RGB 성분 가중치를 사용해 보았지만(G에 가장 중요한것을 두고 B에 거의 두지않음.) 일부 material texture들은 균형 잡힌 가중치로 추정을 수행할 때 더 잘 표현된다는 것이 밝혀졌다.




◀ 위의 두 가지 작업을 고려했을 때, 초기 픽셀 색상 처리 전체는 다음과 같이표현할 수 있습니다. 

여기서 γ 는 입력 색상 공간에서 선형 색상 공간으로 전환하는 데 사용되는 감마 값이며 wr, wg 및 wb는 색상 구성요소 중요도 가중치입니다.
위의 고려 사항을 고려했을 때, 모든 텍셀의 색상은 3D 공간의 단일 점을 나타냅니다.
최적의 근사 색상 평면은 평면과 각 점 사이의 거리 제곱 합을 최소화하는 평면입니다. 
평면이 점(0,0,0)을 통과하는 것으로 가정하기 때문에, 우리는 평면을 정규로 표현할 수 있습니다. 실제로 점-평면 거리 계산은 점 곱으로 감소합니다.

RGB 공간을 사용하므로 벡터 성분에 일반적인 x, y, z 대신 r, g, b 레이블이 지정됩니다.

최적 평면 정규 벡터는 점 평면 거리를 최소화하는 벡터입니다. 이러한 문제는 거리 제곱합을 최소화하는 최소 제곱 적합법을 사용하여 해결할 수 있습니다.
거리 = |N 내적 (P - P0)| / ||N||

P(공간에서의 점), P0 평면위의 한 점) , N (정규벡터) 

평면위의 한 점이 0,0,0이므로 아래와 같이 식을 도출할 수 있다.

우리가 최소화하고자 하는 근사 오차는 단순 변환 후에 다음과 같이 표현됩니다.

 

 

 

 

 

미니멀리즘 구현을 위해 위의 방정식을 사용하여 텍셀 색상에만 따라 6개의 부분 합을 모두 계산할 수 있습니다. 
그런 다음 brute force 접근 방식을 사용하여 사전 정의된 잠재적 일반 벡터 집합을 테스트하여 전체 근사 오류를 최소화하는 방법을 찾을 수 있습니다. 
각 계산은 여러 곱셈과 추가 비용만 드는 선형 시간으로 수행되기 때문에 이 접근 방식은 여전히 충분히 빠릅니다.
최적 색상 평면을 찾은 후 마지막 단계는 역가중치를 사용하여 배율을 조정하여 색상 성분 가중치로 인한 색상 공간 왜곡을 되돌리는 것입니다. 
평면 정규 분포는 표면 정규 벡터이므로 정규 분포에 대한 불균일 공간 스케일링의 일반적인 규칙이 적용되며, 정규 분포에 그렇지 않으면 사용할 행렬의 역 전치를 곱해야 합니다. 전치가 스케일링 매트릭스에 영향을 미치지 않지만 행렬 반전이 영향을 미치며 최종 스케일링 연산은 다시 비수치 가중치를 사용합니다.

 

 

 


모든 후속 계산은 일반적으로 선형 RGB 공간에서 수행되므로, 우리는 sRGB로 변환하지 않아도 됩니다(비선형 변환일 수 있음).


Computing Base Colors

인코딩과 디코딩 프로세스의 중요한 파라미터는 두 가지 기본 색상입니다. 
RGB UnitCube를 절단하는 색상면은 삼각형 또는 사각형을 이루며 모서리 중 하나가 원점(0,0,0)에 배치됩니다.

그림 22.2에서와 같이 이 모양에서 원점과 인접한 두 모서리는 평면 색상 공간(planar color space)의 기본 색상으로 정의됩니다. 평면에서 사용할 수 있는 다른 모든 색상은 원점과 두 base color point에 의해 형성된 각도 내에 있습니다. 
색상 기준면은 원점에서 시작하여 UnitCube로 들어가기 때문에, base color points는 항상 UnitCube의 실루엣(0,0,0)에 있을 것입니다. base color를 찾기 위해 실루엣 모서리와 평면 교차점을 계산하기만 하면 원하는 point pair가 만들어집니다.
우리는 평면이 실루엣 vertex를 자르거나 심지어 실루엣 가장자리 쌍을 끼워넣을 수도 있다는 것을 명심해야 합니다. 따라서 점을 계산하기 위해 실루엣을 평면과 교차하는 두 점을 계산하여 실루엣 주변을 걷는 알고리즘을 사용할 수 있습니다.
key observation은 평면에 걸쳐 있는 벡터의 각도로 색조 값을 나타내거나 또는 두 기본 색상 사이의 선형 보간법을 사용할 수 있다는 것입니다. 
최종 색상을 계산하기 위해서는 휘도를 조정하고 필요한 최종 색상 공간 변환만 수행하면 됩니다.

Luminance Encoding(휘도 인코딩)

인코딩되는 색상의 휘도는 직접 저장됩니다. 색상이 선형 RGB 공간으로 변환된 후, sRGB에서 XYZ 색 공간 변환에서 파생된 "perceived luminance value (감지된 휘도 값)"을 구하는 고전 방정식을 사용할 수 있습니다.

L = 0.2126 · R + 0.7152 · G + 0.0722 · B.

가중 계수는 최대 1이므로 휘도 값은 0부터 1까지입니다. 
휘도는 자체 전용 채널을 2-channel form 으로 가지므로 이제 직접 저장할 수 있습니다. 그러나 휘도 인식이 선형적이지 않기 때문에 휘도 저장에 감마 값 2를 사용하고 있다.
이는 표준 감마 2.2와 충분히 비슷하고 어두운 색상은 눈에 띄지않는 하이라이트 감소로 luminance resolution(휘도 해상도)를 향상시키는 이점을 제공한다. - 몬말인지..? 암튼
또한, 감마2는 휘도가 간단히 인코딩시 루트씌우고, 디코딩시 제곱해서 계산될 수 있다는 것을 의미한다. 

Hue Estimation and Encoding(색조 예측과 인코딩)

색조를 인코딩하기 위해서, 대략적인 평면에서 가장 가까운 적절한 색상을 찾은 다음 적절한 색조를 얻기 위해 기본 색상을 혼합해야 하는 비율을 찾아야 합니다. 
색조 인코딩 프로세스는 그림 22.3에 나와 있으며 다음과 같이 윤곽을 나타낼 수 있습니다.

1. 선형 RGB 공간의 색상점을 색상 평면에 투영합니다.
2. 평면에서 점의 2D 좌표를 계산합니다.
3. (0,0,0) 및 점을 통과하는 평면에서 2D 선을 찾습니다.
4. 선이 기준 색상 점 사이의 2D 선과 교차하는 비율을 찾습니다. 즉, 기준 색상의 혼합 계수를 결정합니다.

 

첫 번째 단계는 간단한 geometric 연산입니다. 
두 번째 단계부터 평면 내에 내장된 2D 좌표에 geometric연산을 수행해야 합니다.
두 BaseColor 점 A, B로 우리는 평면의 틀 2D좌표를 계산할 수 있습니다. 

그리고 내적을 이용해서 평면내의 어떤 점을 계산할 수 있습니다.

(xi, yi) = (Pi · Fx, Pi · Fy) .


인코딩되는 색상과 가장 가까운 평면에서 포인트의 명시적 RGB 좌표가 아니라 평면, xi 및 yi 내의 2D 좌표만 필요합니다. 평면에 투영된 원래 점과 점 모두 동일한 2D 좌표를 가지므로 윤곽선 알고리즘의 1단계를 완전히 건너뛸 수 있습니다.
평면 투영은 2차원으로만 축소되는 부작용입니다.

색상 평면 내에 내장된 점을 고려할 때 색조에 대한 기본 색상 혼합 계수를 계산하는 문제가 이제 두 선의 교차 문제로 축소됩니다 : 인코딩되는 평면의 원점과 점을 통과하는 선과 기본 색상 점을 모두 연결하는 선입니다.

이를 통해 다음과 같은 선 교차 방정식을 얻을 수 있습니다.

A + t(B − A) = sP.

t에 대한 이 선형 방정식을 풀면 기본 색상 혼합 계수(base color blend factor)가 인코딩된 점의 색조와 가장 근접하게 일치하는 색조를 얻을 수 있습니다. 
이 혼합 계수가 두 번째 채널에 직접 저장되므로 2채널 인코딩 프로세스가 완료됩니다.


Decoding Algorithm

디코딩 알고리즘은 간단하며 목록 22.1의 실제 디코딩 셰이더 코드로 가장 잘 설명됩니다.
첫째, 상수 데이터로 전달되는 기본 색상 bc1과 bc2는 두 번째 데이터 채널에서 나오는 혼합 계수와 혼합되어 원하는 색조를 가지지만 휘도가 잘못되었습니다. 이 휘도는 color_lum으로 계산됩니다. 다음으로 원하는 휘도 목표값_lum을 데이터 제곱의 첫 번째 채널 값으로 계산합니다(휘도를 감마 2로 저장했기 때문).
결과 색상이 선형 색상 공간에 있으므로 색상을 현재 휘도로 나눈 후 원하는 색상으로 곱하면 휘도를 조절할 수 있습니다. 
필요하다면, 우리는 당연히 프리젠테이션을 위해 계산된 색상을 비선형 색 공간(nonlinear color space)으로 변환할 수 있습니다.


Encoded Image Quality

다음은 인코딩/디코딩 process의 예시를 보여줍니다.


예제 텍스처는 CG 텍스처 라이브러리에서 가져온 것으로 비교적 풍부한 내용과 다양성 때문에 선택되었습니다.

그림 22.4는 잔디 패치를 사용한 흙 질감의 2채널 근사 결과를 보여줍니다. 흙과 풀 모두 약간씩 재현되지만 대부분 눈에 띄지 않는 색상 차이가 있습니다. 제한된 컬러 소재 텍스쳐를 염두에 두고 디자인한 방식이라, 이미지에 추가된 color 조사도 물론 성능이 크게 저하됐지만 추정 알고리즘이 이미지에 가장 잘 맞는 녹색-보라색을 선택했다는 점은  확실히 보여진다. 
이러한 익스트림 컬러는 텍스처에서 직접 사용할 수는 없지만, 이 단계에서는 녹색과 보라색이 혼합되어 나타나는 모든 색상이 사용 가능하며, 여기에는 전환 영역(transition zone)에서 채도가 감소된 색상이 포함된다는 것을 기억해야합니다. 픽셀 휘도의 별도 처리로 인해 처리 및 저장 반올림 오류를 제외하고 휘도(luminance) 값은 영향을 받지 않습니다.

 

그림 22.5와 22.6은 혼합 재료를 사용한 텍스처의 두 가지 예를 보여줍니다.
이번에는 estimation process에서 첫 번째 이미지는 blue-yellow, 두 번째 이미지는 teal(청록)-orange 평면을 선택했습니다. 
돌과 풀의 질감은 대부분 영향을 받지 않지만, 모래, 풀, 돌의 질감은 절충안(compromise resulting)을 찾아야 했고, 이로 인해 풀이 퇴색되었고 더 작은 색채가 없는 요소들은 색이 완전히 변했습니다.


결론 

이 장에 나와 있는 인코딩 및 디코딩 방법을 사용하면 두 개의 텍스처 채널만 사용하여 낮은 색상의 텍스처를 저장할 수 있습니다.
이는 명백한 절감(saving)효과 외에도 추가적인 가능성을 열어줍니다.

예를 들어, 대부분의 texture sampler 구현이 4-channel textures를 지원한다는 점을 고려할 때, 나머지 두 채널은 재료 노멀 맵의 x 및 y 구성요소 저장과 같은 다른 용도로 사용할 수 있으므로 하나의 텍스처 이미지만으로 compact한 material 표현이 가능합니다. 
이 피처를 사용하지 않더라도 제안된 2-channel 색상 인코딩이 luminance-hue 분해에 의존한다는 사실은 사용자 지정 텍스처 압축 알고리즘(custom texture compression algorithms)을 가능하게 합니다. 텍스처 압축 중 luminance 정보에 더 높은 우선순위를 부여하여 사람의 눈이 변화에 덜 민감한 부분인 hue에서 압축 error의 대부분을 축적하는 방법을 통해 전체적인 압축 이미지 품질을 높일 수 있습니다. 또한 제안된 인코딩 방식을 기존 mip-mapping 솔루션과 함께 직접 사용할 수 있다는 점에 유의해야 합니다. 왜냐하면 luminance값과 색 혼합 인자의 평균화는 색상 값의 평균화에 대한 좋은 근사치이기 때문입니다. 
luminance 값은 감마 제곱으로 저장되며 전체 조명 파이프라인에서 완전한 선형 색상 처리가 필요한 경우 사용자 지정 mip-map 체인 생성이 필요할 수 있습니다.

'STUDY > 기타' 카테고리의 다른 글

NSUrlSession (1) - IOS의 다운로더 만들기  (0) 2020.04.10
Simplygon SDK 7.1 Docs (2)  (0) 2019.09.01
Simplygon SDK 7.1 Docs  (0) 2019.08.18