Freigeben über


Konvertieren in Direct3D 9

Die folgenden Features wurden in Microsoft Direct3D 9 geändert. Wenn Sie diese Features verwenden, sehen Sie sich die unten aufgeführten Änderungen an, damit Sie Ihre Anwendung zu Direct3D 9 portieren können.

BaseVertexIndex-Änderungen

In DirectX 8.x erforderte IDirect3DDevice8::SetIndices einen Zeiger auf den Indexpuffer und einen BaseVertexIndex für die Startposition im Vertexpuffer. Eine Anwendung, die verschiedene Objekte in den Vertexpuffer batching, musste den Indexpuffer wechseln (oder IDirect3DDevice8::SetIndices aufrufen), bevor IDirect3DDevice8::D rawIndexedPrimitive aufgerufen wird.

In Direct3D 9 wurde die Anfangsposition im Vertexpuffer BaseVertexIndex in IDirect3DDevice9::D rawIndexedPrimitive verschoben, und der Datentyp wurde von einem DWORD in ein INT geändert.

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

HRESULT SetIndices(IDirect3DIndexBuffer9* pIndexData); 

CreateImageSurface-Änderungen

IDirect3DDevice8::CreateImageSurface wurde in CreateOffscreenPlainSurface umbenannt. Ein zusätzlicher Parameter, der einen D3DPOOL-Typ annimmt, wurde hinzugefügt. D3DPOOL_SCRATCH gibt eine Oberfläche zurück, die identische Eigenschaften wie eine Oberfläche aufweist, die von IDirect3DDevice8::CreateImageSurface erstellt wurde. D3DPOOL_DEFAULT ist der geeignete Pool für die Verwendung mit StretchRect und ColorFill.

D3DENUM_NO_WHQL_LEVEL Änderungen

Anwendungen müssen jetzt explizit nach den Microsoft Windows Hardware Quality Labs (WHQL) fragen, da die Antwort relativ lange dauert (einige Sekunden). D3DENUM_NO_WHQL_LEVEL wurde entfernt und D3DENUM_WHQL_LEVEL hinzugefügt.

Erstellen von Ressourcenänderungen

Ein Handle wurde mehreren Methoden hinzugefügt und sollte auf NULL festgelegt werden. Folgende Methoden sind betroffen:

EnumAdapterModes-Änderungen

EnumAdapterModes verwendet jetzt ein D3DFORMAT.

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

Das Format unterstützt einen erweiterten Satz von Anzeigemodi. Um Anwendungen vor dem Aufzählen von Formaten zu schützen, die beim Versand der Anwendung nicht erfunden wurden, muss die Anwendung Direct3D das Format für die Anzeigemodi mitteilen, die aufgezählt werden sollen. Das resultierende Array von Anzeigemodi unterscheidet sich nur nach Breite, Höhe und Aktualisierungsrate.

Die Anwendung gibt ein Pixelformat an, und die Enumeration ist auf die Anzeigemodi beschränkt, die genau dem Format entsprechen. Im Folgenden ist eine Liste der zulässigen Formate aufgeführt:

  • D3DFMT_A1R5G5B5
  • D3DFMT_A2B10G10R10
  • D3DFMT_A8R8G8B8
  • D3DFMT_R5G6B5
  • D3DFMT_X1R5G5B5
  • D3DFMT_X8R8G8B8

Enumeration ist äquivalent für Alpha- und Nichtalphaversionen desselben Formats. Das zurückgegebene Format wird immer mit demselben Format gefüllt, das von der Anwendung bereitgestellt wird.

Diese Methode behandelt 565 und 555 als gleichwertig und gibt die richtige Version im Format zurück. Der Unterschied kommt nur ins Spiel, wenn die Anwendung den Hintergrundpuffer sperrt und es ein explizites Flag gibt, das die Anwendung festlegen muss, um dies zu erreichen.

Get/SetStreamSource Changes

Ein Parameter wurde den Methoden GetStreamSource und SetStreamSource hinzugefügt. Der Offset ist die Anzahl der Bytes zwischen dem Anfang des Datenstroms und dem Anfang der Vertexdaten. Der entsprechende Wert wird in „Bytes“ angegeben. Dadurch kann die Pipeline Streamoffsets unterstützen. Informationen dazu, ob das Gerät Streamoffsets unterstützt, finden Sie unter D3DDEVCAPS2_STREAMOFFSET.

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

Änderungen an der Mehrfachsamplingqualität

Bisher gab es nur die D3DMULTISAMPLE_TYPE-Enumeration. Direct3D 9 behält diese Enumeration bei und fügt die Idee einer Qualitätsstufe für jedes Element der Enumeration hinzu. Das Qualitätsniveau gibt einen Kompromiss zwischen visueller Qualität und Leistung an, indem die Anzahl der maskierbaren Proben (im Sinne von D3DRS_MULTISAMPLEMASK) angegeben wird.

