DirectX Graphics DirectX 9.0 에의 처리   [목차열람] [주소복사] [슬롯비우기]
DirectX 9.0으로 처리
 
Microsoft DirectX 9.0

DirectX 9.0 에의 처리


Microsoft® DirectX® 9.0 에서는 다음의 기능이 변경되고 있다. 이러한 기능을 사용하고 있는 애플리케이션을 DirectX 9.0 에 이식하는 경우는, 다음에 나타내는 변경 내용을 확인하는 것.

BaseVertexIndex 의 변경

DirectX 8. x 에서는,SetIndices 에는, 인덱스 버퍼의 포인터와 정점 버퍼의 시작 위치를 나타내는 BaseVertexIndex 가 필요했다. 다른 복수의 개체를 정점 버퍼에 배치처리 하는 애플리케이션은, 인덱스 버퍼를 바꾸고 나서 (또는,SetIndices 를 호출하고 나서) DrawIndexedPrimitive 를 호출하지 않으면 안 되었다.

DirectX 9.0 에서는, 정점 버퍼의 시작 위치를 나타내는 BaseVertexIndexIDirect3DDevice9::DrawIndexedPrimitive 로 이동하고 있다.

    HRESULT IDirect3DDevice9::DrawIndexedPrimitive( 
        D3DPRIMITIVETYPE PrimType, 
        INT BaseVertexIndex, 
        UINT minIndex, 
        UINT NumVertices, 
        UINT startIndex, 
        UINT primCount ); 

    HRESULT SetIndices( 
        IDirect3DIndexBuffer9* pIndexData ); 

CreateImageSurface 의 변경

CreateImageSurfaceIDirect3DDevice9::CreateOffscreenPlainSurface 로 이름이 변경되었다. 파라미터 D3DPOOL 가 추가되었다.

HRESULT CreateOffscreenPlainSurface(
    UINT    Width,
    UINT    Height,
    D3DFORMAT Format,
    D3DPOOL Pool,
    IDirect3DSurface9** pReturnedSurfaceInterface);

D3DPOOL_SCRATCH 는, 이전의 CreateImageSurface 에 의해 생성 된 표면와 같은 특성을 가지는 표면을 돌려준다.

D3DPOOL_DEFAULT 는,IDirect3DDevice9::StretchRectIDirect3DDevice9::ColorFill 로 사용하는 적절한 풀이다.

D3DENUM_NO_WHQL_LEVEL 의 변경

Microsoft Windows® 의 하드웨어 인정 레벨의 문의는 응답에 비교적 시간이 걸리기 (위해)때문에 (몇초간), 애플리케이션이 이것을 명시적으로 실시하지 않으면 안 되게 되었다. D3DENUM_NO_WHQL_LEVEL 가 삭제되어 D3DENUM_WHQL_LEVEL 가 추가되었다. 더 자세한 정보는,D3DADAPTER_IDENTIFIER9 의 「WHQLLevel 멤버」를 참조할것.

EnumAdapterModes 의 변경

IDirect3D9::EnumAdapterModesD3DFORMAT 를 사용할 수 있게 되었다.

HRESULT IDirect3D9::EnumAdapterModes( 
       UINT Adapter, 
       D3DFORMAT Format, 
       UINT Mode, 
       D3DDISPLAYMODE *pMode); 

이 추가 포맷 파라미터는 디스플레이 모드의 확장 세트를 지원 한다. 애플리케이션의 출하시에 고안되지 않았던 열거 포맷이 사용될리가 없게, 디스플레이 모드의 열거에 사용하는 포맷을 애플리케이션이 Microsoft Direct3D® 에 지시할 필요가 있다. 결과적으로 얻을 수 있는 디스플레이 모드의 배열은, 폭, 높이, refresh rate만이 다르다.

애플리케이션이 픽셀 포맷을 지정해, 열거는 그 포맷에 정확하게 일치하는 디스플레이 모드인 만큼 한정된다. 사용할 수 있는 포맷은, D3DFMT_X8R8G8B8, D3DFMT_A8R8G8B8, D3DFMT_A2B10G10R10, D3DFMT_X1R5G5B5, D3DFMT_A1R5G5B5, D3DFMT_R5G6B5 이다.

같은 포맷이면, 알파 버전에서도 비알파 버전에서도 열거는 같다. 돌려받는 D3DDISPLAYMODE 의 FORMAT 멤버에는, 애플리케이션으로 지정한 같은 포맷이 항상 저장 된다.

이 메서드는, 565 로 555 를 동등의 것으로 해 취급해, 올바른 버전을 Format 에 돌려준다. 이것들에 차이가 생기는 것은 애플리케이션이 백 버퍼를 잠그었을 경우에 한정되어 그 때문에(위해)는 애플리케이션으로 명시적인 플래그를 설정할 필요가 있다.

Get/SetStreamSource 의 변경

