블로그 이미지
자신의 단점을 메꾸는 것을 단(鍛)이라 하고 자신의 강점을 갈고 닦는 것을 련(鍊)이라 하여, 두가지를 합친 것을 단련이라고 부른다. 붕대마음

카테고리

전체목록 (666)
참고사이트 (8)
Goal (4)
Travel (10)
My Life (105)
Game (35)
Game Review (7)
Game Plan (0)
Books (5)
English (1)
Optimizing (12)
Study (217)
유용한 것들_etc (44)
유용한 것들_func (20)
Unity (48)
Unreal (87)
작업장 (54)
RenderMonkey (6)
정리요망 (1)
따라잡기 시리즈 (0)
링크용 (0)
Total343,756
Today5
Yesterday73

'Study/Graphics '에 해당되는 글 41건

  1. 2019.06.15 Clipmaps
  2. 2018.08.29 early z
  3. 2018.07.20 hlod
  4. 2018.03.10 What is Texture
  5. 2018.02.21 texture format
  6. 2018.02.13 shader에서 채널값이 모자를 때...
  7. 2018.01.31 depth-precision-visualized
  8. 2018.01.26 디더링 (Dithering)
  9. 2017.02.05 Texture types
  10. 2016.12.29 rgbm

Clipmaps

Study/Graphics / 2019.06.15 14:55

원문 : Clipmaps

원문을 보시길 적극 추천.



요약

클립맵은 지형에 매우 높은 해상도의 텍스쳐를 매핑할수 있게 하는 SGI 워크스테이션에서 처음 구현된 기능이다.

원본 SGI 구현은 매우 전문적인 맞춤형 하드웨어가 필요했다.

NVIDIA GeForce 8800의 고급기능은 현재  소비자의 하드웨어를 사용하여 같은 알고리즘을 허용한다.

비록 현재 API들과 GeForce 8800가 8192 크기의 텍스쳐를 직접적으로 지원할 지라도, 

이 크기가 비행 시뮬레이션같은 넓은 경치를 말할때는 충분하지 않을지도 모른다.

전체 경치에 하나의 텍스쳐를 사용하는 이 아이디어는 전체 경관 텍스쳐를 한번에 디자일 할 수 있을 뿐 아니라

파라미터화 시키는 것도 간단하다.

큰 텍스쳐는 몇개의 텍스쳐를 사용하여 블렌딩 하는 기존 방식에 비해 큰 이점을 가진다.

이는 텍스쳐를 원하는 만큼 복잡하게 디자인 할 수 있다는 것이다.

디자이너가 하나의 전체 맵을 만들었으므로 그걸 그대로 사용할 수 있다.


클립맵은 원근투영이기 때문에 텍스쳐 밉맵 피라미드 내의 상대적으로 작은 영역만

모든 프레임에서 엑세스 한다는 사실을 이용한다.

따라서 우리는 뷰어를 여기저기 이동할 때 이러한 "hot"영역을 관리하고 

비디오 메모리에서 업데이트 해야 한다.

DX10 해결책은 이러한 영역들을 텍스쳐 배열에 저장하는 것이다.

픽셀셰이더에서 인덱싱 할 수 있다면 DX10에서 클립맵 알고리즘을 간단히 구현할 수 있다.


클립맵은 작동 방식

클립맵은 모든 단일 프레임에서 텍스쳐링에 필요한 모든 정보를 가지고 있는

밉맵피라미드의 부분 표현이라고 정의할 수 있다. 

소스텍스쳐로부터 어떤 데이터가 사용될것인지 어떻게 결정할까?

답은 밉맵 샘플 선택 전략에 있다.

텍스쳐링을 하는 동안 픽셀의 영역에 텍셀을 1대1 매핑하여 사용할 수 있게 하는 것이 가장 이상적인 방법이다.

이것이 현재 화면 해상도를 기반으로 밉맵레벨에서 클립 사이즈를 정의하는 방법이다.

밉맵 피라미드의 가장 낮은 레벨은 항상 비디오 메모리에 적재되고 고정적으로 사용된다.

다른 모든 밉레벨은 모든 프레임에서 실제 데이터를 저장하기 위해 동적으로 업데이트 되는 클립맵 스택을 형성한다.

가장 일반적인 경우 스택의 내용은 스택의 크기와 뷰어의 위치에 따라 정의할 수 있다.


그림설명 : 

  위 그림은 클립맵을 그림으로 표시한 것이다.

  파란색 밉 레벨들은 전체 월드에 매핑되는 데이터를 표시한다.

  녹색 지역은 동적으로 로드되는 하위(sub)지역이다.


기본 아이디어는 하나의 2D 텍스쳐 배열에 클립맵 스택을 저장하는 것이다.

텍스쳐 배열은 DX10에서 추가된 기능이다.

밉맵 피라미드의 나머지 부분은 밉과 함께 기존방식의 2D텍스쳐로 구현된다.

하위 리소스 메소드 복사/업데이트를 사용하여 동적으로 스택을 갱신할 수 있다.

때로는 시스템 메모리에서 필요한 모든 데이터를 가지고 있을수 없는 경우도 있다.

그러므로 디스크에서 필요한 모든 데이터를 효율적으로 스트리밍 하기 위한 추가 메커니즘이 필요하다.


데이터 표현

클립맵 스택은 2D텍스쳐 배열에 저장된다.

이 배열은 클립맵의 동적인 부분을 이루고, 각 프레임에서 모든 밉레벨의 실제데이터를 포함해야 한다.

원본 밉 레벨마다 별도의 레이어가 있으므로, 밉이 없는 텍스쳐를 만들어야 한다.

나머지 이미지 부분은 기존의 일반적인 2D 텍스쳐로 저장할 수 있다.


DX10 API를 사용하여, 아래와 같이 리소스를 만든다.

(Clipmap 스택 텍스쳐의 경우 ArraySize 요소를 사용해 레이어 수를 지정해줘야 한다.)


D3D10_TEXTURE2D_DESC texDesc;

ZeroMemory( &texDesc, sizeof(texDesc) );


texDesc.ArraySize = 1;

texDesc.Usage = D3D10_USAGE_DEFAULT;

texDesc.BindFlags = D3D10_BIND_SHADER_RESOURCE;

texDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;

texDesc.Width = g_PyramidTextureWidth;

texDesc.Height = g_PyramidTextureHeight;

texDesc.MipLevels = g_SourceImageMipsNum - g_StackDepth;

texDesc.SampleDesc.Count = 1;


pd3dDevice->CreateTexture2D(&texDesc, NULL, &g_pPyramidTexture);


texDesc.ArraySize = g_StackDepth;

texDesc.Width = g_ClipmapStackSize;

texDesc.Height = g_ClipmapStackSize;

texDesc.MipLevels = 1;


pd3dDevice->CreateTexture2D(&texDesc, NULL, &g_pStackTexture); 

각주 : 피라미드용 텍스쳐하나와 스택용 텍스쳐 하나필요.

피라미드용 텍스쳐에는 원본 이미지의 밉레벨에서 동적으로 사용될 스택을 뺀 만큼의 밉이 필요.



정보 갱신 전략

