rendu à la texture pour mini-carte, DirextX
Je suis en train de rendre une vue d'oeil d'oiseaux d'un environnement 3D à une texture et d'en tirer cette texture comme un HUD pour représenter une mini-carte comme si elle était une caméra regardant le jeu d'en haut. Je suis assez nouveau dans la programmation 3D et l'API DirextX donc j'ai besoin d'aide pour ça. De travailler avec des exemples et des tutoriels c'est ce que j'ai, mais toujours pas de succès.
À peu près je ne sais pas comment dessiner correctement la texture sur l'écran comme un HUD. Ce qui se passe est que le moteur exécute les méthodes beginProjectScene() et endProjectScene() suivies de la méthode beginSuperImpose(). BeginProjectScene() crée une texture sur laquelle dessiner, crée les matrices de vue et de projection appropriées et une mémoire tampon arrière ainsi qu'une nouvelle fenêtre et les définit après avoir sauvegardé celles en cours. Il définit également les cibles de rendu appropriées. EndProjectScene() restaure les matrices sauvegardées, la fenêtre d'affichage et le tampon arrière.
BeginSuperImpose() est supposé dessiner la texture (texH) à l'écran.
Il existe d'autres méthodes appelées via le périphérique d'affichage (d3dd) pour les méthodes de l'API D3D pour que cela se produise. Mais cela ne semble pas fonctionner, en fait rien ne se passe probablement et je ne sais pas pourquoi. Avant de restaurer la cible de rendu dans le tampon arrière sauvegardé dans endProjectScene(), l'écran était noir (pour des raisons évidentes). Je crois qu'une grande partie de mon problème est de travailler avec plusieurs fenêtres et une grande partie des concepts sont relativement nouveaux et j'essaie toujours de comprendre.
De même, lorsque l'appel de SetTexture (0, texH) est effectué après la restauration du tampon arrière, mes sphères blanches deviennent bleues.
je faisais référence à ce un peu: http://www.two-kings.de/tutorials/dxgraphics/dxgraphics16.html
boucle du moteur:
int Engine::run() {
....
// update the model components
design->update(rightNow);
Viewing->update(rightNow);
audio->update(rightNow);
lighting->update();
hud->update(rightNow);
//NEW CODE FOR HUD BEGIN
// create the projection here - this part is new
display->beginProjectScene();
// draw the opaque scene objects
scene->draw(true);
// then the translucent/transparent objects
display->alphaBlendOn();
scene->draw(false);
display->alphaBlendOff();
display->endProjectScene();
//NEW CODE FOR HUD END
// draw the scene
display->beginDraw();
// draw the opaque scene objects
scene->draw(true);
// then the translucent/transparent objects
display->alphaBlendOn();
scene->draw(false);
display->alphaBlendOff();
// draw the HUD
display->beginSuperimpose();
hud->draw();
display->endDraw();
....
}
Affichage:
void Display::beginProjectScene() {
// create the texture COM object on which to draw
// if the texture COM object does not yet exist
//
if (!texH && FAILED(D3DXCreateTexture(d3dd, TEXTURE_WIDTH,
TEXTURE_HEIGHT, 0, D3DUSAGE_RENDERTARGET | D3DUSAGE_AUTOGENMIPMAP,
D3DFMT_R5G6B5, D3DPOOL_DEFAULT, &texH)))
error(L"Projection::11 Failed to create projection texture");
// get the interface to the surface for the texture - GetSurfaceLevel
// increases the reference count by 1 so we will have
// to Release the interface when done
//
if (texH && SUCCEEDED(texH->GetSurfaceLevel(0, &textureSurface))) {
// build the view matrix
//
// define position, heading, and up direction of camera and
// create a view matrix and set the view transformationf
//TEMPORTY VALUES
Vector up(0,1,0);
Vector heading(0,0,0);
Vector position(0.5,1,0.5);
Vector view(1,0,0);
// the look at point from the virtual camera
Vector lookAt = position + heading;
Matrix viewH =
::view(view, position+heading, up);
// build the projection matrix
// ...TEST VALUES
Matrix projectionProjection =
::projection(FIELD_OF_VIEW, aspect, NEAR_CLIPPING,
FAR_CLIPPING);
// back up the projection matrix and the viewport, and back buffer
d3dd->GetTransform(D3DTS_PROJECTION, &projBak);
d3dd->GetViewport(&viewportBak);
d3dd->GetRenderTarget(0, &pBackBuffer);
// associate the backbuffer with the texture surface
d3dd->SetRenderTarget(0, textureSurface);
// project the scene onto the texture
d3dd->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
D3DCOLOR_ARGB(100, 100, 100, alpha), 1.0f, 0);
d3dd->BeginScene();
//d3dd->SetTexture(0, texH);
d3dd->SetTransform(D3DTS_VIEW, (D3DXMATRIX*)&viewH);
d3dd->SetTransform(D3DTS_PROJECTION, (D3DMATRIX*)&projectionProjection);
// define the viewport for the texture
D3DVIEWPORT9 viewport;
viewport.X = 0;
viewport.Y = 0;
viewport.Width = TEXTURE_WIDTH;
viewport.Height = TEXTURE_HEIGHT;
viewport.MinZ = 0.0f;
viewport.MaxZ = 1.0f;
d3dd->SetViewport(&viewport);
//d3dd->EndScene();
}
}
void Display::endProjectScene() {
d3dd->SetRenderTarget(0, pBackBuffer);
d3dd->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
D3DCOLOR_ARGB(100, 100, 100, alpha), 1.0f, 0);
//d3dd->BeginScene();
//d3dd->SetTexture(0, texH);
// restore the projection and viewport
d3dd->SetTransform(D3DTS_PROJECTION, &projBak);
d3dd->SetViewport(&viewportBak);
d3dd->EndScene();
// release the backbuffer associated with the texture
textureSurface->Release();
pBackBuffer->Release();
//texH->Release();
}
void Display::beginSuperimpose() {
// prepare to draw the hud
//
if (spriteManager_){
// start the sprite manager
spriteManager_->Begin(D3DXSPRITE_ALPHABLEND);
//NEW CODE FOR HUD
Vector topRight(width() * 0.01f, height() * 0.01f, 0);
spriteManager_->Draw(texH, NULL, NULL, (D3DXVECTOR3*)&topRight,
D3DCOLOR_RGBA(SPRITEH_R, SPRITEH_G, SPRITEH_B, 1));
}
}
S'il vous plaît être un peu plus précis: exactement quels problèmes avez-vous? La carte n'apparaît-elle pas du tout? Est-ce que le rendu est incorrect?Si oui, à quoi ressemble-t-il par rapport à quoi devrait-il ressembler? J'ai peur qu'il ne soit pas tout à fait raisonnable de simplement afficher des douzaines de lignes de code et de s'attendre à ce que les gens résolvent un problème vaguement énoncé. Merci. –
Les captures d'écran sont toujours aussi belles ... Elles aident souvent à comprendre le problème. – Goz
Éteint également Z-Buffer dans le super imposer de l'aide à tous? – Goz