2010-12-08 52 views
2

alt textrendu à 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)); 
} 
} 
+0

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. –

+0

Les captures d'écran sont toujours aussi belles ... Elles aident souvent à comprendre le problème. – Goz

+0

Éteint également Z-Buffer dans le super imposer de l'aide à tous? – Goz

Répondre

0

Essayez de changer, 1 à 255 dans l'appel à dessiner. D3DCOLOR_RGBA prend des valeurs comprises entre 0 et 255. Une valeur de 1 pour alpha est presque transparente.

0

changement

Vector topRight(width() * 0.01f, height() * 0.01f, 0); 

à:

Vector topRight(0.5f, 0.5f, 0); 

Et voir si elle rend. Cela devrait afficher le sprite avec le coin supérieur gauche commençant 3/4 de l'ay à travers l'écran et 1/4 de la route.

Je suppose que votre calcul de largeur le met hors écran. L'espace de rendu DirectX va de -1 à 1 en x et y. Donc, si votre largeur est de 1024, alors multiplier par 0.01f donnera une valeur de 1.024 qui est hors du côté droit de l'écran.

0

Vous devez dessiner votre HUD APRÈS avoir dessiné la scène, sinon la scène recouvrira la HUD.