다음을 통해 공유


Direct3D 9에서 Direct3D로 10 고려 사항(Direct3D 10)

다음 페이지에서는 Direct3D 9와 Direct3D 10 간의 주요 차이점에 대한 기본 개요를 제공합니다. 아래 개요는 Direct3D 9 환경을 통해 개발자가 Direct3D 10을 탐색하고 관련하도록 지원하는 몇 가지 인사이트를 제공합니다.

이 항목의 정보는 Direct3D 9와 Direct3D 10을 비교하지만 Direct3D 11은 Direct3D 10 및 10.1의 향상된 기능에서 빌드되므로 Direct3D 9에서 Direct3D 11로 마이그레이션하려면 이 정보도 필요합니다. Direct3D 10을 넘어 Direct3D 11로 이동하는 방법에 대한 자세한 내용은 Direct3D 11로 마이그레이션을 참조하세요.

Direct3D 10의 주요 구조적 변경 개요

Direct3D 10 디바이스를 사용하여 렌더링하는 프로세스는 구조적으로 Direct3D 9와 비슷합니다.

  • 꼭짓점 스트림 원본 설정
  • Direct3D 10에서 입력 레이아웃 설정(Direct3D 9에서 꼭짓점 스트림 선언 설정)
  • 기본 토폴로지 선언
  • 텍스처 설정
  • 상태 개체 설정
  • 셰이더 설정
  • Draw

그리기 호출은 작업을 함께 연결합니다. 그리기 호출 이전의 호출 순서는 임의입니다. Direct3D 10 API 디자인의 주요 차이점은 다음과 같습니다.

  • 고정 함수 제거
  • CAPS 비트 제거 - Direct3D 10의 기본 기능 집합이 보장됨
  • 더 엄격한 관리: 단계 간 리소스 액세스, 디바이스 상태, 셰이더 상수, 셰이더 연결(셰이더에 대한 입력 및 출력)
  • API 진입점 이름 변경은 Lock()이 아닌 가상 GPU 메모리(Map())의 사용을 반영합니다.
  • 디버그 계층을 만들 때 디바이스에 추가할 수 있습니다.
  • 기본 토폴로지는 이제 명시적 상태입니다(그리기 호출과 분리됨).
  • 명시적 셰이더 상수는 이제 상수 버퍼에 저장됩니다.
  • 셰이더 작성은 전적으로 HLSL에서 수행됩니다. 이제 HLSL 컴파일러가 기본 Direct3D 10 DLL에 상주합니다.
  • 프로그래밍 가능한 새로운 단계 - 기하 도형 셰이더
  • BeginScene()/EndScene() 제거
  • 새 구성 요소에 구현된 일반적인 2D, 포커스 및 어댑터 관리 기능: DXGI

고정 함수 제거

프로그래밍 가능한 파이프라인을 완전히 활용하는 Direct3D 9 엔진에서도 FF(고정 함수) 파이프라인에 의존하는 여러 영역이 다시 기본 놀라운 경우가 있습니다. 가장 일반적인 영역은 일반적으로 UI에 대한 화면 공간 맞춤 렌더링과 관련이 있습니다. 이러한 이유로 필요한 대체 동작을 제공하는 FF 에뮬레이션 셰이더 또는 셰이더 집합을 빌드해야 할 수 있습니다.

이 설명서에는 가장 일반적인 FF 동작에 대한 대체 셰이더 원본이 포함된 백서가 포함되어 있습니다(고정 함수 EMU 샘플 참조). 알파 테스트를 포함한 일부 고정 함수 픽셀 동작이 셰이더로 이동되었습니다.

디바이스 개체 생성 시간 유효성 검사

Direct3D 10 파이프라인은 CPU 오버헤드를 줄이기 위한 기본 의도로 하드웨어 및 소프트웨어에서 처음부터 다시 디자인되었습니다(그리기 시). 비용을 줄이기 위해 모든 유형의 디바이스 데이터에는 디바이스 자체에서 제공하는 명시적 생성 메서드가 있는 개체가 할당되었습니다. 이렇게 하면 Direct3D 9에서 자주 수행하는 것처럼 그리기 호출 중에가 아니라 개체를 만들 때 엄격한 데이터 유효성 검사를 수행할 수 있습니다.

엔진 추상화/분리

Direct3D 9 및 Direct3D 10을 모두 지원하려는 게임을 포함한 애플리케이션은 나머지 코드 베이스에서 렌더링 계층을 추상화해야 합니다. 이를 달성하는 방법에는 여러 가지가 있지만 모두의 핵심은 하위 수준 Direct3D 디바이스에 대한 추상화 계층의 디자인입니다. 모든 시스템은 GPU 리소스 및 하위 수준 형식 관리를 제공하도록 설계된 공통 계층을 통해 하드웨어와 통신해야 합니다.

Direct3D 9 종속성 직접 제거

이전에 테스트한 대규모 코드 베이스를 포팅할 때 코드에서 이전에 테스트된 동작을 유지하는 데 반드시 필요한 코드 변경의 양을 최소화하는 것이 중요합니다. 모범 사례에는 메모를 사용하여 항목이 변경되는 위치를 명확하게 문서화하는 것이 포함됩니다. 코드 베이스를 빠르게 탐색할 수 있도록 이 작업에 대한 주석 처리 표준을 사용하는 것이 유용한 경우가 많습니다.

다음은 이 작업에 사용할 수 있는 표준 단일 줄/시작 블록 주석의 예제 목록입니다.

