Largura vs. passo (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, esta 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 de Altura e Largura 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 de D3DLOCKED_RECT que contém o passo da superfície e um ponteiro para os bits bloqueados. O valor no membro Pitch descreve o pitch de memória da superfície, também chamado de stride. Pitch é a distância, em bytes, entre dois endereços de memória que representam o início de uma linha de bitmap e o início da próxima linha de bitmap. Como o passo é medido em bytes em vez de pixels, uma superfície de 640x480x8 tem um valor de passo 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 cache, portanto, não é seguro assumir que pitch é apenas a largura multiplicada pelo número de bytes por pixel. Em vez disso, visualize a diferença entre largura e passo como mostrado no diagrama a seguir.
Neste diagrama, o buffer frontal e o buffer traseiro são ambos 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 estas orientações terá resultados imprevisíveis. Ao renderizar diretamente na memória de superfície, sempre use o passo retornado pelo método IDirect3DSurface9::LockRect. Não assuma um tom baseado apenas no modo de exibição. Se o seu aplicativo funciona em alguns adaptadores de vídeo, mas parece ilegível 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