Header

  1. View current page

    oranze님의 노트

Profile_img_60x60_01
18

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

  • 굴절

    • 빛이 밀도가 다른 두 매질을 통과할 때 라이트의 방향은 바뀐다.
    • 빛은 더 밀도가 높은 매질을 통과할 때 느리게 움직인다.
    • 빛이 매질을 통과하고 나갈 때 모두 굴절이 달라져야 하지만 게임에서는 보통 그렇게까지 안 한다.
  • 스넬의 법칙

    • 빛 또는 전파가 서로 다른 매질의 경계면에 입사하여 통과할 때 입사각과 굴절각의 관계식을 표현한 법칙
    • 네 가지의 변수로 알고리즘을 표현한다.
  • 굴절 함수
  1. vec3 refract(vec3 incident, vec3 norm, float eta)
    {
       float I = dot(-incident, norm);
       float I2 = 1.0 - eta * eta * (1.0 - I * I);
  2.    vec3 r = eta * incident + ((eta * I - sqrt(abs(I2))) * norm);
  3.    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)

You must log in to leave a comment. Please sign in.