지형을 이리저리 이동하면서, 새로운 클립 중심 위치에 맞게 스택의 정보를 갱신해줄 필요가 있다.

대부분의 경우에는 클립맵 스택(동적으로 바뀌는 부분)의 각 레이어에 있는 비교적 작은 부분의 데이터를 바꿔줘야 한다.

스택안에서 큰 데이터 교체가 일어나는 것을 방지하기 위해, toroidal addressing라고 알려진 특정 기술을 사용한다.

Toroidal addressing은 이미지의 위쪽 새 데이터가 아래에 로드되고, 오른쪾의 새 데이터가 왼쪽에 로드된다.

이 개념의 접근방식은 중첩된 영역에 대한 변경을 필요로 하지 않기 때문에 아래의 경우 무척 효율적이다.


그림 2. 스택의 단일레이어에 대한 두가지 업데이트 단계


대부분의 어플리케이션에서는 가로와 세로 부분을 개별적으로 업데이트 하여

L자 모양 대신 간단한 직사각형 영역을 만들 수 있으므로 이 프로세스가 더 간단해 질 수 있다.


클립맵 텍스쳐 주소

모든 작업은 픽셀 셰이더에서 처리한다.

우선 가져올(fetch) 밉레벨을 결정할 필요가 있다.

이를 위해 ddx와 ddy명령어를 사용하여 화면공간에서의 쿼드 크기를 찾는다.

float2 dx = ddx(input.texCoord * textureSize.x);

float2 dy = ddy(input.texCoord * textureSize.y);