항목 설명
Direct3D 10 제거됨
코드 줄/블록이 제거되는 경우 이 기능을 사용합니다.
Direct3D 10에는 UPDATE가 필요합니다.
나중에 동작 변환을 위해 코드를 방문하는 데 사용해야 하는 작업/새 API를 제안하는 NEED UPDATE 주석에 추가 메모를 추가하는 데 도움이 됩니다. \\ Direct3D 10 NEEDS UPDATE가 발생하는 경우 어설션(false)을 많이 사용하여 실수로 잘못된 코드를 실행하지 않도록 해야 합니다.
Direct3D 10 변경됨
주요 변경이 발생한 영역은 향후 참조를 위해 보관해야 하지만 주석 처리해야 합니다.
Direct3D 10 END
끝 코드 블록 한정자

 

여러 소스 줄의 경우 C 스타일 /* */ 주석도 사용해야 하지만 이러한 영역 주위에 관련 시작/끝 주석을 추가해야 합니다.

애플리케이션 빌드 문제를 신속하게 해결하기 위한 요령

Direct3D 9 형식 재정의

Direct3D 10 헤더에서 더 이상 지원되지 않는 Direct3D 9 기본 형식에 대한 형식 정의/재정의를 포함하는 상위 수준 헤더 파일을 삽입하는 것이 유용할 수 있습니다. 이렇게 하면 Direct3D 9 형식에서 새로 정의된 Direct3D 10 형식으로 직접 매핑되는 코드 및 인터페이스의 변경 내용을 최소화할 수 있습니다. 이 방법은 코드 동작을 하나의 소스 파일에 함께 유지하는 데에도 유용합니다. 이 경우 렌더링에 사용되는 일반적인 구문을 설명하지만 Direct3D 9 및 Direct3D 10 API 모두에 걸쳐 있는 버전 중립/일반적으로 명명된 형식을 정의하는 것이 좋습니다. 예시:

#if defined(D3D9)
typedef IDirect3DIndexBuffer9   IDirect3DIndexBuffer;
typedef IDirect3DVertexBuffer9  IDirect3DVertexBuffer;
#else //D3D10
typedef ID3D10Buffer            IDirect3DIndexBuffer;
typedef ID3D10Buffer            IDirect3DVertexBuffer
#endif

기타 Direct3D 10 특정 예제는 다음과 같습니다.

typedef ID3D10TextureCube   IDirect3DCubeTexture;
typedef ID3D10Texture3D     IDirect3DVolumeTexture;
typedef D3D10_VIEWPORT      D3DVIEWPORT;
typedef ID3D10VertexShader  IDirect3DVertexShader;
typedef ID3D10PixelShader   IDirect3DPixelShader;

최신 버전의 Microsoft Visual Studio를 사용하여 Direct3D 10 및 Windows Vista 애플리케이션을 개발하는 것이 좋습니다. 그러나 이전 버전의 Visual Studio를 사용하여 Direct3D 10에 의존하는 Windows Vista 애플리케이션을 빌드할 수 있습니다. Direct3D 10은 다음 lib에 종속성(Server 2003 SP1 플랫폼 SDK와 마찬가지로)이 있는 Windows Vista 플랫폼 구성 요소입니다. buffer_security 검사 링커 문제를 해결하려면 BufferOverflowU.lib가 필요합니다.

디바이스 CAP 시뮬레이션

많은 애플리케이션에는 사용 가능한 디바이스 CAPS 데이터에 의존하는 코드 영역이 포함되어 있습니다. 디바이스 열거형을 재정의하고 디바이스 CAPS를 합리적인 값으로 강제하여 이 작업을 수행합니다. 나중에 CAPS에 대한 종속성이 있는 지역을 다시 방문하여 가능한 경우 CAPS를 완전히 제거할 계획입니다.

Direct3D 10 API 구동

이 섹션에서는 Direct3D 10 API로 인한 동작 변경에 대해 집중합니다.

리소스 만들기

Direct3D 10 API는 계획된 사용량에 따라 특정 바인딩 플래그가 있는 제네릭 버퍼 형식으로 리소스를 디자인했습니다. 이 디자인 지점은 꼭짓점 버퍼로 렌더링한 다음 CPU를 중단하지 않고 즉시 결과를 그리는 등의 시나리오를 위해 파이프라인에서 리소스의 거의 유비쿼터스 액세스를 용이하게 하기 위해 선택되었습니다. 다음 예제에서는 리소스 설명이 GPU 리소스 바인딩 플래그에 의해서만 다르다는 것을 확인할 수 있는 꼭짓점 버퍼 및 인덱스 버퍼의 할당을 보여 줍니다.

Direct3D 10 API는 텍스처 형식 리소스를 명시적으로 만들기 위한 텍스처 도우미 메서드를 제공했지만, 상상할 수 있듯이 실제로 도우미 함수입니다.

  • CreateTexture2D()
  • CreateTextureCube()
  • CreateTexture3D()

Direct3D 10을 대상으로 하는 경우 리소스를 만드는 동안 Direct3D 9에 사용되는 것보다 더 많은 항목을 할당하려고 할 수 있습니다. 이렇게 하면 버퍼에 액세스하고 디바이스에서 리소스를 설정하기 위한 뷰를 만들어야 하는 렌더링 대상 버퍼 및 텍스처를 만들 때 가장 명확하게 알 수 있습니다.

자습서 1: Direct3D 10 기본 사항

참고 항목

Direct3D 10 이상 버전의 Direct3D는 DDS 파일 형식을 확장하여 새 DXGI 형식, 텍스처 배열 및 큐브 맵 배열을 지원합니다. DDS 파일 형식 확장 프로그램에 대한 자세한 내용은 DDS 프로그래밍 가이드를 참조하세요.

 

