1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
|
// On passe la notre surface de rendu et on garde le Z-Buffer déja existant
pDevice->SetRenderTarget (pSurface, pZSurface);
// On efface le buffer d'affichage mais PAS le Z-Buffer (me demande pas pourquoi, sinon ça ne marche pas)
pDevice->Clear (0, NULL, D3DCLEAR_TARGET, 0xFF404040, 1.0f, 0);
// ------- Ici tu fais le rendu de ta scène 3D -------
// On rend maintenant notre quad
// On remet notre surface la surface d'affichage qui a était crée lors de la création du device
pDevice->SetRenderTarget (pRenderSurface, pZSurface);
// On va s'occuper de ton filtre ici, avant de préciser la texture à Direct3D en tout cas
D3DLOCKED_RECT lockRect;
// On lock notre surface de rendu
errorCode = pSurface->LockRect (&lockRect, NULL, 0);
if (!errorCode)
{
rdword pixel;
rdword color;
rdword *pPixel = (rdword*) lockRect.pBits;
// Normalement il faut prendre en compte lockRect.Pitch mais pas pour le format passé
// lockRect.Pitch représente le nombre d'octet par ligne de texture
for (pixel = 0; pixel < 256*256; pixel++)
*pPixel++ = (0xFF000000 & *pPixel) | (0x00FFFFFF & ~*pPixel); // Un bête filtre inverse qui conserve l'alpha
// On delock la surface
pSurface->UnlockRect ();
}
// On copie notre surface de rendu dans la surface du premier niveau de la texture
pDevice->CopyRects (pSurface, NULL, 0, pLevel0Surface, NULL);
// On efface le buffer d'affichage et le Z-Buffer
pDevice->Clear (0, NULL, D3DCLEAR_ZBUFFER, 0xFF808080, 1.0f, 0);
// On sauvegarde les matrices car on va tout mettre à l'identité pour pas s'embetter avec les transformations
CRMatrix pSavedMatrix[3];
pDevice->GetTransform (D3DTS_WORLD, (D3DMATRIX *) pSavedMatrix);
pDevice->GetTransform (D3DTS_VIEW, (D3DMATRIX *) pSavedMatrix+1);
pDevice->GetTransform (D3DTS_PROJECTION, (D3DMATRIX *) pSavedMatrix+2);
// On met toute les matrices à l'identité
CRMatrix id;
pDevice->SetTransform (D3DTS_WORLD, (D3DMATRIX *) &id);
pDevice->SetTransform (D3DTS_VIEW, (D3DMATRIX *) &id);
pDevice->SetTransform (D3DTS_PROJECTION, (D3DMATRIX *) &id);
// J'ai fait mon quad en CCW
pDevice->SetRenderState (D3DRS_CULLMODE, D3DCULL_CCW);
// C'est parti, on commence le rendu de notre quad
pDevice->BeginScene ();
// On précise notre le format de vertex pour l'affichage de notre quad
pDevice->SetVertexShader (D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1);
// Je vais utiliser un DrawPrimitiveUP, donc je ne passe pas de vertexBuffer et je demande de déssiner 2 triangles
pDevice->SetStreamSource (0, NULL, 2);
// Ah! Enfin je précise que j'utilise la texture ou j'ai rendu ma scène
pDevice->SetTexture (0, pTexture);
// On affiche notre quad, j'utilise DrawPrimitiveUP car j'étais trop fénéant pour crée un vertexBuffer
// Bien sûr pour avoir de bonne performance, il faudrait passer par un vertexBuffer et utiliser un strip
pDevice->DrawPrimitiveUP (D3DPT_TRIANGLELIST, 2, pVertexBuffer, 24);
// On a fini l'affichage du quad
pDevice->EndScene ();
// On restaure nos matrices, au cas ou on voudrait faire autre chose...
pDevice->SetTransform (D3DTS_WORLD, (D3DMATRIX *) pSavedMatrix);
pDevice->SetTransform (D3DTS_VIEW, (D3DMATRIX *) pSavedMatrix+1);
pDevice->SetTransform (D3DTS_PROJECTION, (D3DMATRIX *) pSavedMatrix+2);
// On revient en mode CW
pDevice->SetRenderState (D3DRS_CULLMODE, D3DCULL_CW);
// On flip histoire d'avoir notre affichage à l'écran
pDevice->Present (NULL, NULL, NULL, NULL); |
Partager