07 Additional Surface Mapping
Alpha Mapping
- 알파 맵핑의 일반적인 용도를 설명한다.
- 알파 맵을 이용해 픽셀 레벨로 컨트롤할 수 있는 몇 가지 기법을 설명한다. (예: 세미리플렉팅)
- 알파 맵 대신 컬러 키를 이용한 전통적인 투명 처리 방법을 설명한다.
Implementing Alpha Maps in OpenGL
-
glBlendFunc() 함수가 알파 테스팅/블렌딩 역할을 하는 것 외에 몇 가지 제너럴한 목적으로 사용될 수 있다.
- GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA를 지정하여 안티앨리어싱을 얻는다.
- GL_ONE, GL_SRC_ALPHA_SATURATE를 지정하여 안티앨리어싱을 얻는다.
- 더 이상의 설명은 생략한다.
Implementing Alpha Maps in Direct3D
-
D3D10_BLEND_DESC
- OMSetBlendState()나 HLSL의 SetBlendState()로 블렌드 상태를 설정한다.
-
AlphaToCoverageEnable: 멀티 샘플링을 통해 알파 소팅의 비용을 줄일 수 있다.
- 참고: ShaderX 5 2.2 Alpha to Coverage in Depth
- D3D10_BLEND
- D3D10_BLEND_OP
- D3D10_COLOR_WRITE_ENABLE
- 더 이상의 설명은 생략한다.
Cube Mapping
-
큐브맵의 일반적 용도
- 반사 맵핑
- 굴절 맵핑
- HDR 큐브 맵 라이팅
- 노멀 벡터 얻기 (요샌 거의 안 쓰인다.)
Implementing Cube Mapping in OpenGL
- 생략
Implementing Cube Mapping in Direct3D
- 생략
Reflections
- 레이 트레이싱을 이용해서 반사 연산을 하는 것은 너무 무겁기 때문에 큐브 맵 등을 사용한다.
-
반사 벡터 구하기
- reflected_vec = ((vec dot n) * -2) * n + vec
Implementing Reflection Mapping in OpenGL
- 생략
Implementing Reflection Mapping in Direct3D
- 생략
Refractions
-
굴절
- 빛이 밀도가 다른 두 매질을 통과할 때 라이트의 방향은 바뀐다.
- 빛은 더 밀도가 높은 매질을 통과할 때 느리게 움직인다.
- 빛이 매질을 통과하고 나갈 때 모두 굴절이 달라져야 하지만 게임에서는 보통 그렇게까지 안 한다.
-
스넬의 법칙
- 빛 또는 전파가 서로 다른 매질의 경계면에 입사하여 통과할 때 입사각과 굴절각의 관계식을 표현한 법칙
- 네 가지의 변수로 알고리즘을 표현한다.
- 굴절 함수
- vec3 refract(vec3 incident, vec3 norm, float eta)
{
float I = dot(-incident, norm);
float I2 = 1.0 - eta * eta * (1.0 - I * I); - vec3 r = eta * incident + ((eta * I - sqrt(abs(I2))) * norm);
- if(I2 > 0.0)
return r;
else
return vec3(0, 0, 0);
}
-
굴절률
- 물: 1.3333
- 공기: 1.003
- 플라스틱: 1.5
Implementing Refraction Mapping in OpenGL
- 생략
Implementing Refraction Mapping in Direct3D
- 생략
Render Targets
-
오프 스크린 표면의 활용 예
- HDR
- 다이나믹 큐브 맵핑
- 레이싱 게임에서의 리어-뷰 미러
- 거울
- 가상 보안 카메라와 TV 모니터
- 피사계 심도나 모션 블러와 같은 포스트 프로세싱 이펙트
OpenGL Frame Buffer Objects
-
개요
- OpenGL에서 오프 스크린 표면에 렌더하는 방법은 다양한다.
- 가장 효율적인 방법은 프레임 버퍼 오브젝트를 사용하는 것이다.
- 과거에 p-버퍼라는 게 있었다.
-
프레임 버퍼의 장점
- 프레임 버퍼의 출력을 직접 그리고 빠르게 읽을 수 있다.
- 하나의 컨텍스트를 공유한다.
- p-버퍼보다 메모리를 덜 사용한다.
- 시스템에 독립적이다. (OpenGL 표준이다.)
- 사용하기 쉽다.
- 깊이 버퍼를 공유할 수 있다.
-
프레임 버퍼
- 렌더링의 결과를 텍스쳐에 저장한다.
-
렌더 버퍼
- 렌더 버퍼는 렌더링 중에 사용되는 버퍼의 컬렉션이다.
- 깊이 버퍼, 스텐실 버퍼 등을 포함한다.
- 프레임 버퍼에 어태치될 수 있다.
-
프레임 버퍼 생성 과정
-
프레임 버퍼와 렌더 버퍼를 만들고 바인드한다.
- glGenFramebuffersEXT()
- glBindFramebufferEXT()
- glGenRenderbuffersEXT()
- glBindrenderbufferEXT()
-
렌더링 될 텍스쳐 리소스를 만든다.
- glGenTextures()
- glBindTexture()
-
텍스쳐 리소스를 프레임 버퍼에 어태치한다.
- glFramebufferTexture2DEXT()
-
렌더 버퍼의 속성을 설정한다.
- glRenderbufferStorageEXT()
-
프레임 버퍼에 렌더 버퍼를 어태치한다.
- glFramebufferRenderbufferEXT()
-
프레임 버퍼를 언바인드하여 설정을 끝낸다.
- glBindFramebufferEXT()
-
-
프레임 버퍼를 이용하여 렌더링하는 과정
-
프레임 버퍼를 바인드하고 렌더한다.
- glBindFramebufferEXT()
- 그린다
-
프레임 버퍼를 언바인드한다.
- glBindFramebufferEXT()
-
Direct3D 9 Render Targets
-
세 가지 주요 오브젝트
- IDirect3DTexture9
- IDirect3DSurface9
- ID3DXRenderToSurface
-
ID3DXRenderToSurface를 이용한 방법
-
텍스쳐를 만든다.
- D3DXCreateTexture()
-
서피스를 얻는다.
- IDirect3DTexture9::GetSurfaceLevel()
-
R2S를 만든다.
- D3DXCreateRenderToSurface()
-
렌더링을 한다.
- ID3DXRenderToSurface::BeginScene()
- 그린다.
- ID3DXRenderToSurface::EndScene()
-
-
ID3DXRenderToSurface를 이용하지 않는 방법
-
텍스쳐를 만든다.
- D3DXCreateTexture()
-
서피스를 얻는다.
- IDirect3DTexture9::GetSurfaceLevel()
-
렌더링을 한다.
-
기존 렌더 타겟을 가져온다.
- IDirect3DDevice9::GetRenderTarget()
-
새 렌더 타겟을 설정한다.
- IDirect3DDevice9::SetRenderTarget()
- 그린다
-
기존 렌더 타겟을 복구한다.
- IDirect3DDevice9::SetRenderTarget()
-
-
Direct3D 10 Render Targets
-
렌더링 순서
-
텍스쳐를 만든다.
- CreateTexture2D()
-
렌더 타겟 뷰를 만든다.
- CreateRenderTargetView()
- 나머지 생략
-
Image Filters
- 렌더링 이후의 포스트 프로세싱을 설명한다.
-
포스트 프로세싱 이펙트의 활용 예
- 피사계 심도 (Depth of Field)
- 모션 블러
- 라이트 블룸과 글로우
- HDR 이펙트
- 나이트 비전
- 밝기 & 감마 조정
- 몇몇 안티앨리어싱 테크닉
Luminance Filter
- 컬러에 (0.30, 0.59, 0.11)을 곱하면 된다.
- 더 이상의 설명은 생략한다.
Sepia Filter
- 휘도(Luminance)를 얻은 다음 여기에 원하는 색을 곱하면 된다.
- 원하는 색을 넣을 때 최소/최대 값을 넣고 lerp() 한다.
- 더 이상의 설명은 생략한다.
Additional Texture Mapping Techniques
Billboards
- 생략
Super-Sampling
-
알리아싱을 줄이는 방법
- 해상도를 올리기
- 슈퍼 샘플링해상도를 올려서 렌더링을 한 다음 모니터 크기에 맞게 다운 샘플링을 한다.
- 포스트 프로세싱을 사용한 블러
-
슈퍼 샘플링의 종류
-
Grid Sampling
- 픽셀 주위의 픽셀을 따서 평균을 구한다.
- 서브 픽셀의 수가 적을 경우 알리아싱이 여전히 나타날 수 있다.
-
Random Super Sampling
- 확률적(Stochastic) 슈퍼 샘플링이라고도 한다.
- 랜덤하게 샘플링하기 때문에 몇몇 문제되는 지역이 나타날 수 있다.
-
Poisson Disk Super Sampling
- 랜덤하게 샘플링하지만 각 샘플 간의 거리가 너무 가까운 지를 검사한다.
-
Jitter Super Sampling
- Random이나 Poisson Disk는 안티앨리어싱이 되어야 할 픽셀에 대해 너무 가깝거나 먼 픽셀이 선택될 수 있는 반면,
- Jitter는 제한된 범위 안에 랜덤하게 움직이는 균일한 그리드 샘플을 갖는다.
-
Dynamic Cube Mapping
- 다이나믹 큐브 맵을 만드는 것은 상대적으로 비싼 일이므로 몇 가지 트릭이 필요하다.
- 거울같이 완전한 반사를 요구하는 경우 자체 큐브 맵을 만들어 둔다.
- 플라스틱 컵 같은 약간의 반사를 요구하는 경우 큐브 맵을 공유해서 쓴다.
- 밸브 사의 햄머 레벨 에디터를 보면 온 사방에 큐브 맵이 널려 있으며 각 반사 객체는 자신과 가장 가까운 것은 선택해서 쓰게 된다.
- DirectX 10의 지오메트리 셰이더를 사용하여 원 패스로 큐브 맵을 업데이트할 수 있다.
Summary
- 생략
History
Last edited on 03/18/2009 21:22 by oranze
Comments (0)