보기

뷰는 픽셀 버퍼에 저장된 데이터에 대한 특별히 형식화된 인터페이스입니다. 리소스는 한 번에 여러 보기를 할당할 수 있으며 이 기능은 이 SDK에 포함된 단일 패스 렌더링에서 큐브맵 샘플에 강조 표시됩니다.

리소스 액세스의 프로그래머 가이드 페이지

CubeMap 샘플

정적 및 동적 리소스 액세스

최상의 성능을 위해 애플리케이션은 데이터의 정적 특성과 동적 특성 측면에서 데이터 사용을 분할해야 합니다. Direct3D 10은 이러한 접근 방식을 활용하도록 설계되었으며, 따라서 리소스에 대한 액세스 규칙이 Direct3D 9보다 크게 강화되었습니다. 정적 리소스의 경우 생성 시간 동안 리소스를 해당 데이터로 채우는 것이 가장 좋습니다. 엔진이 Direct3D 9의 만들기, 잠금, 채우기, 잠금 해제 디자인 지점을 중심으로 디자인된 경우 리소스 인터페이스에서 스테이징 리소스 및 UpdateSubResource 메서드를 사용하여 만들기 시간에서 채우기를 연기할 수 있습니다.

Direct3D 10 효과

Direct3D 10 효과 시스템의 사용은 이 문서의 범위를 벗어납니다. 이 시스템은 Direct3D 10에서 제공하는 아키텍처 이점을 최대한 활용하기 위해 작성되었습니다. 사용에 대한 자세한 내용은 효과(Direct3D 10) 섹션을 참조하세요.

효과 없는 HLSL

Direct3D 10 효과 시스템을 사용하지 않고 Direct3D 10 셰이더 파이프라인을 구동할 수 있습니다. 이 경우 모든 상수 버퍼, 셰이더, 샘플러 및 텍스처 바인딩은 애플리케이션 자체에서 관리해야 합니다. 자세한 내용은 이 문서의 샘플 링크 및 다음 섹션을 참조하세요.

효과 없는 HLSL 샘플

셰이더 컴파일

Direct3D 10 HLSL 컴파일러는 HLSL 언어 정의에 향상된 기능을 제공하므로 2개 모드에서 작동할 수 있습니다. Direct3D 9 스타일 내장 함수 및 의미 체계를 완벽하게 지원하려면 컴파일별로 지정할 수 있는 호환성 모드 플래그를 사용하여 컴파일을 호출해야 합니다.

셰이더 모델 4.0 특정 HLSL 언어 의미 체계 및 Direct3D 10에 대한 내장 함수는 HLSL에서 찾을 수 있습니다. 가장 주목해야 할 Direct3D 9 HLSL 구문의 주요 변경 사항은 텍스처 액세스 영역에 있습니다. 새 구문은 호환성 모드 외부에서 컴파일러에서 지원하는 유일한 형식입니다.

참고 항목

Direct3D 10 컴파일러 형식 API(D3D10CompileShaderD3D10CompileEffectFromMemory)는 Windows Vista 이상에서 실행되는 Direct3D 10, 10.1 및 11 런타임에서 제공됩니다. Direct3D 10 컴파일러 형식 API는 DirectX SDK(2006년 12월)에 제공된 HLSL 컴파일러와 동일한 기능을 갖습니다. 이 HLSL 컴파일러는 Direct3D 10.1 프로필(vs_4_1, ps_4_1, gs_4_1, fx_4_1)을 지원하지 않으며 많은 최적화 및 개선 사항이 누락되었습니다. 최신 레거시 DirectX SDK 릴리스에서 Direct3D 10.1 프로필을 지원하는 HLSL 컴파일러를 가져올 수 있습니다. 레거시 DirectX SDK에 대한 자세한 내용은 DirectX SDK는 어디에 있나요?를 참조하세요. Windows SDK에서 최신 HLSL Fxc.exe 명령줄 컴파일러 및 D3DCompiler API를 가져올 수 있습니다.

 

셰이더 리소스 만들기

Direct3D 10 효과 시스템 외부에서 컴파일된 셰이더 인스턴스를 만드는 작업은 Direct3D 9와 매우 유사한 방식으로 수행되지만 Direct3D 10에서는 나중에 사용할 수 있도록 셰이더 입력 서명을 유지해야 합니다. 서명은 기본적으로 셰이더 Blob의 일부로 반환되지만 필요한 경우 메모리 요구 사항을 줄이기 위해 추출될 수 있습니다. 자세한 내용은 Direct3D 10에서 셰이더 사용을 참조 하세요.

셰이더 리플렉션 계층 인터페이스

셰이더 리플렉션 계층은 셰이더 요구 사항에 대한 정보를 얻을 수 있는 인터페이스입니다. 이는 셰이더에 올바른 입력 구조를 제공하는지 확인하기 위해 셰이더 입력 요구 사항을 트래버스해야 할 수 있는 입력 어셈블리 연결(아래 참조)을 만들 때 특히 유용합니다. 컴파일된 셰이더의 인스턴스를 만드는 동시에 리플렉션 계층 인터페이스의 인스턴스를 만들 수 있습니다.

셰이더 리플렉션 계층은 유사한 기능을 제공하는 D3DX9 메서드를 대체합니다. 예를 들어 IsParameterUsed는 GetDesc 메서드로 대체됩니다.

입력 어셈블러 레이아웃 - 꼭짓점 셰이더/입력 스트림 링크

