Largura vs. Pitch (Direct3D 9)
Embora os termos largura e tom sejam frequentemente usados informalmente, eles têm significados muito importantes e distintamente diferentes. Como resultado, você deve entender os significados de cada um e como interpretar os valores que o Direct3D usa para descrevê-los.
O Direct3D usa a estrutura D3DSURFACE_DESC para transportar informações que descrevem uma superfície. Entre outras coisas, essa estrutura é definida para conter informações sobre as dimensões de uma superfície, bem como como essas dimensões são representadas na memória. A estrutura usa os membros Height e Width para descrever as dimensões lógicas da superfície. Ambos os membros são medidos em pixels. Portanto, os valores Height e Width para uma superfície de 640 x 480 são os mesmos, seja uma superfície de 8 bits ou uma superfície RGB de 24 bits.
Quando você bloqueia uma superfície usando o método IDirect3DSurface9::LockRect , o método preenche uma estrutura D3DLOCKED_RECT que contém o tom da superfície e um ponteiro para os bits bloqueados. O valor no membro Pitch descreve o tom de memória da superfície, também chamado de passo a passo. Pitch é a distância, em bytes, entre dois endereços de memória que representam o início de uma linha bitmap e o início da próxima linha de bitmap. Como o tom é medido em bytes em vez de pixels, uma superfície 640x480x8 tem um valor de tom muito diferente de uma superfície com as mesmas dimensões, mas um formato de pixel diferente. Além disso, o valor de pitch às vezes reflete bytes que o Direct3D reservou como um cache, portanto, não é seguro assumir que o tom é apenas a largura multiplicada pelo número de bytes por pixel. Em vez disso, visualize a diferença entre largura e tom, conforme mostrado no diagrama a seguir.
Neste diagrama, o buffer frontal e o buffer traseiro são 640x480x8 e o cache é 384x480x8.
Ao acessar superfícies diretamente, tome cuidado para permanecer dentro da memória alocada para as dimensões da superfície e ficar fora de qualquer memória reservada para cache. Além disso, ao bloquear apenas uma parte de uma superfície, você deve permanecer dentro do retângulo especificado ao bloquear a superfície. Não seguir essas diretrizes terá resultados imprevisíveis. Ao renderizar diretamente na memória da superfície, sempre use o pitch retornado pelo método IDirect3DSurface9::LockRect . Não suponha um pitch baseado apenas no modo de exibição. Se o aplicativo funcionar em alguns adaptadores de exibição, mas parecer confuso em outros, isso pode ser a causa do problema.
Para obter mais informações, consulte Acessando a memória do Surface diretamente (Direct3D 9).
Tópicos relacionados