IDirect3DDevice9::GetStreamSource 메서드와 IDirect3DDevice9::SetStreamSource 메서드의 파라미터가 1 개 추가되었다. 오프셋(offset) 파라미터는, 스트림 선두와 정점 데이터 선두의 사이의 바이트수이다. 오프셋(offset)는 바이트 단위로 나타난다. 이것에 의해, 파이프라인으로 스트림 오프셋(offset)를 지원 할 수 있다. 장치가 스트림 오프셋(offset)를 지원 하고 있을지 어떨지를 조사하려면 ,D3DDEVCAPS2 의 「D3DDEVCAPS2_STREAMOFFSET 정수」를 참조할것.

HRESULT GetStreamSource(
    UINT StreamNumber,
    IDirect3DVertexBuffer9 **ppStreamData,
    UINT *pOffsetInBytes,
    UINT *pStride
);

핸들

몇개의 메서드에 이제 1 개의 파라미터로서 핸들이 추가되었다. 이 파라미터는 현재는 사용되지 않기 때문에, NULL 로 설정할 필요가 있다. 영향을 받는 메서드는, 다음과 같다.

	CreateTexture
	CreateVolumeTexture
	CreateCubeTexture
	CreateVertexBuffer
	CreateIndexBuffer
	CreateRenderTarget
	CreateDepthStencilSurface
	CreateOffscreenPlainSurface

멀티 샘플링의 품질의 변경

이전에는,D3DMULTISAMPLE_TYPE 열거가 존재하는 것만으로 있었다. DirectX 9.0 에서는, 이 열거를 보관 유지해, 열거의 각 요소의 품질 레벨이라고 하는 생각을 도입했다. 품질 레벨은, 마스킹 가능한 샘플수를 (D3DRS_MULTISAMPLEMASK 로) 나타내는 것에 의해, 표시 품질과 퍼포먼스와의 트레이드 오프를 나타낸다.

애플리케이션은 필요로 하는 마스킹 가능한 샘플수를 선택해,IDirect3D9::CheckDeviceMultiSampleType 가 돌려주는 pQualityLevels 값을 조사할 필요가 있다. 이 값은, 제로 이외의 경우, 애플리케이션이 새로운 MultiSampleQuality 인수를 개입시켜 다양한 생성 함수 (CreateRenderTarget 등)에 건네줄 수가 있는 품질 레벨의 수를 나타낸다.

드라이버는, D3DMULTISAMPLE_ONE 로 그 모든 멀티 샘플링 스킴을 품질 레벨로서 공개하므로, 애플리케이션으로 샘플을 마스킹할 필요가 없는 경우는, 이 1 개의 형태만으로 이용 가능한 모든 멀티 샘플링 스킴을 열거할 수 있다. D3DPRASTERCAPS_STRETCHBLTMULTISAMPLE Caps 비트는 사용되지 않게 되었다. 이 비트는, 멀티 샘플링 메서드가 쓰기 마스크를 지원 하고 있지 않는 것을 나타내기 위해서(때문에) 사용되고 있었지만, BeginScene 와 EndScene 의 사이에 온과 오프를 바꿀 수가 없었다. 이러한 마스킹 가능하지 않는 메서드는, D3DMULTISAMPLE_ONE 를 개입시켜 공개되게 되었다.

새로운 Caps 비트인 D3DPRASTERCAPS_MULTISAMPLE_TOGGLABLE 는, 장치가 BeginScene 와 EndScene 의 사이로, D3DRS_MULTISAMPLEANTIALIAS 렌더링 스테이트를 사용해, 멀티 샘플링의 온과 오프가 바꿀 수가 있는 것을 나타낸다. 이 플래그를 설정하지 않는 장치는, BeginScene/EndScene 의 내부에서 멀티 샘플링을 유효 또는 무효로 할 수 없다.

HRESULT CheckDeviceMultiSampleType( 
       UINT Adapter, 
       D3DDEVTYPE DeviceType, 
       D3DFORMAT SurfaceFormat, 
       BOOL Windowed, 
       D3DMULTISAMPLE_TYPE MultiSampleType, 
       DWORD * pQualityLevels);	

최대치는, 마스킹 가능한 샘플수 마다 다르다 (예를 들어, D3DMULTISAMPLE_4_SAMPLES 는 3 개의 품질 레벨을 가질 수가 있지만, _2_SAMPLES 가 가질 수가 있는 것은 1 개 뿐이다). 마스킹 가능한 샘플수 마다 품질 레벨수는 8 개가 상한이다 (드라이버는 이것을 넘어 표현할 수 없다). 품질의 범위는 0 ~ (*pQualityLevels-1)이다.

IDirect3DDevice9::CreateRenderTargetIDirect3DDevice9::CreateDepthStencilSurface 도 또한 품질 레벨을 돌려주도록(듯이) 확장되었다. 페어로 하는 메서드는, 품질 레벨과 DirectX 8. x 의 멀티 샘플링 타입이 일치하고 있지 않으면 안 된다.

ResourceManagerDiscardBytes 의 변경

ResourceManagerDiscardBytesIDirect3DDevice9::EvictManagedResources 로 옮겨졌다. 이것을 사용하면 모든 리소스, 즉 Direct3D 리소스와 드라이버 리소스의 양쪽 모두를 소거할 수 있다.