IA(입력 어셈블러)는 Direct3D 9 스타일 꼭짓점 스트림 선언을 대체하며 설명 구조는 형태가 매우 유사합니다. IA에서 가져오는 기본 차이점은 만든 IA 레이아웃 개체가 셰이더 입력 서명의 특정 형식에 직접 매핑되어야 한다는 것입니다. 입력 스트림을 셰이더에 연결하기 위해 만든 매핑 개체는 셰이더 입력 서명이 입력 레이아웃을 만드는 데 사용된 셰이더의 서명과 일치하는 셰이더 수에 걸쳐 사용될 수 있습니다.

정적 데이터로 파이프라인을 가장 잘 구동하려면 입력 스트림 형식의 순열을 가능한 셰이더 입력 서명으로 고려하고 가능한 한 빨리 IA 레이아웃 개체 인스턴스를 만들고 가능한 한 다시 사용해야 합니다.

셰이더 데드 코드 제거의 영향

다음 섹션에서는 엔진 코드에서 신중하게 처리해야 할 수 있는 Direct3D 9와 Direct3D 10 간의 중요한 차이점을 자세히 설명합니다. 조건식을 포함하는 셰이더에는 컴파일 프로세스의 일부로 특정 코드 경로가 제거되는 경우가 많습니다. Direct3D 9에서는 사용하지 않을 때 서명 입력(예: 아래 예) 및 상수 입력의 두 가지 종류의 입력을 제거할 수 있습니다(제거용으로 표시됨). 상수 버퍼의 끝에 사용되지 않는 항목이 포함된 경우 셰이더의 크기 선언은 끝에 사용되지 않은 항목이 없는 상수 버퍼의 크기를 반영합니다. 이러한 종류의 입력은 모두 서명 또는 상수 버퍼 Direct3D 10에서 다시 기본 상수 버퍼 끝에 사용되지 않는 상수 입력의 경우 특별한 예외가 있습니다. 이는 큰 셰이더를 처리하고 입력 레이아웃을 만들 때 엔진에 영향을 미칠 수 있습니다. 컴파일러에서 데드 코드 최적화에 의해 제거되는 요소는 입력 구조에서 여전히 선언되어야 합니다. 다음은 이에 대한 예입니다.

꼭짓점 셰이더 입력 구조 예제

struct VS_INPUT
{
float4 pos: SV_Position;
float2 uv1 : Texcoord1;
float2 uv2 : Texcoord2; *
};

* Direct3D 9 데드 코드 제거는 조건부 데드 코드 제거로 인해 셰이더에서 선언을 제거합니다.

float4x4  g_WorldViewProjMtx;
static const bool g_bLightMapped = false; // define a compile time constant

VS_INPUT main(VS_INPUT i) 
{
    VS_INPUT o;
    o.pos = mul( i.pos, g_WorldViewProjMtx);
    o.uv1 = i.uv1;
    if ( g_bLightMapped )
    {
        o.uv2 = i.uv2;
    }
    return o;
}

또는 상수가 다음 선언을 사용하여 컴파일 시간 상수임을 더욱 분명하게 만들 수 있습니다.

#define LIGHT_MAPPED false

위의 예제에서 Direct3D 9에서는 컴파일러의 데드 코드 최적화로 인해 uv2 요소가 제거됩니다. Direct3D 10에서 데드 코드는 여전히 제거되지만 셰이더 입력 어셈블러 레이아웃에는 입력 데이터의 정의가 있어야 합니다. 셰이더 리플렉션 계층은 셰이더 입력 요구 사항을 트래버스하고 셰이더 서명 매핑에 입력 스트림에 대한 전체 설명을 제공할 수 있는 일반적인 방식으로 이 상황을 처리하는 수단을 제공합니다.

함수 서명에 의미 체계 이름/인덱스가 있는지 검색하는 예제 함수는 다음과 같습니다.

// Returns true if the SemanticName / SemanticIndex is used in the input signature.
// pReflector is a previously acquired shader reflection interface.
bool IsSignatureElementExpected(ID3D10ShaderReflection *pReflector, const LPCSTR SemanticName, UINT SemanticIndex)
{
    D3D10_SHADER_DESC               shaderDesc;
    D3D10_SIGNATURE_PARAMETER_DESC  paramDesc;

    Assert(pReflector);
    Assert(SemanticName);

    pReflector->GetDesc(&shaderDesc);

    for (UINT k=0; k<shaderDesc.InputParameters; k++)
    {
        pReflector->GetInputParameterDesc( k, &paramDesc);
        if (wcscmp( SemanticName, paramDesc.SemanticName)==0 && paramDesc.SemanticIndex == SemanticIndex) 
            return true;
    }

    return false;
}

상태 개체 만들기

엔진 코드를 포팅할 때 처음에는 기본 상태 개체 집합을 사용하고 모든 Direct3D 9 디바이스 렌더링 상태/텍스처 상태 설정을 사용하지 않도록 설정하는 데 도움이 될 수 있습니다. 이렇게 하면 렌더링 아티팩트가 발생하지만 작업을 시작하고 실행하는 가장 빠른 방법입니다. 나중에 복합 키를 사용하여 사용 중인 상태 개체 수를 최대로 재사용할 수 있는 상태 개체 관리 시스템을 생성할 수 있습니다.

텍스처 포팅

지원되는 파일 형식

그래픽 파일(예: D3DX10CreateTextureFromFile)에서 질감을 만들거나 그래픽 파일로 저장하는 D3DXxxCreateXXXD3DXxxSaveXXX 함수는 Direct3D 9에서와 다른 파일 형식 집합을 Direct3D 10에서 지원합니다.

