Conversion en Direct3D 9
Les fonctionnalités suivantes ont été modifiées dans Microsoft Direct3D 9. Si vous utilisez ces fonctionnalités, consultez les modifications répertoriées ci-dessous pour vous aider à porter votre application vers Direct3D 9.
- Modifications de BaseVertexIndex
- CreateImageSurface Changes
- D3DENUM_NO_WHQL_LEVEL Modifications
- Créer des modifications de ressource
- Modifications d’EnumAdapterModes
- Obtenir/SetStreamSource_Changes
- Changements de qualité multi-échantillonnage
- Modifications de ResourceManagerDiscardBytes
- SetSoftwareVertexProcessing Changes
- Modifications de l’échantillonneur de texture
- Modifications de la déclaration de vertex
- Intervalles _and_SwapEffects_Changes
Modifications de BaseVertexIndex
Dans DirectX 8.x, IDirect3DDevice8::SetIndices nécessitait un pointeur vers la mémoire tampon d’index et un BaseVertexIndex pour la position de départ dans la mémoire tampon de vertex. Une application qui lotait différents objets dans la mémoire tampon de vertex devait basculer la mémoire tampon d’index (ou effectuer un appel à IDirect3DDevice8::SetIndices) avant d’appeler IDirect3DDevice8::D rawIndexedPrimitive.
Dans Direct3D 9, la position de départ dans la mémoire tampon de vertex, BaseVertexIndex, a été déplacée vers IDirect3DDevice9::D rawIndexedPrimitive, et son type de données est passé d’un DWORD à un INT.
HRESULT IDirect3DDevice9::DrawIndexedPrimitive(
D3DPRIMITIVETYPE PrimType,
INT BaseVertexIndex,
UINT minIndex,
UINT NumVertices,
UINT startIndex,
UINT primCount);
HRESULT SetIndices(IDirect3DIndexBuffer9* pIndexData);
CreateImageSurface Changes
IDirect3DDevice8::CreateImageSurface a été renommé CreateOffscreenPlainSurface. Un paramètre supplémentaire qui accepte un type D3DPOOL a été ajouté. D3DPOOL_SCRATCH retourne une surface qui a des caractéristiques identiques à une surface créée par IDirect3DDevice8::CreateImageSurface. D3DPOOL_DEFAULT est le pool approprié pour une utilisation avec StretchRect et ColorFill.
D3DENUM_NO_WHQL_LEVEL Modifications
Les applications doivent maintenant demander explicitement les laboratoires de qualité du matériel Microsoft Windows (WHQL), car la réponse prend relativement longtemps (quelques secondes). D3DENUM_NO_WHQL_LEVEL a été supprimé et D3DENUM_WHQL_LEVEL a été ajouté.
Créer des modifications de ressource
Un handle a été ajouté à plusieurs méthodes et doit être défini sur NULL. Les méthodes affectées sont les suivantes :
- CreateTexture
- CreateVolumeTexture
- CreateCubeTexture
- CreateVertexBuffer
- CreateIndexBuffer
- CreateRenderTarget
- CreateDepthStencilSurface
- CreateOffscreenPlainSurface
Modifications d’EnumAdapterModes
EnumAdapterModes prend désormais un D3DFORMAT.
HRESULT IDirect3D9::EnumAdapterModes(
UINT Adapter,
D3DFORMAT Format,
UINT Mode,
D3DDISPLAYMODE *pMode);
Le format prend en charge un ensemble étendu de modes d’affichage. Pour protéger les applications contre l’énumération de formats qui n’ont pas été inventés lors de la livraison de l’application, l’application doit indiquer à Direct3D le format des modes d’affichage à énumérer. Le tableau de modes d’affichage résultant diffère uniquement par la largeur, la hauteur et la fréquence d’actualisation.
L’application spécifie un format de pixel et l’énumération est limitée aux modes d’affichage qui correspondent exactement au format. Voici une liste des formats autorisés :
- D3DFMT_A1R5G5B5
- D3DFMT_A2B10G10R10
- D3DFMT_A8R8G8B8
- D3DFMT_R5G6B5
- D3DFMT_X1R5G5B5
- D3DFMT_X8R8G8B8
L’énumération est équivalente pour les versions alpha et nonalpha du même format. Le format retourné est toujours rempli avec le même format fourni par l’application.
Cette méthode traite les valeurs 565 et 555 comme équivalentes et retourne la version correcte au format. La différence n’entre en jeu que lorsque l’application verrouille la mémoire tampon d’arrière-plan et qu’il existe un indicateur explicite que l’application doit définir pour y parvenir.
Get/SetStreamSource Changes
Un paramètre a été ajouté aux méthodes GetStreamSource et SetStreamSource . Le décalage est le nombre d’octets entre le début du flux et le début des données de vertex. Elle est mesurée en octets. Cela permet au pipeline de prendre en charge les décalages de flux. Pour savoir si l’appareil prend en charge les décalages de flux, consultez D3DDEVCAPS2_STREAMOFFSET.
HRESULT GetStreamSource(
UINT StreamNumber,
IDirect3DVertexBuffer9 **ppStreamData,
UINT *pOffsetInBytes,
UINT *pStride);
Changements de qualité multi-échantillonnage
Auparavant, il n’y avait que l’énumération D3DMULTISAMPLE_TYPE. Direct3D 9 conserve cette énumération et ajoute l’idée d’un niveau de qualité pour chaque élément de l’énumération. Le niveau de qualité indique un compromis entre la qualité visuelle et les performances en indiquant le nombre d’échantillons masquables (dans le sens de D3DRS_MULTISAMPLEMASK).
Une application doit choisir le nombre d’échantillons masquables dont elle a besoin, puis consulter pQualityLevels. Si elle est différente de zéro, cette valeur indique le nombre de niveaux de qualité que l’application peut passer aux différentes fonctions de création via MultiSampleQuality. Étant donné que les pilotes exposent tous leurs schémas d’échantillonnage multiple en tant que niveaux de qualité à D3DMULTISAMPLE_NONMASKABLE, vous pouvez énumérer tous les schémas d’échantillonnage multiple disponibles via ce type si votre application n’a pas besoin de masquer des échantillons.
Le bit D3DPRASTERCAPS_STRETCHBLTMULTISAMPLE majuscules a été retiré. Ce bit signifie que la méthode d’échantillonnage multiple ne prend pas en charge les masques d’écriture et ne peut pas être activée ou désactivée entre BeginScene et EndScene. Ces méthodes non masquables sont désormais exposées via D3DMULTISAMPLE_NONMASKABLE.
HRESULT CheckDeviceMultiSampleType(
UINT Adapter,
D3DDEVTYPE DeviceType,
D3DFORMAT SurfaceFormat,
BOOL Windowed,
D3DMULTISAMPLE_TYPE MultiSampleType,
DWORD * pQualityLevels);
Il existe un maximum différent pour chaque nombre d’échantillons masquables. Par exemple, D3DMULTISAMPLE_4_SAMPLES peut avoir trois niveaux de qualité, tandis que D3DMULTISAMPLE_2_SAMPLES peut n’en avoir qu’un seul. Il existe au maximum huit niveaux de qualité pour chaque nombre d’échantillons masquables (le conducteur n’est pas autorisé à en exprimer davantage). La qualité va de zéro à (*pQualityLevels - 1).
Modifications de ResourceManagerDiscardBytes
ResourceManagerDiscardBytes a été remplacé par IDirect3DDevice9::EvictManagedResources. Il peut supprimer toutes les ressources, à la fois les ressources Direct3D et les ressources de pilote.
Le gestionnaire de ressources est désormais consulté lorsqu’une ressource (qu’elle soit gérée ou non managée) échoue à la création en raison d’une mémoire vidéo insuffisante. Le responsable est automatiquement invité à libérer suffisamment de ressources pour que la création réussisse. Dans DirectX 8.0, il ne s’agissait pas d’un processus automatisé.
SetSoftwareVertexProcessing Changes
Une application peut créer un appareil en mode mixte pour utiliser le traitement du vertex logiciel et matériel.
Pour basculer entre les deux modes de traitement de vertex dans DirectX 8.x, appelez IDirect3DDevice8::SetRenderState. Il a été remplacé par SetSoftwareVertexProcessing pour faciliter les problèmes causés par les blocs d’état. Cette nouvelle méthode n’est pas enregistrée par les blocs d’état.
Modifications de l’échantillonneur de texture
Direct3D 9 prend en charge jusqu’à seize surfaces de texture en une seule passe à l’aide du modèle de nuanceur de pixels 2_0 ; Toutefois, le nombre de coordonnées de texture reste limité à huit. L’état de l’étape de texture est associé aux surfaces, aux jeux de coordonnées, au traitement des vertex et aux pixels. Pour gérer ces différences au moment de la compilation, SetTextureStageState a été divisé en deux méthodes :
- IDirect3DDevice9::SetTextureStageState sera toujours utilisé pour l’état des coordonnées de texture, comme les modes d’habillage et la génération de coordonnées de texture.
- SetSamplerState a été ajouté et sera désormais utilisé pour le filtrage, le mosaïchage, le serrage, MIPLOD, etc. Cela fonctionnera pour jusqu’à seize échantillonneurs.
Modifications de SetTextureStageState
IDirect3DDevice9::SetTextureStageState définit désormais les états suivants :
Correction de l’état de traitement du vertex de la fonction. Cet état contrôle la manipulation des coordonnées de texture D3DTSS_TEXTURETRANSFORMFLAGS et D3DTSS_TEXCOORDINDEX. Jusqu’à huit de chaque peut être défini (car huit coordonnées de texture sont toujours prises en charge). D3DTSS_TEXCOORDINDEX est un état de traitement de vertex de fonction fixe. Si un nuanceur de vertex programmable est utilisé, cet état est ignoré.
Correction de l’état du nuanceur de pixels de fonction (textureStageState hérité).
- 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
Le nombre d’états de nuanceur de pixels de fonction fixes qui peuvent être définis est inférieur ou égal au nombre représenté par MaxTextureBlendStages.
Le nombre d’échantillonneurs de texture disponibles pour l’application est déterminé par la version du nuanceur de pixels, comme indiqué dans le tableau suivant.
Name | Nombre |
---|---|
ps_1_1 à ps_1_3 | 4 échantillonneurs de texture |
ps_1_4 | 6 échantillonneurs de texture |
ps_2_0 | 16 échantillonneurs de texture |
pipeline de fonction fixe | MaxTextureBlendStages/MaxSimultaneousTextures échantillonneurs de texture |
Les appareils qui prennent en charge le mappage de déplacement dans Direct3D 9 prendront en charge un échantillonneur supplémentaire (D3DDMAPSAMPLER), qui échantillonne les mappages de déplacement dans l’unité tessellatore.
SetSamplerState Changes
IDirect3DDevice9::SetSamplerState définit l’état de l’échantillonneur (y compris celui utilisé dans l’unité tessellator pour échantillonner les mappages de déplacement). Ils ont été renommés avec un préfixe D3DSAMP_ pour activer la détection d’erreur au moment de la compilation lors du portage à partir de DirectX 8.x. Les états sont les suivants :
- D3DSAMP_ADDRESSU
- D3DSAMP_ADDRESSV
- D3DSAMP_ADDRESSW
- D3DSAMP_BORDERCOLOR
- D3DSAMP_MAGFILTER
- D3DSAMP_MAXANISOTROPY
- D3DSAMP_MAXMIPLEVEL
- D3DSAMP_MINFILTER
- D3DSAMP_MIPFILTER
- D3DSAMP_MIPMAPLODBIAS
Modifications de la déclaration de vertex
Les déclarations de vertex sont désormais découplées de la création du nuanceur de vertex. Les déclarations de vertex utilisent désormais une interface COM (Component Object Model).
Pour DirectX 8.x, les déclarations de vertex sont liées à des nuanceurs de vertex.
- Pour le pipeline de fonction fixe, appelez SetVertexShader avec le code de format de vertex flexible (FVF) de la mémoire tampon de vertex.
- Pour les nuanceurs de vertex, appelez IDirect3DDevice9::SetVertexShader avec un handle à un nuanceur de vertex créé précédemment. Le nuanceur inclut une déclaration de vertex.
Pour Direct3D 9, les déclarations de vertex sont dissociées des nuanceurs de vertex et peuvent être utilisées avec le pipeline de fonction fixe ou avec des nuanceurs.
- Pour le pipeline de fonction fixe, il n’est pas nécessaire d’appeler IDirect3DDevice9::SetVertexShader. Toutefois, si vous souhaitez basculer vers le pipeline de fonction fixe et que vous avez déjà utilisé un nuanceur de vertex, appelez IDirect3DDevice9::SetVertexShader(NULL). Une fois cette opération effectuée, vous devez toujours appeler SetFVF pour déclarer le code FVF.
- Lorsque vous utilisez des nuanceurs de vertex, appelez IDirect3DDevice9::SetVertexShader avec l’objet de nuanceur de vertex. En outre, appelez IDirect3DDevice9::SetFVF pour configurer une déclaration de vertex. Cela utilise les informations implicites dans la FVF. SetVertexDeclaration peut être appelé à la place de IDirect3DDevice9::SetFVF, car il prend en charge les déclarations de vertex qui ne peuvent pas être exprimées avec une FVF.
Intervals et SwapEffects Changes
Plusieurs modifications ont été apportées pour donner à l’utilisateur un meilleur contrôle sur la fréquence d’actualisation du moniteur, la fréquence de présentation et le dessin de la mémoire tampon frontale par rapport au dessin de la mémoire tampon arrière. Les voici :
- Suppression d’un effet d’échange, d’un D3DSWAPEFFECT_COPY_VSYNC et d’un taux de présentation, D3DPRESENT_RATE_UNLIMITED.
- D3DPRESENT_PARAMETERS renommé. FullScreen_PresentationInterval à PresentationIntervals.
- Ajout D3DPRESENT_INTERVAL_IMMEDIATE, ce qui signifie que la présentation n’est pas synchronisée avec la synchronisation verticale. Comme dans DirectX 8.x, D3DPRESENT_INTERVAL_DEFAULT est défini sur zéro et équivaut à D3DPRESENT_INTERVAL_ONE. D3DPRESENT_INTERVAL_DEFAULT est pratique pour initialiser D3DPRESENT_PARAMETERS à zéro.
Pour obtenir une explication détaillée des modes et des intervalles pris en charge, consultez D3DPRESENT.
Rubriques connexes