Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

1

11.03.2012, 18:32

CubeMap Reflexion

Hallo. Ich habe mal eine Frage: Die Engine von uns ist DirectX9.0c fähig. Da werden leider keine Geometrie Shader unterstützt. Ich dachte mir dann render ich alles 6 Mal und nehme die fertige Textur als Environment Map. Ist auch kein Problem. Jedoch merkt man schon Frame Einbußen (~25FPS). Jetzt ist meine frage wie man das sonst Realisieren soll? Ich Render ja nur ein Modell und paar Würfel. Wenn dann später große Objekte kommen dann habe ich ja ein Frame oder so. Ich habe schon einiges an Rendersachen raus genommen. Trotzdem immer noch 25 Frames. Also wie habt ihr dass gemacht?

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

11.03.2012, 18:48

Erst einmal solltest du dich fragen, ob du tatsächlich dynamische Environment maps brauchst.
Vielleicht reicht es ja auch, sie für bestimmte Stellen in deinem Level vorzuberechnen und dann immer zwischen den nächsten N Stück zu interpolieren.

Ansonsten hast du mehrere Möglichkeiten:
- Cube map nicht in jedem Frame neu berechnen, sondern nur alle paar Frames
- Nicht immer alle 6 Seiten neu berechnen, sondern jedes Mal nur eine Seite
- Auflösung und Details für die Cube map reduzieren
- Gar keine Cube map benutzen, sondern z.B. Dual Paraboloid Mapping, da musst du nur 2x rendern

Außerdem solltest du sicherstellen, dass die Cube map "früh genug" im Verlauf eines Frames gerendert wird, so dass ihre Berechnung schon fertig ist, wenn sie benötigt wird. Beispiel:

1. Cube map rendern
2. Alle Objekte in der Szene rendern, die keine Reflexionen brauchen
3. Reflektierende Objekte rendern (nun sollte Schritt 1 schon fertig sein)

1 und 2 können parallel ablaufen.
Denk dran, dass eine GPU immer etwas zu tun haben will, sonst leidet die Performance.
Lass sie niemals warten!

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

3

12.03.2012, 07:33

Danke. Jetzt habe ich noch eine Frage zu den Texturkoordinaten. Wenn ich einen Quader habe der reflektieren soll, ohne Environment Mapping wie sehen dann die texturkoordinatrn aus? Wenn ich das mit environment Mapping mache kommen komische Ergebnisse.

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

12.03.2012, 07:56

Wenn ich einen Quader habe der reflektieren soll, ohne Environment Mapping

Wie?
Ohne Env. Mapping keine Reflexion.

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

5

12.03.2012, 14:33

Wenn du wiklich bloß einen Quader hast, bietet sich auch Stencilspieglung an.
Da musste auch bloß 3 mal die Szene dafür rendern. (Mit speziellen Shader sogar nur 1 mal, wobei das komplizierter wird.)

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

6

13.03.2012, 21:05

So jetzt habe ich gerade mal einen Test gemacht. Im Bild ist das Gelb umrandete der "Spiegel" und das Rot umrandete das gespiegelte. Ich weiß nicht ob man es erkenne kann aber der "Spiegel" steht vor den Schwarzen Klumpen, also dürfte man nichts sehen! Da ist irgendwie Falschrum. Also das Bild müsste auf die Rückseite. Wenn man hinter einem Spiegel steht sieht man sich selbst auch nicht vorne :)
Code zum rendern in die CubeMap stimmt. Wenn ich sie in die Datei abspeichere habe ich die Szene komplett und richtig. Also muss es an den Texturkoordinaten liegen. Hier der Code zum rendern:

C-/C++-Quelltext

1
2
3
4
5
6
7
X3D.SetTexture(0,Refl.GetRenderedCubeMapTexture()); // Tetxur setzen
door->Texture[0] = Refl.GetRenderedCubeMapTexture(); // Tetxur setzen ein 2. Mal ja nur zum Testen
X3D->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR);
X3D->SetTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT3);
door->Render(/*g_pEffect*/);
X3D->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, 0);
X3D->SetTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE);