파일 형식 Direct3D 9 Direct3D 10
.bmp x x
.jpg x x
.tga x
.png x x
.dds x x
.Ppm x
.Dib x
.Hdr x
.Pfm x
.tiff x
.gif x
.tif x

 

자세한 내용은 Direct3D 9 D3DXIMAGE_FILEFORMAT 열거형을 Direct3D 10의 D3DX10_IMAGE_FILE_FORMAT 열거형과 비교합니다.

참고 항목

D3DX(D3DX 9, D3DX 10 및 D3DX 11) 유틸리티 라이브러리는 Windows 8에서 더 이상 사용되지 않습니다. 텍스처 파일 처리를 위해 DirectXTex를 사용하는 것이 좋습니다.

 

텍스처 형식 매핑

다음 표에서는 Direct3D 9에서 Direct3D 10으로의 텍스처 형식 매핑을 보여 줍니다. DXGI에서 사용할 수 없는 형식의 모든 콘텐츠는 유틸리티 루틴으로 변환해야 합니다.

Direct3D 9 형식 Direct3D 10 형식
D3DFMT_UNKNOWN DXGI_FORMAT_UNKNOWN
D3DFMT_R8G8B8 사용할 수 없음
D3DFMT_A8R8G8B8 DXGI_FORMAT_B8G8R8A8_UNORM 및 DXGI_FORMAT_B8G8R8A8_UNORM_SRGB
D3DFMT_X8R8G8B8 DXGI_FORMAT_B8G8R8X8_UNORM 및 DXGI_FORMAT_B8G8R8X8_UNORM_SRGB
D3DFMT_R5G6B5 DXGI_FORMAT_B5G6R5_UNORM²
D3DFMT_X1R5G5B5 사용할 수 없음
D3DFMT_A1R5G5B5 DXGI_FORMAT_B5G5R5A1_UNORM²
D3DFMT_A4R4G4B4 DXGI_FORMAT_B4G4R4A4_UNORM
D3DFMT_R3G3B2 사용할 수 없음
D3DFMT_A8 DXGI_FORMAT_A8_UNORM
D3DFMT_A8R3G3B2 사용할 수 없음
D3DFMT_X4R4G4B4 사용할 수 없음
D3DFMT_A2B10G10R10 DXGI_FORMAT_R10G10B10A2
D3DFMT_A8B8G8R8 DXGI_FORMAT_R8G8B8A8_UNORM 및 DXGI_FORMAT_R8G8B8A8_UNORM_SRGB
D3DFMT_X8B8G8R8 사용할 수 없음
D3DFMT_G16R16 DXGI_FORMAT_R16G16_UNORM
D3DFMT_A2R10G10B10 사용할 수 없음
D3DFMT_A16B16G16R16 DXGI_FORMAT_R16G16B16A16_UNORM
D3DFMT_A8P8 사용할 수 없음
D3DFMT_P8 사용할 수 없음
D3DFMT_L8 DXGI_FORMAT_R8_UNORM 참고: 셰이더에서 .r 스위즐을 사용하여 다른 구성 요소에 빨간색을 복제하여 D3D9 동작을 가져옵니다.
D3DFMT_A8L8 DXGI_FORMAT_R8G8_UNORM 참고: 셰이더에서 swizzle .rrrg를 사용하여 빨간색을 복제하고 녹색을 알파 구성 요소로 이동하여 D3D9 동작을 가져옵니다.
D3DFMT_A4L4 사용할 수 없음
D3DFMT_V8U8 DXGI_FORMAT_R8G8_SNORM
D3DFMT_L6V5U5 사용할 수 없음
D3DFMT_X8L8V8U8 사용할 수 없음
D3DFMT_Q8W8V8U8 DXGI_FORMAT_R8G8B8A8_SNORM
D3DFMT_V16U16 DXGI_FORMAT_R16G16_SNORM
D3DFMT_W11V11U10 사용할 수 없음
D3DFMT_A2W10V10U10 사용할 수 없음
D3DFMT_UYVY 사용할 수 없음
D3DFMT_R8G8_B8G8 DXGI_FORMAT_G8R8_G8B8_UNORM(DX9에서 데이터는 255.0f로 확장되었지만 셰이더 코드에서 처리할 수 있습니다).
D3DFMT_YUY2 사용할 수 없음
D3DFMT_G8R8_G8B8 DXGI_FORMAT_R8G8_B8G8_UNORM(DX9에서 데이터는 255.0f로 확장되었지만 셰이더 코드에서 처리할 수 있습니다).
D3DFMT_DXT1 DXGI_FORMAT_BC1_UNORM 및 DXGI_FORMAT_BC1_UNORM_SRGB
D3DFMT_DXT2 DXGI_FORMAT_BC1_UNORM &DXGI_FORMAT_BC1_UNORM_SRGB 참고: DXT1 및 DXT2는 API/하드웨어 관점에서 동일합니다... 유일한 차이점은 애플리케이션에서 추적할 수 있고 별도의 형식이 필요하지 않은 '미리 곱한 알파'였습니다.
D3DFMT_DXT3 DXGI_FORMAT_BC2_UNORM 및 DXGI_FORMAT_BC2_UNORM_SRGB
D3DFMT_DXT4 DXGI_FORMAT_BC2_UNORM &DXGI_FORMAT_BC2_UNORM_SRGB 참고: DXT3 및 DXT4는 API/하드웨어 관점에서 동일합니다... 유일한 차이점은 애플리케이션에서 추적할 수 있고 별도의 형식이 필요하지 않은 '미리 곱한 알파'였습니다.
D3DFMT_DXT5 DXGI_FORMAT_BC3_UNORM 및 DXGI_FORMAT_BC3_UNORM_SRGB
D3DFMT_D16 및 D3DFMT_D16_LOCKABLE DXGI_FORMAT_D16_UNORM
D3DFMT_D32 사용할 수 없음
D3DFMT_D15S1 사용할 수 없음
D3DFMT_D24S8 사용할 수 없음
D3DFMT_D24X8 사용할 수 없음
D3DFMT_D24X4S4 사용할 수 없음
D3DFMT_D16 DXGI_FORMAT_D16_UNORM
D3DFMT_D32F_LOCKABLE DXGI_FORMAT_D32_FLOAT
D3DFMT_D24FS8 사용할 수 없음
D3DFMT_S1D15 사용할 수 없음
D3DFMT_S8D24 DXGI_FORMAT_D24_UNORM_S8_UINT
D3DFMT_X8D24 사용할 수 없음
D3DFMT_X4S4D24 사용할 수 없음
D3DFMT_L16 DXGI_FORMAT_R16_UNORM 참고: 셰이더에서 .r 스위즐을 사용하여 다른 구성 요소에 빨간색을 복제하여 D3D9 동작을 가져옵니다.
D3DFMT_INDEX16 DXGI_FORMAT_R16_UINT
D3DFMT_INDEX32 DXGI_FORMAT_R32_UINT
D3DFMT_Q16W16V16U16 DXGI_FORMAT_R16G16B16A16_SNORM
D3DFMT_MULTI2_ARGB8 사용할 수 없음
D3DFMT_R16F DXGI_FORMAT_R16_FLOAT
D3DFMT_G16R16F DXGI_FORMAT_R16G16_FLOAT
D3DFMT_A16B16G16R16F DXGI_FORMAT_R16G16B16A16_FLOAT
D3DFMT_R32F DXGI_FORMAT_R32_FLOAT
D3DFMT_G32R32F DXGI_FORMAT_R32G32_FLOAT
D3DFMT_A32B32G32R32F DXGI_FORMAT_R32G32B32A32_FLOAT
D3DFMT_CxV8U8 사용할 수 없음
D3DDECLTYPE_FLOAT1 DXGI_FORMAT_R32_FLOAT
D3DDECLTYPE_FLOAT2 DXGI_FORMAT_R32G32_FLOAT
D3DDECLTYPE_FLOAT3 DXGI_FORMAT_R32G32B32_FLOAT
D3DDECLTYPE_FLOAT4 DXGI_FORMAT_R32G32B32A32_FLOAT
D3DDECLTYPED3DCOLOR 사용할 수 없음
D3DDECLTYPE_UBYTE4 DXGI_FORMAT_R8G8B8A8_UINT 참고: 셰이더는 UINT 값을 가져오지만 Direct3D 9 스타일 정수 부동 소수 자릿수가 필요한 경우(0.0f, 1.0f... 255.f), UINT는 셰이더에서 float32로 변환할 수 있습니다.
D3DDECLTYPE_SHORT2 DXGI_FORMAT_R16G16_SINT 참고: 셰이더는 SINT 값을 가져오지만 Direct3D 9 스타일 정수 부동 소수 자릿수가 필요한 경우 셰이더에서 SINT를 float32로 변환할 수 있습니다.
D3DDECLTYPE_SHORT4 DXGI_FORMAT_R16G16B16A16_SINT 참고: 셰이더는 SINT 값을 가져오지만 Direct3D 9 스타일 정수 부동 소수 자릿수가 필요한 경우 셰이더에서 SINT를 float32로 변환할 수 있습니다.
D3DDECLTYPE_UBYTE4N DXGI_FORMAT_R8G8B8A8_UNORM
D3DDECLTYPE_SHORT2N DXGI_FORMAT_R16G16_SNORM
D3DDECLTYPE_SHORT4N DXGI_FORMAT_R16G16B16A16_SNORM
D3DDECLTYPE_USHORT2N DXGI_FORMAT_R16G16_UNORM
D3DDECLTYPE_USHORT4N DXGI_FORMAT_R16G16B16A16_UNORM
D3DDECLTYPE_UDEC3 사용할 수 없음
D3DDECLTYPE_DEC3N 사용할 수 없음
D3DDECLTYPE_FLOAT16_2 DXGI_FORMAT_R16G16_FLOAT
D3DDECLTYPE_FLOAT16_4 DXGI_FORMAT_R16G16B16A16_FLOAT
FourCC 'ATI1' DXGI_FORMAT_BC4_UNORM
FourCC 'ATI2' DXGI_FORMAT_BC5_UNORM

 

