디스플레이스먼트 맵핑
디스플레이스먼트 맵은 텍스처 맵과 유사하지만 정점 엔진이 처리한다.
블럭도
정점 파이프라인의 처음에 추가의 샘플러 스테이지가 있어, 여기서, 디스플레이스먼트 맵을 샘플링 해 정점 디스플레이스먼트 데이타를 제공한다.
디스플레이스먼트 맵샘플러스테이트는,IDirect3DDevice9::SetSamplerState 로 스테이지 번호 256 을 사용해 설정할 수 있다. 이것은 새로운 스테이지 번호이다. 디스플레이스먼트 맵텍스처는,IDirect3DDevice9::SetTexture 로 설정한다.
이 맵은 프리샘플링 해도 하지 않아도 되다. 즉, 디스플레이스먼트값을 필터링 하지 않고 참조하는 경우와 같은 방법으로 요구할 수 있다.
- 디스플레이스먼트 맵은 텍스처 맵과 유사하지만 정점 엔진으로 액세스 한다.
- 정점 파이프라인의 처음에는, 디스플레이스먼트 맵을 샘플링 하는 추가의 샘플러 스테이지가 있다. 이 스테이지에는 보통의 SetSamplerState 애플리케이션 프로그래밍 인터페이스 (API)를 사용해 액세스 하지만, 스테이지 번호는 D3DDMAPSAMPLER = 256 이다.
- 디스플레이스먼트 맵샘플러스테이트를 설정하려면 , SetSamplerState(D3DDMAPSAMPLER, ...) API 를 사용한다.
- 디스플레이스먼트 맵텍스처는, SetTexture(D3DDMAPSAMPLER, texture) API 로 설정한다.
- 이 맵은 프리샘플링 해도 하지 않아도 되다. 즉, 디스플레이스먼트값을 필터링 하지 않고 참조하는 경우와 같은 방법으로 요구할 수 있다.
- 선언 구조의 변경에 의해, 텍스처 맵의 참조에 텍스처 좌표의 사양을 사용할 수 있게 되었다. 예를 들어, Stream0, Offset, FLOAT2, LOOKUP, Displacement_value 로 한다. 이것은, 특정의 오프셋(offset)로 Stream0 의 2D 부동 벡터를 텍스처 좌표로서 사용해 디스플레이스먼트 맵을 참조해, Displacement_value 의 사용법의 의미들을 이것에 관련짓도록, 테설레이터에 지시한다. 정점 셰이더의 선언에는 {dcl_texture0, v0} 에 유사한 행이 있어, texture0 의미들을 v0 입력 레지스터와 관련짓는 것을 나타내고 있다. 참조되고 있는 디스플레이스먼트값을 입력 레지스터 v0 에 복사 한다.
- 텍스처 맵을 프리샘플링 하는 경우는, 전용의 디스플레이스먼트 맵핑을 사용할 수 있다. 생성된 정점의 시퀀셜 인덱스를 텍스처 맵의 텍스처 좌표로서 사용한다. 예를 들어, 0,0, (D3DDECLTYPE) 0, D3DDECLMETHOD_LOOKUPPRESAMPLED, Usage, UsageIndex 로 한다.
- 참조의 출력은 4 개의 부동 소수점수(실수)이다.
- 디스플레이스먼트 맵핑이 지원 되는 것은 N 패치의 경우 뿐이다.
- 디스플레이스먼트 맵핑을 처리할 수 없는 드라이버는, SetTextureStageState 의 D3DDMAPSAMPLER 를 무시할 필요가 있다.
- D3DTEXF_ANISOTROPIC 필터 모드는 지원하지 않는다.
- 디스플레이스먼트 맵샘플러의 D3DSAMP_MIPFILTER 가 D3DTEXF_NONE 가 아닌 경우는, 상세 레벨 (LOD)을 다음과 같이 계산한다. D3DRS_ENABLEADAPTIVETESSELLATION 가 FALSE 여도 적응형 테설레이션 스테이트가 사용되므로 주의 해야 한다.
Tmax = 렌더링 스테이트 D3DRS_MAXTESSELLATIONLEVEL - 「적응형 테설레이션」으로 설명한 방법과 같은 방법으로, 좌표 (Xi, Yi, Zi)의 정점 Vi의 테설레이션 레벨을 계산한다. 계산식은, LOD L = log2(Tmax) - log2 (Te).
- 텍스처 필터링 및 샘플링 처리는, 픽셀 파이프라인과 같은 규칙 (상세 레벨 (LOD) 바이어스의 적용 등)에 따른다.
- 디스플레이스먼트 맵으로서 사용할 수 있는 것은, D3DUSAGE_DMAP 를 지원 하고 있는 포맷 뿐이다. 애플리케이션은,IDirect3D9::CheckDeviceFormat 를 사용해 이것을 문의할 수가 있다.
- 이 텍스처를 디스플레이스먼트 맵으로서 사용하는 것을 드라이버에 통지하기 위해서,IDirect3DDevice9::CreateTexture 에 D3DUSAGE_DMAP 를 설정할 필요가 있다.
- D3DUSAGE_DMAP 는, 텍스처와 동시에 사용한다. 큐브 맵이나 볼륨과 동시에는 사용할 수 없다.
- D3DUSAGE_DMAP 로 생성 한 텍스처와 렌더링 타겟은, 표준의 샘플러 스테이지에 렌더링 타겟으로서 설정할 수 있다.
- 디스플레이스먼트 맵핑에서는, 텍스처 좌표의 랩 모드를 설정하는 렌더링 스테이트를 무시한다. 보통, 테설레이터 엔진에 사용할 수 있는 랩 모드는 없다.
- 디스플레이스먼트 맵샘플러의 동작은, 픽셀 텍스처 샘플러의 동작과 같다. 4 채널 미만의 텍스처 (R32f 등)가 참조되고 있는 경우, 참조되고 있는 값은 출력 레지스터 (_sample 의미들을 사용해 태그 붙이고 한 정점 셰이더 입력 레지스터)의 적절한 채널에 보내진다. 그 외의 채널은, 디폴트로 (1, 1, 1)가 된다. 참조되면 D3DFMT_L8 는 R, G, B 채널에 브로드캐스트 되어 A 는 디폴트로 1 이 된다. 완전한 처리의 자세한 것은 레퍼런스 래스터라이저에 의해 정해진다.
프리샘플링 하는 디스플레이스먼트 맵핑
- 새로운 샘플링 스테이트 D3DSAMP_DMAPOFFSET (DWORD)가 도입되었다. 이 스테이트는, 프리샘플링 한 디스플레이스먼트 맵을 오프셋(offset) (정점 단위로) 한다.
- 새로운 선언 메서드 D3DDECLMETHOD_LOOKUPPRESAMPLED 가 도입되었다.
- 적응형 테설레이션은 무효로 하는 것.
- 텍스처 필터 설정은 무시된다. 포인트 샘플링을 한다. 밉텍스처 필터는 D3DTEXF_NONE 이라고 가정된다. 그 외의 텍스처 필터 모드는 모두 D3DTEXF_POINT 이라고 가정된다.
- 텍스처 좌표는, U = (Index % TextureWidthInPixeles) / (float)(TextureWidthInPixeles) V = (Index / TextureWidthInPixeles) / (float)(TextureHeightInPixeles)와 같이 계산된다. 여기서, Index 는, 생성되는 정점의 시퀀셜 인덱스와 TSS[D3DSAMP_DMAPOFFSET] 의 화이다. 시퀀셜 인덱스는, 각 기본도형의 처음에 제로로 설정되어 정점이 생성될 때마다 커진다.
디스플레이스먼트 맵핑을 지원하기 위한 API 의 변경 사항을 다음에 나타낸다.
- 단일 채널 포맷 D3DFMT_L16 가 추가되었다.
- 새로운 이용법플래그 D3DUSAGE_DMAP 가 추가되었다.
- 디스플레이스먼트 맵텍스처를 설정하기 위한 전용의 텍스처 스테이지 D3DDMAPSAMPLER 가 추가되었다.
- 새로운 하드웨어 능력 D3DDEVCAPS2_DMAPNPATCH 및 D3DDEVCAPS2_PRESAMPLEDDMAPNPATCH 가 추가되었다. 「D3DDEVCAPS2 」를 참조할것.