zu 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));
}
}
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. –
Screenshots sind immer auch schön ... Sie helfen oft herauszufinden, was das Problem ist. – Goz
Macht auch das Ausschalten von Z-Buffer im Super überhaupt Hilfe? – Goz