Direct3D 11 런타임에 포함된 1.1DXGI 1.1에는 BGRA 형식이 포함됩니다. 그러나 WDDM 1.0(Windows Vista)용 WDDM(Windows Display Driver Model)에 구현된 드라이버가 있는 Direct3D 10 및 10.1 디바이스에서는 이러한 형식에 대한 지원이 선택 사항입니다. 대신 DXGI_FORMAT_R8G8B8A8_UNORM 사용하는 것이 좋습니다. 또는 D3D10_CREATE_DEVICE_BGRA_SUPPORT 사용하여 디바이스를 만들어 Direct3D 11.0 런타임 및 WDDM 1.1 드라이버 이상이 설치된 컴퓨터만 지원하도록 할 수 있습니다.

²DXGI 1.0은 5:6:5 및 5:5:5:1 형식으로 정의되었지만 Direct3D 10.x 또는 Direct3D 11.0 런타임에서는 지원되지 않았습니다. 이러한 형식은 DirectX 11.1 런타임에서 DXGI 1.2에서 선택적으로 지원되며, 기능 수준 11.1 비디오 어댑터 및 WDDM 1.2(Windows 8부터 시작하는 디스플레이 드라이버 모델) 드라이버에 필요하며 이미 10level9 기능 수준에서 지원됩니다.