Hier der Code für die Berechnung der Kameramatrix/Viewmatrix zum rendern der CubeMap:

C-/C++-Quelltext

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
Matrix  DynamicReflection::GetCubeMapViewMatrix(int iFace, Vector3 ObjPos )
{
    Vector3 vLookatPt, vUpVec;

    switch(iFace)
    {
        case D3DCUBEMAP_FACE_POSITIVE_X:
            vLookatPt = Vector3(1.0f, 0.0f, 0.0f);
            vUpVec    = Vector3(0.0f, 1.0f, 0.0f);
            break;
        case D3DCUBEMAP_FACE_NEGATIVE_X:
            vLookatPt = Vector3(-1.0f, 0.0f, 0.0f);
            vUpVec    = Vector3( 0.0f, 1.0f, 0.0f);
            break;
        case D3DCUBEMAP_FACE_POSITIVE_Y:
            vLookatPt = Vector3(0.0f, 1.0f, 0.0f);
            vUpVec    = Vector3(0.0f, 0.0f,-1.0f);
            break;
        case D3DCUBEMAP_FACE_NEGATIVE_Y:
            vLookatPt = Vector3(0.0f,-1.0f, 0.0f);
            vUpVec    = Vector3(0.0f, 0.0f, 1.0f);
            break;
        case D3DCUBEMAP_FACE_POSITIVE_Z:
            vLookatPt = Vector3( 0.0f, 0.0f, 1.0f);
            vUpVec    = Vector3( 0.0f, 1.0f, 0.0f);
            break;
        case D3DCUBEMAP_FACE_NEGATIVE_Z:
            vLookatPt = Vector3(0.0f, 0.0f,-1.0f);
            vUpVec    = Vector3(0.0f, 1.0f, 0.0f);
            break;
    }

    return MatrixCamera(ObjPos ,
                        ObjPos + vLookatPt, // Mit CamPos oder ohne gibt das selbe Ergebnis
                        vUpVec);
}

Danke
»FSA« hat folgendes Bild angehängt:
  • Env Mapping.jpg

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »FSA« (13.03.2012, 21:32)


David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

7

13.03.2012, 21:29

Du hast das Bild vergessen!

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

8

13.03.2012, 21:32

Sorry :dash: :dash: Das ist mir jetzt aber Peinlich :D Wird sofort behoben...

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

9

13.03.2012, 22:31

Hmm, auf diesem Bild kann ich irgendwie nichts erkennen.
Deine Beschreibung hilft mir auch nicht sonderlich ;)

Ich hoffe, dir ist klar, dass eine Environment-Map immer davon ausgeht, dass die Umgebung "unendlich" weit weg ist.
Außerdem wird ja alles von einem einzigen Standpunkt aus gerendert.
Darum wirst du nie eine realistische Spiegelung erhalten können.
Wenn du wirklich nur vereinzelte planare spiegelnde Oberflächen haben möchtest, dann wäre die Stencil-Buffer-Technik besser.

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

10

14.03.2012, 15:05

Also auf dem Bild ist hinten Links das rot umrandete. Das ist der Stapel an Objekten. Vorne Links das gelb umrandete ist der Spiegel, also eigentlich ein Quader. In diesem Spiege sehe ich die Objekte(wieder rot umrandet) die hinter dem Quader/Spiegel sind. Also die Tetxur ist falschrum. Stell dir mal ein Spiegel vor der links vor dir steht und die Spigelende Seite von dir wegzeigt. Dann siehst du dich ja nicht selbst weil die Spiegelnde Seite von dir wegzeigt. Im 3D Programm sieht man aber was. Da ist ein Fehler. Aber warum das so ist, weiß ich nicht. Vllt muss ich die Rotationsmatrix noch mit der Viewmatrix für die CubeMap Multiplizieren ?( Ich hoffe, dass konnte man jetzt besser verstehen.
Danke und Sry für die Schreibfehler. Ist ein adere PC ohne Prüfung :rolleyes:

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

Werbeanzeige