Largeur et hauteur (Direct3D 9)
Bien que les termes largeur et hauteur soient souvent utilisés de manière informelle, ils ont des significations très importantes et distinctement différentes. Par conséquent, vous devez comprendre les significations de chacun et comment interpréter les valeurs que Direct3D utilise pour les décrire.
Direct3D utilise la structure D3DSURFACE_DESC pour transporter des informations décrivant une surface. Entre autres choses, cette structure est définie pour contenir des informations sur les dimensions d’une surface, ainsi que sur la façon dont ces dimensions sont représentées en mémoire. La structure utilise les membres Height et Width pour décrire les dimensions logiques de la surface. Les deux membres sont mesurés en pixels. Par conséquent, les valeurs Height et Width d’une surface de 640 x 480 sont les mêmes, qu’il s’agisse d’une surface 8 bits ou d’une surface RVB 24 bits.
Lorsque vous verrouillez une surface à l’aide de la méthode IDirect3DSurface9::LockRect , la méthode remplit une structure D3DLOCKED_RECT qui contient le pitch de la surface et un pointeur vers les bits verrouillés. La valeur dans le membre Pitch décrit le pas de mémoire de la surface, également appelé stride. Pitch est la distance, en octets, entre deux adresses mémoire qui représentent le début d’une ligne bitmap et le début de la ligne bitmap suivante. Étant donné que la hauteur est mesurée en octets plutôt qu’en pixels, une surface de 640 x 480 x 8 a une valeur d’inclinaison très différente d’une surface avec les mêmes dimensions, mais un format de pixel différent. En outre, la valeur d’pitch reflète parfois les octets que Direct3D a réservés en tant que cache. Il n’est donc pas prudent de supposer que pitch est simplement la largeur multipliée par le nombre d’octets par pixel. Au lieu de cela, visualisez la différence entre la largeur et la hauteur, comme illustré dans le diagramme suivant.
Dans ce diagramme, la mémoire tampon avant et la mémoire tampon arrière sont toutes deux de 640 x 480 x 8, et le cache est de 384 x 480 x 8.
Lorsque vous accédez directement à des surfaces, veillez à rester dans la mémoire allouée pour les dimensions de la surface et à rester en dehors de toute mémoire réservée au cache. En outre, lorsque vous verrouillez uniquement une partie d’une surface, vous devez rester dans le rectangle que vous spécifiez lors du verrouillage de la surface. Le fait de ne pas suivre ces instructions aura des résultats imprévisibles. Lors du rendu directement en mémoire de surface, utilisez toujours le pitch retourné par la méthode IDirect3DSurface9::LockRect . Ne supposez pas un pitch basé uniquement sur le mode d’affichage. Si votre application fonctionne sur certains adaptateurs d’affichage, mais qu’elle semble en panne sur d’autres, cela peut être à l’origine du problème.
Pour plus d’informations, consultez Accès direct à la mémoire Surface (Direct3D 9).
Rubriques connexes