1.2에는 4:4:4:4 형식이 도입되었습니다. 이 형식은 기능 수준 11.1 비디오 어댑터 및 WDDM 1.2 드라이버에 필요하며 10level9 기능 수준에서 이미 지원되는 DirectX 11.1 런타임에서 선택적으로 지원됩니다.

압축되지 않은 형식의 경우 DXGI는 임의의 픽셀 형식 패턴에 대한 지원을 제한했습니다. 압축되지 않은 모든 형식은 RGBA 형식이어야 합니다. 이렇게 하려면 기존 자산 픽셀 형식을 스위즐링해야 할 수 있습니다. 가능한 경우 오프라인 사전 프로세스 패스로 컴퓨팅하는 것이 좋습니다.

셰이더 포팅

Direct3D 10 셰이더는 HLSL에서 작성됩니다.

Direct3D 10은 어셈블리 언어 사용을 디버깅 용도로만 제한하므로 Direct3D 9에서 사용되는 필기 어셈블리 셰이더는 HLSL로 변환해야 합니다.

셰이더 서명 및 링크

이 문서의 앞부분에서 꼭짓점 셰이더 입력 서명에 대한 입력 어셈블리 연결 요구 사항에 대해 설명했습니다(위 참조). Direct3D 10 런타임은 셰이더 간의 스테이지 연결에 대한 요구 사항도 강화했습니다. 이 변경 내용은 Direct3D 9에서 단계 간의 바인딩이 완전히 설명되지 않았을 수 있는 셰이더 원본에 영향을 줍니다. 예시:

VS_OUTPUT                       PS_INPUT
float4   pos : SV_POSITION;     float4 pos : SV_POSITION;
float4   uv1 : TEXCOORD1;       float4 uv1 : TEXCOORD1;
float4x3 tangentSp : TEXCOORD2; float4 tangent : TEXCOORD2; *
float4   Color : TEXCOORD6;     float4 color : TEXCOORD6;

* 끊어진 VS - PS 링크 - 픽셀 셰이더가 전체 행렬에 관심이 없더라도 링크는 전체 float4x3을 지정해야 합니다.

단계 간의 연결 의미 체계는 정확히 일치해야 하지만 대상 스테이지 입력은 출력되는 값의 접두사일 수 있습니다. 위의 예제에서 픽셀 셰이더는 위치 및 texcoord1을 유일한 입력으로 가질 수 있지만 순서 제약 조건으로 인해 위치와 texcoord2를 유일한 입력으로 가질 수 없습니다.

HLSL 셰이더 단계 링크

셰이더 간 연결은 파이프라인의 다음 지점에서 발생할 수 있습니다.

  • 꼭짓점 셰이더에 대한 입력 어셈블러
  • 꼭짓점 셰이더에서 픽셀 셰이더로
  • 꼭짓점 셰이더에서 기하 도형 셰이더로
  • 출력을 스트리밍하는 꼭짓점 셰이더
  • 기하 도형 셰이더에서 픽셀 셰이더로
  • 스트림 아웃할 기하 도형 셰이더

상수 버퍼

Direct3D 9에서 콘텐츠를 쉽게 포팅하기 위해 Effects 시스템 외부의 상수 관리에 대한 초기 접근 방식에는 필요한 모든 상수가 포함된 단일 상수 버퍼를 만드는 작업이 포함될 수 있습니다. 성능은 업데이트의 예상 빈도에 따라 상수를 버퍼로 정렬하는 것이 중요합니다. 이 조직은 중복 상수 집합의 양을 최소한으로 줄입니다.

기능 수준 9 이상에서 HLSL의 사용자 클립 평면

Windows 8부터는 SV_ClipDistance 대신HLSL 함수 선언에서 클립플레인 함수 특성을 사용하여 기능 수준 9_x 기능 수준 10 이상에서 셰이더가 작동하도록 할 수 있습니다. 자세한 내용은 기능 수준 9 하드웨어의 사용자 클립 평면을 참조하세요.

주의해야 할 추가 Direct3D 10 차이점

정수(입력)입니다.

Direct3D 9에서는 정수 데이터 형식에 대한 실제 하드웨어 지원이 없지만 Direct3D 10 하드웨어는 명시적 정수 형식을 지원합니다. 꼭짓점 버퍼에 부동 소수점 데이터가 있는 경우 부동 소수점 입력이 있어야 합니다. 그렇지 않으면 정수 형식이 부동 소수점 값의 비트 패턴 표현이 됩니다. 값이 보간 없이 표시되지 않는 한 픽셀 셰이더 입력에는 정수 형식이 허용되지 않습니다(보간 한정자 참조).

마우스 커서

이전 버전의 Windows에서는 표준 GDI 마우스 커서 루틴이 모든 전체 화면 전용 디바이스에서 제대로 작동하지 않았습니다. 이러한 경우를 처리하기 위해 SetCursorProperties, ShowCursorSetCursorPosition API가 추가되었습니다. Windows Vista의 GDI 버전은 DXGI 표면을 완전히 이해하므로 이 특수 마우스 커서 API가 필요하지 않으므로 Direct3D 10에 해당하는 항목이 없습니다. Direct3D 10 애플리케이션은 대신 마우스 커서에 표준 GDI 마우스 커서 루틴을 사용해야 합니다.

