2017-10-09 7 views
0

J'ai quelques questions sur DirectX 11.DirectX11 - Textures et les changements dynamiques

Lorsque je crée la texture via CreateTexture2D et je précise l'utilisation DEFAULT je devrais pouvoir utiliser UpdateSubresource, non? A) La mise à jour de la mémoire doit-elle être dans le même format que la texture d'origine? Je veux dire quand je CreateTexture avec DDS DXT1, les données UpdateSubresource doivent être DDS DXT1 aussi?

b) Quand est-il possible de mettre à jour une ressource? Dans DX12, vous pouvez mettre à jour resoruce avant de terminer la liste des commandes. Sinon, rien ne se passe.

c) Je devrais mettre à jour chaque mip avec mise à jour où chaque index de sous-ressource est index * miplevels, non? Ou devrais-je utiliser map unmap à la place? Y at-il un bon exemple avec toutes les règles qui sont nécessaires pour une mise à jour réussie?

Répondre

1

Cette méthode la plus efficace pour charger une texture consiste à utiliser initData lorsque vous le créez. Vous pouvez le faire DEFAULT ou IMMUTABLE.

L'autre approche consiste à utiliser des textures DEFAULT et un ensemble plus petit de textures STAGING. Vous chargez vos données dans les textures STAGING via Map, puis copiez via CopyResource. Idéalement, vous réutilisez les textures STAGING (même taille, mips, format, etc.). UpdateSubresource fonctionne, mais n'est pas aussi efficace - il est le plus souvent utilisé pour les tampons constants.

Les textures dynamiques sont réellement réservées aux éléments que vous souhaitez mettre à jour à chaque image ou à chaque image. Selon le matériel, ils sont placés dans une mémoire légèrement moins efficace (pour le rendu) que le GPU et le CPU peuvent tous deux accéder.

Utilisez l'aide D3D11CalcSubresource défini dans d3d11.h pour comprendre la sous-ressource:

UINT D3D11CalcSubresource(UINT MipSlice, UINT ArraySlice, UINT MipLevels) 
{ 
    return MipSlice + ArraySlice * MipLevels; 
} 

Ceci est couvert sur MSDN dans le Guide de programmation :

How to: Initialize a Texture Programmatically
How to: Use dynamic resources

Voir aussi DDSTextureLoader et WICTextureLoader

Notez que vous pouvez obtenir un certain sens de l'inefficacité UpdateSubresource est en prenant un coup d'oeil à l'aide DirectX 12 qui implémente cette fonctionnalité here.

+0

J'étais en train de faire des tâches à projeter, où mon but était de remplacer toutes les textures par différentes dans l'application DX11 existante. J'ai donc dû utiliser différentes méthodes DirectX. – Schnappi

0

Alors que j'ai trouvé ma solution, y compris:

Si la texture est créée comme DYNAMIC vous ne pouvez pas Map si elle a plus d'un MIPS. (J'avais plus de mips dans mes textures donc je devais le faire autrement)

Donc je devais aller avec DEFAULT textures à la création. Puis UpdateSubresource et D3D11CalcSubresource dans la boucle pour où j'ai mis à jour tous les mips dans la texture. Donc dans mon cas avec des textures 2D multi mip-map simples: D3D11CalcSubresource(i, 0, totalMipsInTexture).J'ai réussi à mettre à jour les textures avant que le Present ait été appelé (méfiez-vous du multithreading).

Ma dernière recommandation: si vous avez du mal, activez le calque de débogage dans DirectX (lorsque vous créez un passage de périphérique). Cela vous dira ce que vous faites mal.