비디오 메모리의 부족을 위해서(때문에) 리소스 (관리하에 있을지 어떨지는 묻지 않는다)의 생성에 실패했을 경우, 리소스 매니저에 대해서 문의를 하게 되었다. 생성이 성공하기 위해서(때문에) 필요한 리소스를 릴리즈 하도록(듯이), 매니저에 대한 요구가 자동적으로 행해진다. DirectX 8.0 에서는, 이 처리는 자동적으로 하행 깨지지 않았다.

SetSoftwareVertexProcessing 의 변경

애플리케이션은, 믹스 모드의 장치를 생성 해, 소프트웨어 및 하드웨어의 정점 처리를 사용할 수 있다.

DirectX 8. x 로 2 개의 정점 처리 모드를 바꾸려면 , D3DRS_SOFTWAREVP 을 사용해 IDirect3DDevice8::SetRenderState 를 호출한다. 스테이트 블록에 의해 발생하는 문제를 해소하기 위해서, 이 메서드는 IDirect3DDevice9::SetSoftwareVertexProcessing 로 옮겨놓을 수 있었다. 이 새로운 메서드는 스테이트 블록에 의해 기록되지 않는다.

텍스처 샘플러의 변경

DirectX 9.0 에서는, 픽셀 셰이더 2.0 모델을 사용해, 1 살의 패스로 최대 16 개의 텍스처 표면을 지원 할 수 있지만, 텍스처 좌표는 8 개까지 제한된다. 텍스처 스테이지 스테이트에는, 표면에 관련하는 것, 좌표 세트에 관련하는 것, 정점 처리에 관련하는 것, 및 픽셀 처리에 관련하는 것이 있다. 컴파일시에 이러한 차이를 관리하기 위해서, 텍스처 스테이지 스테이트 애플리케이션 프로그래밍 인터페이스 (API)를 2 개로 분할했다. 랩 모드등의 텍스처 좌표 스테이트나 텍스처 좌표 생성에는, 종래의 IDirect3DDevice9::SetTextureStageState 를 사용한다. 게다가IDirect3DDevice9::SetSamplerState 는, 필터링, 타일링, 쿠란핑, MIPLOD 등에 사용된다. 이것은 최대 16 개까지의 샘플러에 대해서 유효하다.

SetTextureStageState 의 변경

현재, SetTextureStageState 는 다음의 스테이트를 설정한다.

D3DTSS_TEXCOORDINDEX. 이것은 고정 기능 정점 처리 스테이트이다. 프로그래밍 가능한 정점 셰이더가 사용되고 있는 경우, 이 스테이트는 무시된다.

애플리케이션으로 사용 가능한 텍스처 샘플러의 수는 픽셀 셰이더의 버전에 의해 정해진다.

SetSamplerState 의 변경

SetSamplerState 는 샘플러의 스테이트를 설정한다 (테설레이션 단위내에서의 디스플레이스먼트 맵의 샘플링에 사용되는 것도 포함한다). DirectX 8. x 로부터 이식할 경우에 컴파일시 에러를 검출할 수 있도록(듯이), D3DSAMP_ 접두어가 붙는 이름으로 변경되고 있다. 이러한 스테이트에는, D3DSAMP_ADDRESSU, D3DSAMP_ADDRESSV, D3DSAMP_ADDRESSW, D3DSAMP_BORDERCOLOR, D3DSAMP_MAGFILTER, D3DSAMP_MINFILTER, D3DSAMP_MIPFILTER, D3DSAMP_MIPMAPLODBIAS, D3DSAMP_MAXMIPLEVEL, D3DSAMP_MAXANISOTROPY 등이 있다.

정점 선언의 변경

정점 선언이 정점 셰이더 생성으로부터 떼어내졌다. 정점 선언에는 구성 요소 개체 모델 (COM) 인터페이스가 사용되게 되었다.

DirectX 8. x 에서는, 정점 선언은 정점 셰이더와 결합되고 있었다.

DirectX 9.0 에서는, 정점 선언이 정점 셰이더로부터 떼어내져, 고정 기능 파이프라인과 셰이더의 어떠한 것도 사용할 수 있게 되었다.

Vsync, Interval, SwapEffect 의 변경

모니터의 refresh rate, 프레젠테이션 속도, 프론트 버퍼대 백 버퍼의 드로잉(Drawing)를 사용자가 보다 효과적으로 제어할 수 있도록(듯이), 몇개의 변경이 더해졌다.

윈도우 모드

풀 스크린 모드

타이머 정밀도 - D3DPRESENT_PARAMETERS 의 D3DPRESENT_INTERVAL_DEFAULT 멤버는 디폴트의 시스템 타이머 정밀도를 사용한다. 따라서,D3DPRESENT_PARAMETERS 의 D3DPRESENT_INTERVAL_ONE 멤버는 시스템 타이머 정밀도를 향상하기 위해서 timeBeginPeriod(1)를 호출한다. 이것에 의해 수직 동기의 질은 향상하지만, 처리에 필요로 하는 시간이 조금 길어진다. 어느 쪽의 파라미터에서도, 수직 방향의 동기가 시도된다.



© 2002 Microsoft Corporation. All rights reserved.
↑TOP