D3DHAL_DP2TEXBLT 구조체(d3dhal.h)
D3DHAL_DP2TEXBLT 구조는 D3dDrawPrimitives2 D3DDP2OP_TEXBLT 명령 토큰에 응답할 때 텍스처 Blt에 사용됩니다.
통사론
typedef struct _D3DHAL_DP2TEXBLT {
DWORD dwDDDestSurface;
DWORD dwDDSrcSurface;
POINT pDest;
RECTL rSrc;
DWORD dwFlags;
} D3DHAL_DP2TEXBLT;
회원
dwDDDestSurface
대상 텍스처에 대한 핸들을 지정합니다.
dwDDSrcSurface
원본 텍스처에 대한 핸들을 지정합니다.
pDest
Blt가 수행되어야 하는 대상 지점, 즉 대상 표면의 점(dwDDDestSurface)을 지정하여 Blt를 시작합니다. 이러한 x 및 point 구조의 y 멤버는 화면 좌표로 지정됩니다.
rSrc
원본 텍스처에서 blitted할 사각형, 즉 원본 표면의 원본 사각형(dwDDSrcSurface)을 Blt로 지정합니다.
dwFlags
시스템 사용을 위해 예약되어 있습니다.
발언
D3dCreateSurfaceEx 콜백은 텍스처 Blt의 원본 및 대상 텍스처로 사용할 수 있는 텍스처에 대한 작은 정수 핸들을 만듭니다.
D3DHAL_DP2TEXBLT 구조는 D3DDP2OP_TEXBLT 명령 스트림 토큰과 함께 사용되어 드라이버가 원본 텍스처에서 대상 텍스처로 Blt 작업을 수행하도록 알릴 수 있습니다. 텍스처는 입방 환경 맵일 수도 있습니다. 드라이버는 원본 텍스처의 rSrc 지정된 사각형을 대상 텍스처의 pDest 지정된 위치에 복사해야 합니다. 대상 및 원본 텍스처는 텍스처 생성 시간 동안 드라이버에 알림을 받은 핸들로 식별됩니다. 드라이버가 텍스처를 관리할 수 있는 경우 대상 핸들이 0일 수 있습니다. 이는 드라이버에 텍스처를 비디오 메모리(또는 하드웨어가 효율적으로 텍스처를 제공하는 곳)에 미리 로드해야 임을 나타냅니다. 이 경우 드라이버는 rSrc 무시하고 pDest 수 있습니다.
MIP 매핑된 텍스처의 경우 D3dDrawPrimitives2 명령 스트림에 하나의 D3DDP2OP_TEXBLT 명령만 삽입됩니다. 이 경우 드라이버는 텍스처에 있는 모든 MIP 맵 수준을 Blt해야 합니다. MIP 맵에 복사할 영역은 rSrc 나누고 각 수준에서 pDest2로 수 있습니다.
원본 및 대상 텍스처에 다양한 수의 MIP 맵 수준이 포함될 수 있습니다. 이 경우 드라이버는 공통 수준을 blt해야 합니다. 예를 들어 256x256 원본 텍스처에 8개의 MIP 맵 수준이 있고 대상이 6개 수준인 64x64 텍스처인 경우 드라이버는 원본에서 6개의 해당 수준을 Blt해야 합니다. 드라이버는 대상 텍스처의 최상위 MIP 수준의 크기가 항상 원본 텍스처의 최상위 MIP 수준 차원보다 작거나 같을 것으로 예상할 수 있습니다.
원본 및 대상 핸들은 항상 최상위 표면을 참조하며 MIP 맵의 하위 수준도 참조하지 않습니다. 애플리케이션의 오류로 인해 대상 텍스처에 추가 MIP 맵 수준이 포함될 수 있습니다. 예를 들어 원본 256x256 텍스처에는 5개의 수준이 포함될 수 있지만 대상 256x256 텍스처에는 8개가 포함될 수 있습니다. 드라이버는 이 경우를 안전하게 처리해야 하지만 올바른 결과를 생성하지는 않을 것으로 예상됩니다. 레거시 애플리케이션 호환성 문제로 인해 Direct3D는 이러한 원본/대상 텍스처 쌍이 드라이버에 전달되는 것을 방지하지 않습니다.
드라이버는 원본 및 대상 텍스처의 픽셀 형식이 동일할 것으로 예상할 수 있으며 일반적으로 지정된 Blt을 안전하게 수행할 수 있습니다. 위에서 언급한 단일 사례 외에 드라이버가 Blt을 수행할 수 없는 상황을 예상해서는 안 됩니다.
드라이버가 시스템 메모리에서 비디오 메모리로 비동기 Blt을 수행하려는 경우 GetSysmemBltStatus DirectDraw HAL 호출을 구현해야 합니다. 그렇지 않으면 불일치가 발생할 수 있습니다.
TexBlt는 렌더링 명령과 함께 항상 적절한 순서로 실행되므로 드라이버가 동기화를 수행할 필요가 없습니다. 이 전에 DirectDraw Blt가 Direct3D 컨텍스트에서 명령을 렌더링하여 참조된 텍스처를 수정할 때 드라이버가 사례를 올바르게 처리해야 했습니다. 여러 컨텍스트가 있는 경우 Direct3D는 TexBlts를 실행하지 않습니다. 즉, 드라이버 작성기는 TexBlt 코드 경로에서 동기화 코드를 생략할 수 있습니다(하지만 여전히 Blt에 대한 동기화가 필요).
샘플
다음 의사 코드는 MIP 수준 i에서 MIP 수준 i + 1로 이동하려면 연속 MIP 수준에 대해 하위 구성을 계산하는 방법을 보여 줍니다.
rect.left >>= 1;
rect.top >>= 1;
DWORD right = (rect.right + 1) >> 1;
DWORD bottom = (rect.bottom + 1) >> 1;
rect.right = ((right - rect.left) < 1) ?
(rect.left + 1) : (right);
rect.bottom = ((bottom - rect.top ) < 1) ?
(rect.top + 1) : (bottom);
요구 사항
요구 | 값 |
---|---|
헤더 | d3dhal.h(D3dhal.h 포함) |
참고 항목
D3DDP2OP_TEXBLT