2010-08-31 3 views
1

Je souhaite pouvoir définir les pixels individuels du tampon arrière dans mon programme de manière efficace. C'est ce que j'appelle dans ma fonction de rendu:Définir des pixels individuels sur le tampon arrière

void render_frame(void) 
{ 
    d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 40, 100), 1.0f, 0); 

    d3ddev->BeginScene(); 

    d3ddev->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &surface); 
    D3DLOCKED_RECT locked; 
    surface->LockRect(&locked, NULL, 0); 
    *(BYTE*)locked.pBits=42; 
    surface->UnlockRect(); 
    surface->Release(); 

    d3ddev->EndScene(); 

    d3ddev->Present(NULL, NULL, NULL, NULL); 

} 

Cependant, il plante toujours. Si je commente la partie où j'attribue le premier octet à 42, il ne tombe pas en panne. Alors qu'est-ce que je fais mal, ne devrais-je pas être en mesure d'attribuer des valeurs à la mémoire tampon pointée par bPits depuis la surface est verrouillée? Nous venons de découvrir que locked.pBits est un pointeur nul.

Pourquoi LockRect a-t-il échoué?

Répondre

3

Afin de verrouiller le tampon de retour, vous devez spécifier un drapeau à la création de l'appareil:

D3DPRESENT_PARAMETERS d3dpp; 
(...) 
d3dpp.Flags = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER; 

Cependant, comme indiqué dans les spécifications Direct3D, cela pourrait sérieusement nuire aux performances. Vous devriez plutôt dessiner des triangles texturés.

+0

Merci. Cependant, connaissez-vous une raison pour laquelle cela nuirait à la performance? En dessinant des triangles texturés, j'imagine qu'il faudrait faire un peu de traitement, suivi de l'édition du tampon arrière, alors que ce que j'essaie de faire est de sauter la première étape et de l'éditer. Pourquoi cela serait-il moins efficace? – kaykun

+0

Cela nuit aux performances car la surface du tampon arrière doit être téléchargée du GPU vers la CPU, puis téléchargée à nouveau sur le GPU. Il va également rompre le streaming: une API graphique est conçue de telle sorte qu'elle permet d'émettre des commandes de rendu sans les exécuter directement pour augmenter les performances. – tibur

Questions connexes