Direct3D 10에서 픽셀에 텍셀 매핑

Direct3D 9에서 텍셀 센터와 픽셀 센터는 반 단위 떨어져 있었습니다(텍셀을 픽셀에 직접 매핑 참조(Direct3D 9) Direct3D 10에서는 텍셀 중심이 이미 반 단위이므로 꼭짓점 좌표를 전혀 이동할 필요가 없습니다.

Direct3D 10을 사용하면 전체 화면 쿼드를 더 직선으로 렌더링할 수 있습니다. 전체 화면 쿼드는 클립스페이스(-1,1)에 정의되어야 하며 변경 없이 꼭짓점 셰이더를 통과하기만 하면 됩니다. 이렇게 하면 화면 해상도가 변경 될 때마다 꼭짓점 버퍼를 다시 로드할 필요가 없으며 픽셀 셰이더에서 텍스처 좌표를 조작하는 추가 작업이 없습니다.

참조 계산 동작 변경 내용

이전 Direct3D 버전과 달리 다양한 Set 함수는 디바이스 개체에 대한 참조를 보유하지 않습니다. 즉, 애플리케이션은 해당 개체가 파이프라인에 바인딩되도록 하려면 개체에 대한 참조를 보유해야 합니다. 개체의 ref 수가 0으로 떨어지면 개체가 제거될 때 파이프라인에서 바인딩되지 않습니다. 이 참조 보유 스타일을 약한 참조 보유라고도 하므로 Device 개체의 각 바인딩 위치에는 인터페이스/개체에 대한 약한 참조가 있습니다. 달리 명시적으로 멘션 않는 한 모든 Set 메서드에 대해 이 동작을 가정해야 합니다. 개체를 파괴하면 바인딩 지점이 NULL로 설정될 때마다 디버그 계층에서 경고가 발생합니다. 디바이스 Get 메서드(예: OMGetRenderTargets )를 호출하면 반환되는 개체의 참조 수가 증가합니다.

협조적 수준 테스트

Direct3D 9 API TestCooperativeLevel의 기능은 Present를 호출할 때 DXGI_PRESENT_TEST 설정하는 것과 유사합니다.

StretchRect

Direct3D 9 IDirect3DDevice9::StretchRect 메서드와 유사한 함수는 Direct3D 10 및 10.1에서 사용할 수 없습니다. 리소스 표면을 복사하려면 ID3D10Device::CopySubresourceRegion을 사용합니다. 크기 조정 작업의 경우 텍스처 필터링을 사용하여 텍스처에 렌더링합니다. MSAA 표면을 비 MSAA 표면으로 변환하려면 ID3D10Device::ResolveSubresource를 사용합니다.

추가 Direct3D 10.1 차이점

Windows Vista SP1(서비스 팩 1)에는 Direct3D 10 및 Direct3D 10.1에 대한 사소한 업데이트가 포함되어 다음과 같은 추가 하드웨어 기능이 노출되었습니다.

  • MSAA 샘플별 셰이더
  • MSAA 깊이 다시 읽기
  • 렌더링 대상당 독립 혼합 모드
  • 큐브 맵 배열
  • BC(블록 압축) 형식으로 렌더링

Direct3D 10.1 업데이트는 기존 인터페이스에서 파생된 다음과 같은 새 인터페이스에 대한 지원을 추가했습니다.

Direct3D 10.1 업데이트에는 다음과 같은 추가 구조도 포함되어 있습니다.

Direct3D 10.1 API에는 기능 수준이라는 새로운 개념이 포함되어 있습니다. 이 개념은 Direct3D 10.1 API를 사용하여 Direct3D 10.0(D3D10_FEATURE_LEVEL_10_0) 또는 Direct3D 10.1(D3D10_FEATURE_LEVEL_10_1) 하드웨어를 구동할 수 있음을 의미합니다. Direct3D 10.1 API는 Direct3D 10 인터페이스에서 파생되므로 애플리케이션은 Direct3D 10.1 디바이스를 만든 다음 새로운 10.1 특정 기능이 필요한 경우를 제외하고 Direct3D 10.0 디바이스로 사용할 수 있습니다(D3D10_FEATURE_LEVEL_10_1 기능 수준이 있고 이러한 기능을 지원하는 경우).

참고 항목

Direct3D 10.1 디바이스는 기존 10.0 HLSL 셰이더 프로필(vs_4_0, ps_4_0, gs_4_0) 및 새로운 10.1 프로필(vs_4_1, ps_4_1, gs_4_1)을 추가 HLSL 지침 및 기능과 함께 사용할 수 있습니다.

 

Windows 7에는 Direct3D 11 런타임에 포함된 Direct3D 10.1 API에 대한 사소한 업데이트가 포함되어 있습니다. 이 업데이트는 다음 기능 수준에 대한 지원을 추가합니다.

또한 Windows 7은 WARP(Windows Advanced Rasterization Platform)용 Direct3D 10.1에 대한 지원을 추가했습니다. D3D10_DRIVER_TYPE_WARP 사용하여 WARP 드라이버를 지정할 수 있습니다.

Direct3D 10.1에 대한 자세한 내용은 Direct3D 10.1 기능D3D10_FEATURE_LEVEL1 열거형을 참조하세요.

Direct3D 10 프로그래밍 가이드