Eine Anwendung sollte auswählen, wie viele maskierbare Beispiele erforderlich sind, und dann pQualityLevels konsultieren. Wenn ungleich null, gibt dieser Wert die Anzahl der Qualitätsebenen an, die die Anwendung über MultiSampleQuality an die verschiedenen Erstellungsfunktionen übergeben kann. Da Treiber alle ihre Multisampleschemas als Qualitätsstufen auf D3DMULTISAMPLE_NONMASKABLE verfügbar machen, können Sie alle verfügbaren Multisamplingschemas über diesen einen Typ aufzählen, wenn Ihre Anwendung keine Beispiele maskieren muss.

Das D3DPRASTERCAPS_STRETCHBLTMULTISAMPLE-Caps-Bit wurde eingestellt. Dieses Bit bedeutete früher, dass die Multisamplingmethode keine Schreibmasken unterstützt und zwischen BeginScene und EndScene nicht ein- und ausgeschaltet werden konnte. Solche nichtmaskierbaren Methoden werden jetzt über D3DMULTISAMPLE_NONMASKABLE verfügbar gemacht.

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

Es gibt ein anderes Maximum für jede Anzahl von maskierbaren Stichproben. Beispielsweise können D3DMULTISAMPLE_4_SAMPLES drei Qualitätsstufen aufweisen, während D3DMULTISAMPLE_2_SAMPLES nur eine haben. Es gibt höchstens acht Qualitätsstufen für jede Anzahl von maskierbaren Proben (der Fahrer darf nicht mehr ausdrücken). Die Qualität reicht von null bis (*pQualityLevels - 1).

ResourceManagerDiscardBytes-Änderungen

ResourceManagerDiscardBytes wurde durch IDirect3DDevice9::EvictManagedResources ersetzt. Es können alle Ressourcen entfernt werden, sowohl Direct3D- als auch Treiberressourcen.

Der Ressourcen-Manager wird jetzt konsultiert, wenn die Erstellung einer Ressource (ob verwaltet oder nicht verwaltet) fehlschlägt, weil nicht genügend Videospeicher vorhanden ist. Der Manager wird automatisch aufgefordert, genügend Ressourcen freizugeben, damit die Erstellung erfolgreich ist. In DirectX 8.0 war dies kein automatisierter Prozess.

SetSoftwareVertexProcessing Changes

Eine Anwendung kann ein Gerät im gemischten Modus erstellen, um die Software- und Hardwarevertexverarbeitung zu verwenden.

Um zwischen den beiden Vertexverarbeitungsmodi in DirectX 8.x zu wechseln, rufen Sie IDirect3DDevice8::SetRenderState auf. Dies wurde durch SetSoftwareVertexProcessing ersetzt, um Probleme zu vereinfachen, die durch Zustandsblöcke verursacht werden. Diese neue Methode wird nicht von Zustandsblöcken aufgezeichnet.

Texture Sampler-Änderungen

Direct3D 9 unterstützt mithilfe des Pixelshaders 2_0-Modells bis zu sechzehn Texturoberflächen in einem Durchgang. Die Anzahl der Texturkoordinaten bleibt jedoch auf acht beschränkt. Der Zustand der Texturphase ist Oberflächen, Koordinatensätzen, Vertexverarbeitung und Pixelverarbeitung zugeordnet. Um diese Unterschiede zur Kompilierzeit zu verwalten, wurde SetTextureStageState in zwei Methoden unterteilt:

  • IDirect3DDevice9::SetTextureStageState wird weiterhin für den Texturkoordinatenzustand verwendet, z. B. für Wrap-Modi und Texturkoordinatengenerierung.
  • SetSamplerState wurde hinzugefügt und wird jetzt zum Filtern, Kacheln, Klemmen, MIPLOD usw. verwendet. Dies funktioniert für bis zu sechzehn Sampler.

SetTextureStageState Changes

IDirect3DDevice9::SetTextureStageState legt nun die folgenden Zustände fest:

  • Der Vertexverarbeitungszustand der Funktion wurde korrigiert. Dieser Zustand steuert die Bearbeitung von Texturkoordinaten D3DTSS_TEXTURETRANSFORMFLAGS und D3DTSS_TEXCOORDINDEX. Bis zu acht von jedem können festgelegt werden (da immer acht Texturkoordinaten unterstützt werden). D3DTSS_TEXCOORDINDEX ist ein fester Funktionsvertexverarbeitungszustand. Wenn ein programmierbarer Vertex-Shader verwendet wird, wird dieser Zustand ignoriert.

  • Der Shaderzustand des Funktionspixels wurde behoben (die Legacyversion TextureStageState).

    • D3DTSS_ALPHAARG0
    • D3DTSS_ALPHAARG1
    • D3DTSS_ALPHAARG2
    • D3DTSS_ALPHAOP
    • D3DTSS_BUMPENVLOFFSET
    • D3DTSS_BUMPENVLSCALE
    • D3DTSS_BUMPENVMAT00
    • D3DTSS_BUMPENVMAT01
    • D3DTSS_BUMPENVMAT10
    • D3DTSS_BUMPENVMAT11
    • D3DTSS_COLORARG0
    • D3DTSS_COLORARG1
    • D3DTSS_COLORARG2
    • D3DTSS_COLOROP
    • D3DTSS_RESULTARG

    Die Anzahl der festen Funktionspixel-Shaderzustände, die festgelegt werden können, ist kleiner oder gleich der Zahl, die von MaxTextureBlendStages dargestellt wird.