float d = max(sqrt(dot(dx.x, dx.x) + dot(dx.y, dx.y)), sqrt(dot(dy.x, dy.x) + dot(dy.y, dy.y));


이제 쉽게 접합한 밉레벨을 계산할 수 있다.

float mipLevel = log2(d);

밉레벨을 부동소수점(float)으로 계산하고 소수부분을 사용하여 삼선형(trilinear) 필터링을 수행한다.

클립맵 텍스쳐 어드레싱은 간단하다.

필요한건 밉레벨을 기반으로 입력 텍스쳐 좌표를 스케일하는 것이다.

원본 이미지 크기를 클립맵 스택 크기로 나눠서 배율 인수를 계산한다.

float2 clipTexCoord = (input.texCoord) / pow(2, iMipLevel);

clipTexCoord.x *= scaleFactor.x + 0.5f;

clipTexCoord.y *= scaleFactor.y + 0.5f;

float4 color = StackTexture.Sample(stackSampler, float3(clipTexCoord, iMipLevel));

스택 샘플러의 경우 toroidal 어드레싱을 구현하기 위해 어드레싱모드를 "wrap"모드로 지정해야한다.



Reference Link

- D3D10_TEXTURE2D_DESC msdn

- Clip Mapping

'Study > Graphics' 카테고리의 다른 글

Clipmaps  (0) 2019.06.15
early z  (0) 2018.08.29
hlod  (0) 2018.07.20
What is Texture  (0) 2018.03.10
texture format  (0) 2018.02.21
shader에서 채널값이 모자를 때...  (0) 2018.02.13
Posted by 붕대마음

댓글을 달아 주세요

early z

Study/Graphics / 2018.08.29 16:27

Early Z : 

- Z Test(Depth Test, 깊이 판정)를 미리 해서 비싼 Pixel연산을 피하자

- 일종의 픽셀단위 Culling 기법.


Z Test :

- 깊이 판정은 픽셀의 깊이 값을 깊이 버퍼의 깊이 값과 비교해서 픽셀의 가시성을 판단한다.

- 현재 픽셀이 다른 픽셀의 뒤에 있는지를 판단하여 뒤에 있다면 픽셀을 폐기하고,

  앞에 있다면 그 픽셀을 다음 단계로 넘겨 값을 z버퍼에 기록한다.


그렇다면 기존 Z Test의 순서는?

- 간단하게 말하자면 pixel shader(fragment shader) 다음.

   자세하게 말하자면 파이프 라인 참고.

- 왜 깊이판정을 ps 이후로 했을까?

- ps 연산에 따라 depth가 변경될 수 있기 때문에 ps 앞에서 하지 않음.


Early Z를 위해서는?

- 기존 하드웨어 동작방식이 바뀌는 거기 때문에 하드웨어에서 지원해 줘야 한다.

- Coarse-grained Z Culling vs Fine-grained Z Culling

- Depth Stencil buffer를 사용

- Early Z 비활성화 (Z buffer Optimization, 10page)

  - 그래서 ps에서 depth 값을 write(갱신)한다면 비활성화 된다. 

    (ps에서는 원하는 depth을 저장해야 하니)

  - ps에서 discard 하면 비활성화 된다.

    (ps에서는 버리려는데 write 할 수 있으니)

  - alpha-test을 쓸 경우 비활성화 된다.

    (discard와 마찬가지)

- 결국 ps에서 depth는 왠만하면 건들지 마라.


Early Z의 구현은?

- 하드웨어적으로 지원하고 적용될 수 있는 상황이라면 하드웨어에서

  내부적으로 사용되며 다른 멀티패스 기술(z pass 후 color pass)과 관련이 없다.

- OpenGL 이나 D3D 어디에서도 early z 작업을 지정하지 않는다.

  이 모든 작업은 하드웨어 관련 작업이며 사용 또는 미사용 설정은 할 필요 없이 

  하드웨어에서 자동으로 처리된다.

  즉, early z 는 실행가능한 조건충족하면 하드웨어가 알아서 지원한다.

- Depth/ Stencil buffer 사용

- Early Z를 하드웨어가 실행하는 조건을 충족시켜 주기 위해 사용하는 Early-Z Pass

- 1st pass에서 depth rendering, 2st pass에서 depth write 비활성화 하고 rendering.



Reference Link

- early-z를 이용한 pixel shader 최적화

- everything about early-z

- 3dmp - early z

- early z visibility test (early-z)

- early z and discard

- why discard pixel take a noticeable performance hit?

- 픽셀 셰이더의 기초

- wiki, HyperZ

- Applications of Explicit Early-Z culling, pdf

- Hierarchical Z-Buffer Visiblility

- microsoft early-z

- Triple Depth Culling

- Saving the Z-Cull Optimization

- Early Fragment Tests, Hi Z, Depth, Stencil and other benchmarks

- Early Fragment Test

- You Can Never Have a Custom Z Buffer Distribution and Early Z at the Same Time

- Early-Z

'Study > Graphics' 카테고리의 다른 글

Clipmaps  (0) 2019.06.15
early z  (0) 2018.08.29
hlod  (0) 2018.07.20
What is Texture  (0) 2018.03.10
texture format  (0) 2018.02.21
shader에서 채널값이 모자를 때...  (0) 2018.02.13
Posted by 붕대마음

댓글을 달아 주세요

hlod

Study/Graphics / 2018.07.20 11:59

원문 : http://www.cs.unc.edu/~walk/hlod/

원문의 내용을 필요부분 번역하였습니다.

원문을 보길 강력추천합니다.


그림 1. Double Eagle 대형선박. 이 모델은 126,630개 오브젝트, 그리고 82,361,612 삼각형으로 구성되어 있다.


전통적인 LOD 방식으로는 한번에 하나의 객체만 단순화 할 수 있다.

그래서 여러 객체를 포함하는 화면이 주어지면 이 방식은 장면 전체가 아닌

개별 객체에 대해서만 에러를 최소화 할 수 있다.

HLOD(Hierarchical Level Detail, 계층적 lod)는 전통적인 방식의 LOD를 오브젝트의 

계층적 집합체로 일반화 하는 것이다.

장면의 개별 부분을 같이 단순화 하는 HLOD를 생성하여, 특히 적극적인 단순화를 위해

좀 더 괜찮은 전역 근사값을 생성한다.

원하는 목표 폴리곤 갯수에 따라, LOD는 화면에서 모든 오브젝트들을 렌더하지 못할 수도 있어 균열을 만들수 있다. 

그림 2. Double Eagle의 LOD. 7,887개, 1,922의 페이스로 구성.


HLOD는 보다 견고한 근사값을 제공한다. (그림 3 참고)

그림 3. Double Eagle의 LOD. 7,710개, 1,914의 페이스로 구성.

동적 장면에서, 가능하다면 동적으로 HLOD를 비동기로 계산하여 병렬 하드웨어의 이점을 얻는다.


중요 

충실도 : 오브젝트를 그룹화하여 HLOD를 만들므로 시각적 품질이 좀 더 많이 근사치만큼 올라간다.

자동 생성 : 사용자 개입없이 장면 그래프(scene graph)의 HLOD를 계산한다.

보편성 : 위상 정보나 표현에 대해 아무런 가정을 하지 않는다.

효율성 : LOD는 정적이므로 디스플레이 목록을 사용하여 렌더링 할 수 있다.

유연성 : HLOD 장면 그래프 구조는 일정한 프레임 속도 모드이미지 품질 모드로 렌더링 할 수 있게 해 준다.


HLOD 만들기

기존 방식의 LOD는 환경에서 단일 노드의 지오메트리를 나타내지만, HLOD는 장면 그래프의 전체 분기 또는,

다중 노드의 지오메트리를 나타낸다.

장면그래프를 사용해서 환경을 표현하고 먼저 각 노드에 대한기준 LOD를 계산한다.

그리고 나서 각 노드에서 해당 LOD를 기반으로 상향식으로 HLOD를 계산한다.

- 단말 노드(leaf node, 맨 마지막 끝 노드)의 HLOD는 그 노드의 LOD와 같다.

- 장면 그래프에 있는 내부 노드의 HLOD는 노드 자체에 속한 모든 LOD를 하위 노드의 HLOD와 

  결합하여 계산된다.


HLOD 렌더링

기존 LOD 렌더링 시스템에서는, 출력 알고리즘이 장면그래프의 모든 오브젝트나 노드에 대해

적절한 LOD를 렌더링 한다.

노드의 HLOD는 해당 노드의 지오메트리 뿐만 아니라 하위 노드까지의 근사치 이기 때문에,

장면그래프를 순회하면서 HLOD를 렌더하면 굳이 하위노드는 순회 할 필요가 없다. (그림 4 참고)

이렇게 하면 적절한 시점에 단지 HLOD를 렌더링함으로써, 장면의 전체 부분을 적극적으로 제거할 수 있다.

이미지 품질 모드에서, HLOD와 연관된 오차범위가 화면공간에 투영된 오류제약조건을 만족시킬 때 까지

장면 그래프를 순회하여 렌더링 한다.

목표 프레임 속도 모드에서, 시간적 제약보다 더 많은 폴리곤을 렌더링 할 때 까지 

최대한의 투영 오차를 가지는 가장 조잡한 HLOD를 만든다.

그림 4. 얼굴 모양을 만들기 위해 LOD와 HLOD를 사용하여 렌더링. 

얼굴에서 시작하여 장면그래프를 순회하는 알고리즘이다.

시야가 멀기 때문에, HLOD 0을 사용하여 얼굴모양을 그린다.

이 HLOD는 전체 장면그래프를 나타내므로 시스템은 순회를 멈춘다.




Reference Link

- Unity AutoLOD

- Unreal HLOD

- 번역 원문

- 3D Engine Design for Virtual Globes, page 371

'Study > Graphics' 카테고리의 다른 글

Clipmaps  (0) 2019.06.15
early z  (0) 2018.08.29
hlod  (0) 2018.07.20
What is Texture  (0) 2018.03.10
texture format  (0) 2018.02.21
shader에서 채널값이 모자를 때...  (0) 2018.02.13
Posted by 붕대마음

댓글을 달아 주세요

What is Texture

Study/Graphics / 2018.03.10 15:14

What is Texture란 글을 쓰게 된 이유는 요즘 게임을 개발하다 보니,

Texture을 정말 다양한 용도로, 그리고 다양한 방법으로 쓰게되서

Texture에 대해 여러가지로 정리하는 시작점을 가지고 싶었기 때문이다.


Texture란 무었인가?

이 질문에 나름 모범적인 대답은 아래와 같다.

3d 그래픽에서 폴리곤에 다양한 색상이나 질감을 표현하기 위해 사용되어지는 2D 이미지

게임에서 사용되는 텍스쳐는 내가 생각에는 데이터를 저장하는 storage 라고 생각한다.

Texture에는 폴리곤에 색상이나 질감을 표현하기 위해 많이 사용하기도 하지만, 다른 용도로도 쓸 수 있기 때문이다.

화면톤을 위해 사용할 수도 있고, 계산하기 복잡한 특정 수치값들을 미리 저장해서 쓸수도 있다.


그래서 텍스쳐란 무었인가? 와 무었을 위한 텍스쳐인가? ,를 고민해 봐야 한다.

아래 Texture types 을 참고하면 여러가지 텍스쳐의 쓰임을 알 수 있다.


Reference Link

- Texture types

- Unity Texture compression and optimization

- UV Texture Coordinates and Texture Mapping - OpenGL / DirectX

- tangent space, 접선공간

- DXT 압축

- Texture Format


- 모바일 게임 최적화의 정석 - 텍스처 압축 편

- Surface Texture Mapping

-


'Study > Graphics' 카테고리의 다른 글

early z  (0) 2018.08.29
hlod  (0) 2018.07.20
What is Texture  (0) 2018.03.10
texture format  (0) 2018.02.21
shader에서 채널값이 모자를 때...  (0) 2018.02.13
depth-precision-visualized  (0) 2018.01.31
Posted by 붕대마음

댓글을 달아 주세요

texture format

Study/Graphics / 2018.02.21 17:48

texture에는 file format 이 있고 pixel format이 있다.

파일 포멧이야 파일의 확장자를 보면 알수 있고 이 파일들 마다 독특한 성질을 가지고 있다.

몇가지 예를 들어 보면 tga, bmp, jpeg, png, dds, psd, gif, etc... 가 있다.

각각 데이터의 압축, 압축시 손실유무, 특정 픽셀포멧 지원여부 등의 기능을 따진다.

픽셀포맷은 사용되는 형식에 따라 채널과 비트수, 부호, 부동소수점 등으로 사용된다.

아래 링크에서 각 텍스쳐 포멧에 대한 추가적인 내용을 알 수 있다.


Reference Link

- Difference between floating point render target and normal render target

- Floating point texture가 왜 필요한가

- 텍스쳐 포맷과 기초

- Display color와 Digital texture format의 이해

- Direct3D Surface Format

- Khronos Group, Image Format

-

'Study > Graphics' 카테고리의 다른 글

hlod  (0) 2018.07.20
What is Texture  (0) 2018.03.10
texture format  (0) 2018.02.21
shader에서 채널값이 모자를 때...  (0) 2018.02.13
depth-precision-visualized  (0) 2018.01.31
디더링 (Dithering)  (0) 2018.01.26
Posted by 붕대마음

댓글을 달아 주세요

텍스쳐마다 채널이, R/ RG/ RGB/ RGBA 등이 있는데 가끔 채널 하나가 더 필요할 때가 있다.

예를들어 R채널에는 Diffuse Mask, G채널에는 Rim Mask, B채널에는 Specular Mask, A채널에는 depth를 

넣는데 추가로 offset값을 저장해 줘야 할 때가 있다. 

그럴때 가끔 fmod를 사용해서 하나에 두개의 값을 넣게 하는 방법을 쓴 적이 있다.

z값(B채널)이 0.0f ~ 1.0f 사이이고 offset 값이 1.0f에서 10.0f 사이라면 

z값에 기존값 * 0.01f하고 offset 값을 *0.1f 해서 더한 후 다음 패스에서 이 값을 fmod로 z값을 구한 후

기존값에서 빼면 z값만 구할수 있긴 하다. 다만 offset 값이 1.0f~10.0f 조건에 추가로

단차가 0.1f 단위여야 한다는 조건이 붙는다.

1.1f는 가능하지만 1.01f는 기존값고 정밀도를 더 나눠써야 한다.

가끔 이런방식으로 작업을 해서 쓰긴 하는데 fmod자체가 그렇게 단순 연산만큼 가볍지는 않지만

텍스쳐 한장 더 써서 한번 더 찍어야 하는 상황에서는 나름 괜찮았던것 같다.


float2 fmod(float2 a, float2 b)

{

  float2 c = frac(abs(a/b))*abs(b);

  return (a < 0) ? -c : c;   /* if ( a < 0 ) c = 0-c */

}


Reference Link

- fmod

-

'Study > Graphics' 카테고리의 다른 글

What is Texture  (0) 2018.03.10
texture format  (0) 2018.02.21
shader에서 채널값이 모자를 때...  (0) 2018.02.13
depth-precision-visualized  (0) 2018.01.31
디더링 (Dithering)  (0) 2018.01.26
Texture types  (0) 2017.02.05
Posted by 붕대마음

댓글을 달아 주세요

원문을 보시는 것을 추천드립니다. 


깊이 정밀도 시각화


깊이 정밀도는 모든 그래픽스 프로그래머가 조만간 고민해 봐야 하는 골칫거리다.

많은 아티클과 논문에서 이미 이 주제가 다루어졌고, 서로 다른 게임들, 엔진들,

그리고 디바이스들에서 다양한 깊이버퍼 포멧과 설정을 볼 수 있다.


원근투영과의 상호작용하는 방식 때문에 GPU 하드웨어 깊이 매핑은 다소 난해하며

방정식을 연구한다고 해서 바로 상황이 명확해 지지는 않는다.

어떻게 동작하는지 알기 위해서는 몇장의 그림을 그려보는게 좋다.


이 글은 3개의 메인 파트가 있다.

첫번째 파트에서는, 비선형(nonlinear) 깊이 매핑을 하는 이유에 대해 다룬다.

두번째 파트에서는, 서로 다른 상황에서 비선형 깊이 매핑이 어떻게 수행되는지 이해를 돕는

직관적이며, 시각적인 몇개의 도표를 제공한다.

세번째 파트에서는 Paul Upchurch와 Mathieu Desrun이 2012년도에 제시한 "원근 렌더링의 정밀도 강화"의

주요 결과인 부동 소수점(floating-point) 반올림 오차가 깊이 정밀도에 미치는 영향에 관한 대한 및 재연을 다룬다.


왜 1/z 를 하는걸까?


GPU 하드웨어 깊이 버퍼는 일반적으로 카메라에서 오브젝트까지의 거리를 선형 방식으로 저장하지 않으며,

이는 사람들이 일반적으로 처음 이 부분을 접했을 때 생각하는 방식과 반대다.

그 대신, 깊이버퍼는 월드공간에서의 깊이값에 반비례하는 값을 저장한다.

왜 이렇게 하는지에 대해 간단히 알아보자.


이 글에서, 깊이 버퍼[0~1]에 저장되어 있는값을 d, 월드공간에서의 깊이(즉, 뷰 축에 따른 거리)를 z

사용할 것이며 월드공간에서의 단위는 미터(meter) 같은 거다.

일반적으로 이들의 관계는 아래와 같은 모양이다.



위 식에서 ab는 근거리 평면(near plane)과 원거리평면(far plane)설정 값이다.

다시 말하자면, d는 항상 1/z의 선형으로  재설정(remapping) 된다.


표면상으로는, d를 얻는게 z에 대한 어떤 함수가 될 거라고 생각할 수 있다.

왜 이렇게 특이하게 만들었을까?

이에 대해서 두가지 중요한 이유가 있다.


첫번째로, 1/z 은 원근 투영의 구조에 자연스럽게 맞아떨어진다.

이는 거의 대부분의 변환 범용 클래스가 직선을 유지할수 있도록 보장해 주며,

하드웨어 레스터화가 편리하도록 만들고, 그 후에 화면공간에서 삼각형의 직선 테두리들(straighte edges)이

직선으로 남아있을 수 있도록 해 준다.

하드웨어가 이미 수행하고 있는 원근 나누기(perspective divide)를 이용하여 1/z의 선형 재설정을 만들 수 있다.

각주 : 위에서 1/z가 원근 투영의 구조에 자연스럽게 맞아 떨어진다는 말을 생각해 보자.

원근투영이란 3D를 2D에 투영할 때 원근감을 느낄 수 있도록 하는 투영방법을 말한다.

그렇다면 1/z는 무었일까? 원근감의 핵심은 가까운것은 크게, 먼 것은 작게 보이도록 하는 소실점을 사용한다.

이 소실점을 표현하기 위해서는 어떻게 해야 하는가?

눈(카메라)으로부터 떨어진 거리(z)로 각 값(x,y)을 나누어 주면 된다.

그렇게 되면 z 값이 클 수록(멀어질수록) 물체의 위치는 정점 부근으로 모이게 되며 삼각형을

예로 보면 삼각형을 이루는 세 점 또한 직선을 유지하게 된다.

위의 글은 아마 이 개념을 이야기 하는 것 같다.

동차 좌표계에서 z 값은 z/w이며 위 행렬에서 보면 zc = bz + a, wc = z 이다.

그러므로 zc/wc = (bz+a)/z 가 된다.


물론 이러한 접근 방식의 강점은 투영행렬이 다른 행렬들과 곱해질 수 있다는 점이며,

이는 곧 여러 변환 단계들을 하나로 조합할 수 있다는 뜻이다.


두번째 이유는 Emil Persson이 언급했듯이, 1/z값이 화면공간에서 선형이라는 점이다.

그래서 래스터화를 하는 동안 삼각형에 대해 d를 보간하는 것이 쉽다.

그리고 계층적 Z버퍼(Hierarchical Z-buffer), 초기 Z제외(early Z-culling),

깊이버퍼 압축(depth buffer compression)과 같은 작업들이 모두 수행하기 용이해 진다.


깊이맵(depth map) 그리기.


공식은 어려우니까 그림을 우선 보자.


위 그림은 왼쪽에서 오른쪽으로, 그리고 아래방향으로 보면 된다.

왼쪽 축에 표시되어져 있는 d에서 부터 보자.

d가 위에서 이야기 되었던 내용대로 1/z의 임의 선형 리매핑이 될 수 있으므로,

이 축에서 원하는 위치에 0과 1을 배치할 수 있다.

위 그림에서 눈금 표시는 각각의 깊이 버퍼값을 나타낸다.

설명을 위해, 4bit 정규화된 정수형 깊이버퍼를 시뮬레이션 해 보면, 위와 같이 16개의 균등한 간격의 눈금이 생긴다. (세로축)

세로축을 눈금에서 가로로 1/z 곡선을 연결해서 아래로 내려보면, 그 개별 값들이 월드공간 깊이 범위이다.

위의 그래프는 d3d 및 유사 API들에서 사용되고 있는 전형적인 깊이매핑의 "표준" 을 보여준다.

그림을 보면 1/z 그래프에서 가까운 평면(near plane)쪽에 값들이 몰려서 연결되어 있고 먼 평면(far plane)으로 갈수록

값이 분산되어 있다는 것을 알 수 있다.

또한 near plane이 왜 깊이 정밀도에 큰 영향을 끼치는지를 알 수 있다.

near plane을 당기면 d 범위가 1/z 곡선의 점근선 방향으로 급등하게 만들 수 있으며, 위 그림 보다 

훨씬 더 near plane 쪽으로 값이 몰리게 된다.


이와 유사하게, far plane을 무한대로 미는 것이 왜 그다지 효과적이지 못한지 이 문맥에서 알 수 있다.

단지 d 범위를 1/z = 0에 이르기 까지 약간 확장하는 것이다.


floating-point(부동소수점) 깊이는 어떨까?

아래 그래프는 3개의 지수비트와 3개의 가수비트를 사용하는 부동소수점 형식으로 시뮬레이션 된 눈금을 추가한 것이다.


이제 [0,1] 사이에 40개의 값이 있으므로  이전16개 였을 때 보다 많지만, 그림에서 알 수 있듯이 대부분이

더이상의 정밀도가 필요없는 near plane 쪽으로 몰려있다.


현재 깊이 범위를 역전시키기 위해 널리 알려져 있는 트릭은, near plane에 d=1을 매핑하고 

far plane에 d=0을 매핑하는 것이다.

위 그림의 결과물을 보면 정밀도의 분배가 이전 보다 훨씬 나아졌다.

이제 부동소수점의 준 로그 분포(quasi-logarithmic distribution)는 1/z 비선형화를 다소 줄여주며

위에서 언급됐던 정수깊이 버퍼와 비교 했을 때 near plane에서 유사한 정밀도를 제공해 주며, 

원하는 곳에 광범위하게 정밀도를 증가시킬 수 있게 해 준다.

위 그래프를 보면, 이 정밀도는 멀리 이동할 때 마다 아주 천천히 안좋아 진다.


각주 : float의 설계상 0에 가까운 값일 수록 정밀도가 높다.

그래서 0에 몰빵되서 저장하고 있던 값을 반전시키면 1에 몰빵된 값이 되는데 

float이 0에 가까울수록 정밀도가 좋기에 위와 같이 선형적인 그래프가 된다.

아래 표는 각 영역에서 사용하는 float의 정밀도 간격값이다.

2의 n승  정밀도 간격

-24 :      0.000000059604644775390625 

-14 :      0.00006103515625

-13 :      0.0001220703125

-12 :      0.000244140625

-11 :      0.00048828125

-10 :      0.0009765625

-9 :       0.001953125

-8 :       0.00390625

-7 :       0.0078125

-6 :       0.015625

-5 :       0.03125

-4 :       0.0625

-3 :       0.125

-2 :       0.25

-1 :       0.5 

참고 문서 : float의 정밀도


이 reversed-Z(역전된 Z) 트릭은 아마도 몇번 독자적으로 재연구 되어졌겠지만, 

최소한 Eugene Lapidous와 Guofang Jiao에 의해 작성된 SIGGRAPH '99paper 까지 거슬러 올라간다.

이 연구는 최근에 Matt PettineoBrano Kemen의 블로그 포스트와, SIGGRAPH 2012에서 Emil Persson의

Creating Vast Game World 에서 다시 재조명 되었다.


이전의 모든 다이어그램은 투영 후의 깊이 범위를 D3D 방식대로 [0,1]이라 가정했는데, OpenGL이라면 어떨까?

OpenGL은 기본적으로 투영 후 깊이 범위를 [-1,1]로 가정한다.

정수 형식에서는 차이가 없지만 부동소수점을 사용하면 모든 정밀도가 중간에 쓸데없이 몰려있다.

이 값은 나중에 깊이버퍼에서 [0,1]로 매핑되어 저장되기는 하지만, 초기에 이미 [-1,1] 범위로 매핑되어

범위의 뒤쪽 정밀도를 모두 날려먹었기에 그다지 도움이 되지 않는다.

그리고 대칭으로 보면, reversed-Z 트릭은 여기서는 그다지 필요가 없어 보인다.


다행히도, 데스크탑 OpenGL에서는 ARB_clip_conrol 명령어를 사용하여 이 문제를 수정할 수 있다.

(이제는 OpenGL 4.5의 코에에서 glClipControl를 통해 지원한다.)

불행히도, GL ES에서는 방법이 없다.



반올림(roundoff) 오류의 영향 

1/z 매핑과, float 버퍼 와 정수버퍼중 어느것을 선택할건지는 정밀도 부분에서 큰 부분을 차지하지만 전부는 아니다.

화면을 렌더하기에 충분한 깊이 정밀도라 할지라도,정점 변환 프로세스의 산술적 오류에 의해 정밀도 오류가 쉽게 발생한다.


앞에서 이야기 했듯이, Upchurch 와 Desbrun 은 이 부분에 대해 연구하였고,

반올림 에러를 줄이기 위한 두가지 중요 권장사항을 제시하였다.

1. 무한 far plane을 사용해라.

2. 투영행렬을 다른 행렬과 분리하고, 정점 셰이더에서 뷰행렬에 합치기 보다는 따로 적용시켜라.


Upchurch와 Desbrun은 각 산술연산마다 작은 무작위 변화를 추가함으로써 반올림 에러를 처리하고,

이를 변환과정을 통해 첫번째 순서로 추척한다.

직접 시뮬레이션을 통해 결과를 확인해 보기로 했다.


파이썬(Python) 3.4 numpy로 만든 소스는 이곳을 보면 된다.

이 소스는 near와 far planes 사이에서 무작위 점들을 선형적 또는

대수적으로 간격을 두면서 생성하여 depth(깊이)에 따라 정렬한다.

그리고 나서 이 점들을 32비트 부동 소수점 정밀도를 사용하여 뷰, 투영 행렬과 원근 나누기를 통해 넘기고

최종 결과를 24비트 정수로 양자화 한다.

마지막으로, 시퀀스를 따라 실행하면서 얼마나 여러번 인접해 있는 두 점들이(실제로는 다른 깊이값을 가진) 

같은 깊이 값으로 매핑되어 구분하기 어려워지거나, 순서가 뒤바뀌는지를 센다.

다시 말하자면, Z Fighting 문제처럼 깊이 비교 에러의 발생 비율를 측정한다.


여기 아래 표에 near = 0.1, far =10k 선형적으로 배치된 깊이값들로 얻은 결과값을 보여준다.

(logarithmic depth 방식과 다른 near/far 비율로도 테스트 해 봤는데 세세한 값들이 다양해도 결과는 같은 경향을 보였다.


이 표에서, "indist"는 구분 불가(두 이웃한 깊이값이 최종적으로 같은 깊이 버퍼 값으로 매핑되는)를 의미하며,

"swap"은 두 이웃 깊이값이 순서가 바뀐것을 의미한다.


그래프로 만들지 않아서 미안하지만, 너무 많은 그래프 축을 그려야 해서 그래프로 하기는 힘들다.

어쨋든, 숫자들을 보면, 몇가지 명백한 결과를 알 수 있다.


대부분의 환경에서 보면 float과 integer 깊이 버퍼간에는 차이가 없다.

산술오류는 양자화 오류로 이어진다.

이는 부분적으로 봤을 때, float32와 int24는 [0.5, 1]에서 ulp(Unit in Last Place)가 거의 같은 크기여서

(float32 는 23bit의 가수를 가지기 때문에), 실제로는 거의 모든 깊이 영역에서 추가적인 양자화 오류가 거의 없다.

대부분의 경우, Upchurch와 Desbrun의 권고에 따라 뷰와 투영행렬을 분리하면 약간의 개선이 이루어 진다.

전체적으로 에러률을 낮춰주지는 않지만, 구분하기 힘든 부분에서 맞는 방향으로 바꿔주는 것 처럼 보인다.

 무한 far plane은 오류률 매우 작은 차이를 보여준다. Upchurch와 Desbrun은 수치적으로 에러가 25%감소한다고

했지만, 비교 에러률이 줄여준다고 보기에는 어렵다.


위의 언급한 세가지와는 실제적으로 거의 관련이 없지만, reversed-Z(역전된 Z) 매핑은 기본적으로 환상적이다.


왜 그런지 확인해 보자.

 float 깊이 버퍼는 이 테스트에서 오류룰이 0%다.

물론 입력 깊이 값의 간격을 더 촘촘하게 해서 약간의 에러를 만들어 낼 수도 있다.

하지만 그럼에도 불구하고, float으로 reversed-Z를 사용하는것은 다른 방법들 보다 훨씬 정확하다.

 integer 깊이버퍼로 reversed-Z를 사용하는것은 다른 integer 옵션보다 좋다.

 reversed-Z는 미리 view projection 이 미리 합성된 것을 사용하는 대신 별개로 분리하면서 얻는 이점과,

유한 far 평면에서 무한 far 평면을 사용하면서 얻는 이점을 다 없애버릴 만큼 좋다.

다시 말해 reversed-Z를 사용하면, 정밀도에 영향을 주지 않으면서 투영 행렬을 다른 행렬들과 결합시킬 수 있고,

원하는 방식의 far 평면을 사용할 수 있다는 말이다.


이제 결론은 명백하다.

어떤 원근 투영상황에서도, reversed-Z 부동소수점 깊이 버퍼를 사용하는것이 가장 좋다!!

부동 소수점 깊이버퍼를 사용할 수 없다 하더라도 reversed-Z는 사용해야 한다.

모든 정밀도 에러 상황에서(특히 극단적인 깊이를 포함하는 개방형 월드 환경에서는 더욱) 만병통치약은 아니지만

reversed-Z는 그럼에도 불구하고 깊이 정밀도 문제를 해결하는 데 좋은 시작점이다.


Nathan은 그래픽스 프로그래머로, 현재 NVIDIA의 DevTech 소프트웨어 팀에서 일하고 있다.

그의 글을 더 읽어보길 원한다면 이곳을 참조해라.


---------------------------------------------------------------------------------------------------------------------------------

번역 내용 이외에 개인적인 궁금증.

1. 보통 rendertarget(결국은 텍스쳐)에 값을 쓸 때 0.0~1.0의 값을 쓰는데 integer format은 0~1로 값이 끊기지만

floating format은 -값도, 그리고 1 이상의 값도 넣을 수 있다. 

그런데 대부분 사람들은, 그리도 대부분의 아티클이나 샘플 예제들은 0~1로 값을 제한한다.

이 이유는 무었일까? 그냥 float의 정밀도에 따른 신뢰도의 정도 때문일까?



Reference Link

- 원문 : Depth Precision Visualized

- Tightening the Precision of Perspective Rendering

- 원근투영

- 점근선

- float의 정밀도

- 원문을 쓴 필자의 블로그

- Unity 5.5 graphics changes and improvements

- msdn, Depth Buffers (Direct3D 9)

- You Can Never Have a Custom Z Buffer Distribution andEarly Z at the Same Time

- gamasutra, Logarithmic Depth Buffer

- D3D9 GPU Hacks

- NVIDIA GPU Programming Guide

- Depth를 기록하자

- Advanced DX9 Capabilites for ATI Randeon Cards

- Logarithmic Depth Buffer

- Maximizing Depth Buffer Range and Precision

- Reversed-Z in OpenGL

- 원문 번역 https://blog.naver.com/zmfltbsk2/221207477425

- 원문 번역 http://lifeisforu.tistory.com/365

- Learning to Love your Z-buffer

- Infinity Projection Matrix

'Study > Graphics' 카테고리의 다른 글

texture format  (0) 2018.02.21
shader에서 채널값이 모자를 때...  (0) 2018.02.13
depth-precision-visualized  (0) 2018.01.31
디더링 (Dithering)  (0) 2018.01.26
Texture types  (0) 2017.02.05
rgbm  (0) 2016.12.29
Posted by 붕대마음

댓글을 달아 주세요

디더링이란 무었인가?

컴퓨터 그래픽스에서 제한된 색을 사용하여 여러 색을 최대한 근사하게 생성하기 위해 사용되는 기술.

화상의 각 면을 다른 계조 색의 도트 집합으로 처리하는 기술에 의존한다.

결국은 없는 색을 만들기 위해 색을 조밀하게 배합하여 다른색상인 것처럼 보이게 하는 방법.

참고 : 앱 개발에 필요한 Image magick 활용

이 기술로 매끄럽지 못하고 계단모양으로 울퉁불퉁한 윤곽선이나 대각선을 완화시킬 수 있다.

참조 : wiki, 디더링


이전 방식? 으로는 망점(halftone screen)이 있는데 망점은 점의 크기나 간격에 따라

연속 색조의 상을 따라 만드는 복사기법으로 점으로 그라디언트와 같은 효과를 낸다.

참조 : wiki, 망점 (halftone screen)



Reference Link

- wiki, 디더링

- 네이버 지식백과

- wiki, 망점 (halftone screen)

- 나무위키, 디더링

- 16bit 프로세싱을 통한 디더링 dither - avs 스크립트

- Of Bit Depths, Banding and Normal Maps


'Study > Graphics' 카테고리의 다른 글

shader에서 채널값이 모자를 때...  (0) 2018.02.13
depth-precision-visualized  (0) 2018.01.31
디더링 (Dithering)  (0) 2018.01.26
Texture types  (0) 2017.02.05
rgbm  (0) 2016.12.29
Efficient Gaussian blur with linear sampling  (0) 2016.10.22
Posted by 붕대마음

댓글을 달아 주세요

Texture types

Study/Graphics / 2017.02.05 22:09

이 글의 내용은 이곳의 내용중 필요한 부분만 정리한 것입니다.

원문을 보시길 추천합니다.

http://wiki.polycount.com/wiki/Texture_types


텍스쳐 타입

게임모델에 텍스처 처리를 할 때  사용되어지는 몇가지 map 타입이 있다.

모든 경우에, 화면에 렌더링 되는 최종 이미지를 생성하기 위해  다른 map 타입들이 함께 동작한다. 

아티스트들은 각 작업의 균형을 맞추기 위해 이러한 맵들을 동시에 만든다.

대부분의 경우, 이러한 이미지는 투명도(Transparency) 또는 광택(gloss)과 같은

단일 값 슬라이더 대신, 픽셀 단위 수준에서 동작하는 재료 속성을 위한 마스크로 간주될 수 있다.

가장 흔한 타입은 diffuse, emissive, normal, opacity, 그리고 gloss이다.

어떤 타입을 사용할지는 asset 자체와 프로젝트의 Art Direction에 따라 결정된다.

게임의 필요에 따라 다양한 타입들이 하나의 파일로 압축될 수 있다.


Color Maps

가장 일반적인 타입이 diffuse이며 모델에서 보여지는 색상이다.

이 맵은 주어진 asset의 art direction이나 기술적 요구사항 때문에 가장 다양하다.

- Diffuse map(확산 맵)은 표면에서의 빛의 확산반사인 albedo를 만들기 위해 사용된다.

  종종 알베도맵이라고도 불리며 일반적으로 기본 색상만 표현한다.

  diffuse가 유일하게 사용되는 맵이라면 빛, 그림자, 그리고 하이라이트를 사용해서 복잡한 셰이더 효과를

  시뮬레이트 할 수 있으며 이러한 셰이더에서의 diffuse map은 라이트 정보가 작게 들어가거나 없다.

  이러한 효과는 Specular map이나 Normal map같은 다른 형태의 맵의 영향으로 인해 발생하기 때문이다.

  오프라인 렌더링(영화, 상업 등..)에서 diffuse map은 color맵과 별개의 효과를 의미할 수 있는데,

  표면에서 반사되는 빛의 확산을 제어한다.

- Albedo map(반사율 맵)은 PBR 셰이더에서 사용되어지는 좀 더 특화된 확산 형태이며, 표면의 기본 색상만을 나타낸다.

  사실 내가 Albedo map이란 용어를 접한건 그다지 오래 되지 않았는데

  처음 느낌은 Diffuse라는 단어 자체가 Albedo로 바뀐 느낌이었다.

  기존에 Diffuse map(기본 색상 텍스처) 이라고 이해하고 있던 용어를 

  Albedo map(기본 색상 텍스처)라고 용어를 여러군데서 사용하고 있었다.

  완전히 똑같다면 왜 단어를 바꾼걸까?

  그나마 근래에 유행하고 있는 PBR 시스템이 도입되면서 물체의 순수한 색상을

  표현하기 위한 단어가 필요했는데 기존 diffuse map은 순수한 color map 뿐만 아니라

  확산광(난반사)로 음영이 진 것 도 diffuse map으로 불렀다.

- Detail map은 기하물체를 가까이서 볼 때 텍스처의 해상도(또는 그래픽 퀄리티)가 높아 보이도록

   적당한 크기의 텍스처를 반복 시켜 기존 텍스처에 혼합해주는 상세 텍스처이다.

   확대 시 디테일이 있어 보이려면 고해상도의 텍스처를 사용해야 하는데 고해상도 텍스처 대신

   적당한 텍스처에 이 디테일 맵을 섞어서 사용한다.

   밉매핑을 사용하면 타일링된 아티펙트(결함)을 숨기기 위해 detail texture을 중간거리에서 fade out할 수 있다.

   detail map은 자주 Diffuse map, Normal map 과 같이 사용된다.

- Gradient mapColor look-up table은 하나의 색상을 1차원이나 2차원에서 다른 색상으로 매핑하여

   화면이나 모델의 색상을 수정하는데 사용할 수 있다. (ex : color correction, ramp texture ... etc)

   이들은 일반적으로 global asset이며 특정 모델로 제한되지 않는다.

- color variation(색의 변형)이나 사용자 정의 asset, 또는 재질 영역을 위한 Masking은 Color map으로 간주할 수 있다.


Transparency Maps

- Transparency maps, 또는 opacity로 알려져 있으며, 표면의 불필요한 부분을 제거하는 사용되며

   보통 알파블렌딩으로 사용한다.  예 : 불, 풀, 머리카락, 연기, 물, 창문 등..


Bump Maps

- Bump maps은 지오메트리의 음영을 수정하는 2D 흑백 맵으로 일반적으로 표면의 디테일 표현에 사용된다.

- Normal maps은 정점의 노멀을 수정하여 보다 세밀한 지오메트리를 표현하는 3D bump map이다.

- Radiosity normal maps은 light map과 normal map을 혼합한 특수한 맵이다.

http://egloos.zum.com/cagetu/v/5658605

- Displacement maps은 bump와 비슷하지만 높이정보를 저장해서 렌더링 시 지오메트리를 변형하여

  음영과 실루엣을 수정한다.

- Height maps은 일반적으로 지형 메시의 정점을 위 아래로 이동하여 변형시키는데 사용된다.

- Vector displacement maps은 height의 확장이지만 모든 축에서 정점을 변형 할 수 있다.

- Wrinkle maps은 구현에 따라 다르지만, 케릭터가 특정 방향으로 구부리면 옷에 주름이 

  생길수 있는 국한된 bump값을 저장한다.


아래부터는 bump 종류가 필요없지만 비슷한 효과를 낸다.

- Parallax maps은 다른 텍스처를 표면에 따라"슬라이드"하여 물체의 높이와 깊이를 시뮬레이팅 한다.

  http://mgun.tistory.com/1536

- DuDv maps은 메시의 UV를 수정하여 픽셀단위로 다른 텍스처를 왜곡한다.

- Flow maps은 DuDv 와 흡사한데, 물의 흐름이나 이방성의 하이라이팅과 같은 방향 기반 왜곡을 정의한다.

- Curvature maps은 흑백으로 볼록/오목함을 저장한다.

http://blog.naver.com/blue9954/220424879221

Specular maps

- Specular maps은 표면의 반사율을 제어하고 반사모양을 조정할 수 있다. 

  Specular는 일반적으로 장면에서 가장 밝은 광원의 반사만을 시뮬레이션 한다.

  Specular map은 또한 표면에서 environment maps(환경맵)이 얼마나 많이 보여질지를 제어하는데

  사용할 수 있다.

- Gloss maps은 specular highlight가 얼마나 넓게 또는 좁게 보여질지를 제어한다.

- Roughness maps은 PBR 시스템에서의 Gloss maps으로 표면이 얼마나 거친지 또는 부드러운지를 나타내며

  Microsurface(미세면)이라고도 불린다.

- Reflectivity(반사율)은 PBR 시스템에서 Specular 이며, 표면에서 얼마나 많은 빛이 반사되어 나오는지를 나타낸다.

- Metallic maps은 PBR에서 Reflectivity(반사율)의 대안으로, metallic(금속)이나 non-metallic(비금속)으로 재질을

  표현함으로써 다르다.

  이 방법에서, Albedo map은 non-metals와 규칙적으로 작동하지만 metal 영역에 대한 reflectivity(반사율)

  역활을 한다.

- Anisotropic maps(비등방성 맵)은 실시간 조명에서 specular highlight의 모양을 제어하며,

  종종 머리 음영에서 사용된다.  

- Brdf maps은 카메라 각도를 빛의 값에 매핑하여 반사를 제어한다.

- Fresnel / Rim light maps은 벨벳이나 미세한 머리카락과 같이, 표면의 극한 각도에서

  나타나는 빛의 양을 제어하는데 사용된다.


Environment Maps

Environment maps은 일반적으로 표면반사에 사용되며, 반사된 모델의 주변모습을 보여준다.

이는 실제 장면의 정확한 모습을 렌더링하지 않는 무척 저렴한 방법이며 

일반적으로 실시간으로  렌더링 하는것은 무척 느리다.

- Cube maps은 육면체에 전경을 매핑시키는 여섯개의 모양을 가지는 가장 일반적인 타입이다.

- Diffusely convolved cube map은 블러가 된cube map으로 정확한 반사보다 더 나은 주변광을 표현한다.

- Spherical environment mapLit sphere 또는 MatCap로도 알려져 있으며,

  빛과 색상값을 반구의 각도로 매핑하는 단순한 이미지 반사다.

  관련 링크

  - Sphere mapping



Light Maps

Light maps은 화면에서 표면에 미리 계산된 복잡한 라이팅을 저장한다.

- Ambient occlusion maps은 표면에서 바운스 되는 주변광을 미리 계산된 것이다.

  참고 : http://mgun.tistory.com/2115

- Cavity maps은 ambient occlusion의 좁은 버전이며, 어두우 그림자는 틉과 날카로운 모서리에서만 나타난다.

- Emissive map은 Glow 또는 Self-illumination으로도 알려져 있으며 컴퓨터 모니터, 밤의 차량의 계기판, 

  또는 마법효과 처럼 표면이 빛을 발하는 것을 흉내낸다.

Radiosity normal maps은 light map과 normal map을 혼합한 특수한 맵이다.

  그래서 위의 Bump map으로도 분류할 수 있다.

- Thickness maps은 표면이 얼마나 두꺼운지/얇은지의 측정이다.

  일반적으로 뒤에서 빛이 들어올 때 고양이의 귀나 쫙 펴진 가죽같은 표면을 통과하는 가짜 빛에 사용된다.


Other Maps

- Texture Coordinates는 UV map으로도 알려져 있으며 2D 이미지를 굴곡이 있는 3D 모델링에 매핑하게 되면

  이미지의 일그러짐이 생기게 되는데 이를 바로잡아 주기 위해 모델 자체 내의 좌표체계에 맞춰 좁은부분

  또는 넓은 부분을 맞추어 이미지의 일그러짐을 최소화 시키는 작업이다.

- SSS/ Subsurface Scattering maps은 피부나 왁스같은 반투명 내부에서 빛이 bounce 되는 

  행동을 흉내낸다.

- Subdemal maps은 skin shader에서사용되며, 피부 아래의 레이어를 표현한다 : 피주조직, 혈색과 혈관.

'Study > Graphics' 카테고리의 다른 글

depth-precision-visualized  (0) 2018.01.31
디더링 (Dithering)  (0) 2018.01.26
Texture types  (0) 2017.02.05
rgbm  (0) 2016.12.29
Efficient Gaussian blur with linear sampling  (0) 2016.10.22
Blur 1  (0) 2016.10.12
Posted by 붕대마음

댓글을 달아 주세요

rgbm

Study/Graphics / 2016.12.29 18:17

FP10 : 엑스박스 고유의 포멧. HDR 광원을 묘사하기 위해 사용.

HDR표준 포맷인 FP16을 운용하기에 콘솔의 대역폭이 너무 작아 개발.

FP16의 RGBA 4개 채널 각 16비트로 합계 64비트의 함수 데이터를

RGB 10비트 + A 2비트로 합계 32비트에 축소시킴.

이는 RGBA8 포맷과 동일한 데이터 크기로 색영역은 훨씬 넓지만 광원을 자연스럽게 묘사할 만큼

범위가 충분하지 않다.


LOGLUV : 플레이스테이션 고유포멧. HDR 광원을 묘사하기 위해 사용.

인간의 눈이 색상보다는 휘도에 민감한 것에 착안하여 RGB같은 색상정보가 아닌

휘도(Luminance)와 색차(Chrominance)정보를 지원하는 HDR포맷.

RGBA8의 색상정보를 휘도16비트, 색차U/V(적,청) 각 8비트로 컨버팅하는 알고리즘.

이론상 FP16에 필적하는 HDR 광원 묘사가 가능한 기법.


RGBM : LOGLUV의 문제점인 RGBA8 포맷으로 컨버팅 될때 셰이더 리소스를 상당부분 잡아먹는 점

보완하기 위해 만들어진 포맷.

RGBA와 똑같이 적녹청 색상정보를 포함하면서 투명정보대신 휘도정보를 끼워넣는다.

FP16보다 영역은 좁아도 별도의 컨버팅이 필요없어서 셰이더 리소스를 잡아먹지 않아 퍼포먼스가 좋다.


LOGUV나 RGBM은 광원효과에 좋지만 알파채널의 부재로 반투명 처리를 할 수 없다.



Reference Link

- 디더링

- 엑박과 플3의 HDR 텍스쳐 포멧 관련

-


https://forum.unity3d.com/threads/hdr-ibl-shaders-lighting.143853/

http://beta.unity3d.com/jcupisz/rgbm/index.html

http://ttmayrin.tistory.com/35

http://ozlael.tistory.com/50

http://zzinga.egloos.com/

'Study > Graphics' 카테고리의 다른 글

디더링 (Dithering)  (0) 2018.01.26
Texture types  (0) 2017.02.05
rgbm  (0) 2016.12.29
Efficient Gaussian blur with linear sampling  (0) 2016.10.22
Blur 1  (0) 2016.10.12
UV Texture Coordinates and Texture Mapping - OpenGL / DirectX  (0) 2016.08.14
Posted by 붕대마음

댓글을 달아 주세요

최근에 달린 댓글

최근에 받은 트랙백

글 보관함