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 comprendre 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 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 Hauteur et Largeur d’une surface 640 x 480 sont identiques, 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 tangage de la surface et un pointeur vers les bits verrouillés. La valeur du membre Pitch décrit la hauteur de mémoire de la surface, également appelée stride. La hauteur 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 que en pixels, une surface de 640 x 480x8 a une valeur d’inclinaison très différente de celle d’une surface avec les mêmes dimensions mais un format de pixel différent. En outre, la valeur de tangage reflète parfois les octets que Direct3D a réservés en tant que cache, de sorte qu’il n’est pas sûr de supposer qu’il s’agit simplement de 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 à la fois 640x480x8 et le cache est de 384 x 480 x 8.
Lorsque vous accédez directement aux surfaces, veillez à rester dans la mémoire allouée pour les dimensions de la surface et à rester hors de toute mémoire réservée pour le 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 la hauteur retournée 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 est garbée sur d’autres, cela peut être la cause du problème.
Pour plus d’informations, consultez Accès direct à la mémoire Surface (Direct3D 9).
Rubriques connexes