Die Anzahl der für die Anwendung verfügbaren Textur-Sampler wird durch die Pixel-Shaderversion bestimmt, wie in der folgenden Tabelle angegeben.

Name Number
ps_1_1 zu ps_1_3 4 Textur-Sampler
ps_1_4 6 Textur-Sampler
ps_2_0 16 Textursampler
Feste Funktionspipeline Textur-Sampler "MaxTextureBlendStages/MaxSimultaneousTextures"

 

Geräte, die die Verschiebungszuordnung in Direct3D 9 unterstützen, unterstützen einen zusätzlichen Sampler (D3DDMAPSAMPLER), der die Verschiebungszuordnungen in der Tessellatoreinheit abtastet.

SetSamplerState-Änderungen

IDirect3DDevice9::SetSamplerState legt den Samplerzustand fest (einschließlich des Zustands, der in der tessellator-Einheit zum Beispiel für Verschiebungszuordnungen verwendet wird). Diese wurden mit einem D3DSAMP_ Präfix umbenannt, um die Fehlererkennung während der Kompilierzeit beim Portieren von DirectX 8.x zu ermöglichen. Zu den Zuständen gehören:

  • D3DSAMP_ADDRESSU
  • D3DSAMP_ADDRESSV
  • D3DSAMP_ADDRESSW
  • D3DSAMP_BORDERCOLOR
  • D3DSAMP_MAGFILTER
  • D3DSAMP_MAXANISOTROPY
  • D3DSAMP_MAXMIPLEVEL
  • D3DSAMP_MINFILTER
  • D3DSAMP_MIPFILTER
  • D3DSAMP_MIPMAPLODBIAS

Vertexdeklarationsänderungen

Vertexdeklarationen werden jetzt von der Vertex-Shadererstellung entkoppelt. Vertexdeklarationen verwenden jetzt eine COM-Schnittstelle (Component Object Model).

Bei DirectX 8.x sind Vertexdeklarationen an Vertex-Shader gebunden.

  • Rufen Sie für die Feste Funktionspipeline SetVertexShader mit dem FVF-Code (Flexible Vertex Format) des Vertexpuffers auf.
  • Rufen Sie für Vertex-Shader IDirect3DDevice9::SetVertexShader mit einem Handle für einen zuvor erstellten Vertex-Shader auf. Der Shader enthält eine Vertexdeklaration.

Bei Direct3D 9 werden Vertexdeklarationen von Vertex-Shadern entkoppelt und können entweder mit der festen Funktionspipeline oder mit Shadern verwendet werden.

  • Für die feste Funktionspipeline ist es nicht erforderlich, IDirect3DDevice9::SetVertexShader aufzurufen. Wenn Sie jedoch zur festen Funktionspipeline wechseln möchten und zuvor einen Vertex-Shader verwendet haben, rufen Sie IDirect3DDevice9::SetVertexShader(NULL) auf. Wenn dies geschehen ist, müssen Sie weiterhin SetFVF aufrufen, um den FVF-Code zu deklarieren.
  • Rufen Sie bei Verwendung von Vertex-Shadern IDirect3DDevice9::SetVertexShader mit dem Vertex-Shaderobjekt auf. Rufen Sie außerdem IDirect3DDevice9::SetFVF auf, um eine Vertexdeklaration einzurichten. Dabei werden die im FVF impliziten Informationen verwendet. SetVertexDeclaration kann anstelle von IDirect3DDevice9::SetFVF aufgerufen werden, da vertex-Deklarationen unterstützt werden, die nicht mit einer FVF ausgedrückt werden können.

Intervalle und SwapEffects-Änderungen

Es wurden mehrere Änderungen vorgenommen, um dem Benutzer mehr Kontrolle über die Monitorwiederholrate, die Darstellungsrate und das Zeichnen des Frontpuffers im Vergleich zum Backpuffer zu geben. Dies sind:

  • Ein Tauscheffekt, D3DSWAPEFFECT_COPY_VSYNC und eine Präsentationsrate D3DPRESENT_RATE_UNLIMITED entfernt.
  • Umbenannt D3DPRESENT_PARAMETERS. FullScreen_PresentationInterval zu PresentationIntervals.
  • D3DPRESENT_INTERVAL_IMMEDIATE hinzugefügt, was bedeutet, dass die Präsentation nicht mit der vertikalen Synchronisierung synchronisiert wird. Wie in DirectX 8.x ist D3DPRESENT_INTERVAL_DEFAULT als Null definiert und entspricht D3DPRESENT_INTERVAL_ONE. D3DPRESENT_INTERVAL_DEFAULT ist ein Vorteil für die Initialisierung D3DPRESENT_PARAMETERS auf Null.

Eine ausführliche Erläuterung der unterstützten Modi und Intervalle finden Sie unter D3DPRESENT.

Direct3D 9-Grafiken