2010-12-08 2 views
2

alt textzu Textur für Mini-Karte übertragen, DirextX

Ich versuche, eine Vogelperspektive von einer 3D-Umgebung auf eine Textur zu machen und diese Textur zu zeichnen, wie ein HUD eine Mini-Karte darzustellen, als ob es sich um eine Kamera war Blick von oben auf das Spiel. Ich bin ziemlich neu in der 3D-Programmierung und der DirextX-API, also brauche ich Hilfe dabei. Von der Arbeit mit einigen Beispielen und Tutorials ist das was ich habe aber immer noch kein Erfolg.

So ziemlich weiß ich nicht, wie man die Textur als HUD richtig auf den Bildschirm zeichnet. Was passiert, ist, dass die Engine die Methoden beginProjectScene() und endProjectScene() ausführt, gefolgt von der Methode beginSuperImpose().

beginProjectScene() erstellt eine Textur zum Zeichnen, erstellt die entsprechenden Ansichts- und Projektionsmatrizen und Backbuffer sowie ein neues Viewport und setzt sie nach dem Sichern der aktuellen. Außerdem werden die entsprechenden Renderziele festgelegt.

endProjectScene() stellt die gesicherten Matrizen, Ansichtsfenster und Hintergrundpuffer wieder her.

beginSuperImpose() soll die Textur (texH) auf den Bildschirm zeichnen.

Es gibt einige andere Methoden, die über das Anzeigegerät (d3dd) zu D3D-API-Methoden aufgerufen werden, um dies zu ermöglichen. Aber es scheint nicht zu funktionieren, tatsächlich passiert nichts und ich bin mir nicht sicher warum. Vor dem Wiederherstellen des Renderziels auf den gesicherten Zurückpuffer in endProjectScene() wurde der Bildschirm gerade schwarz (aus offensichtlichen Gründen). Ich glaube, dass es ein großes Problem ist, mit mehreren Bildfenstern zu arbeiten, und viele der Konzepte sind relativ neu und ich versuche immer noch, sie vollständig zu erfassen.

Auch wenn SetTexture (0, texH) Aufruf nach dem Zurücksetzen des Puffers erfolgt, werden meine weißen Kugeln blau.

I dieses Bit bezeichnet: http://www.two-kings.de/tutorials/dxgraphics/dxgraphics16.html

Hauptmotor Schleife:

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(); 

    .... 
} 

Anzeige:

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

Bitte etwas konkreter sein: genau welche Probleme haben Sie? Wird die Karte überhaupt nicht angezeigt? Wird es falsch gerendert?Wenn ja, wie sieht es aus? Wie sieht es aus? Ich fürchte, es ist nicht ganz vernünftig, Dutzende Codezeilen zu posten und zu erwarten, dass die Leute ein vage angegebenes Problem lösen. Vielen Dank. –

+0

Screenshots sind immer auch schön ... Sie helfen oft herauszufinden, was das Problem ist. – Goz

+0

Macht auch das Ausschalten von Z-Buffer im Super überhaupt Hilfe? – Goz

Antwort

0

Versuche zu ändern, 1 bis 255 in dem Aufruf zu ziehen. D3DCOLOR_RGBA nimmt Werte im Bereich von 0 bis 255. Ein Wert von 1 für Alpha ist nahezu transparent.

0

ändern

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

zu:

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

Und sehen, ob es macht. Dies sollte das Sprite mit der oberen linken Ecke anzeigen, die 3/4 des ay über den Bildschirm und 1/4 des Weges nach unten beginnt.

Ich vermute, dass Ihre Breitenberechnung es aus dem Bildschirm aussetzt. Der DirectX-Renderraum geht in x und y von -1 nach 1. Wenn Ihre Breite also 1024 beträgt, ergibt das Multiplizieren mit 0,01f einen Wert von 1,024, der sich auf der rechten Seite des Bildschirms befindet.

0

Sie sollten Ihre HUD zeichnen, nachdem Sie die Szene gezeichnet haben, andernfalls wird die Szene das HUD überlagern.