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

bassdscho

Alter Hase

  • »bassdscho« ist der Autor dieses Themas

Beiträge: 1 056

Wohnort: Heuchlingen

Beruf: Student - Technische Informatik

  • Private Nachricht senden

1

22.01.2005, 11:41

Probleme mit DrawIndexedPrimitiveUP eine Skybox zu zeichnen

Hi,

ich brauche eine Skybox für meinen Weltraumshooter. Das Demo 11 von Kapitel 2 geht bei mir einwandfrei. Ich habe daher den Code der Skybox aus dem Beispiel übernommen und abgeändert das die Funktion mt der tbDirect3D von der TB Engine zusammen arbeitet. Leider kommt bei mir immer eine Fehlermeldung wenn ich das Game laufen lasse bei der DrawIndexedPrimitiveUP Funktion in diesem Codeabschnitt. Entdeckt jemand einen Fehler den ich übersehen habe??


Code für Skybox

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
37
38
39
40
41
42
43
    tbMatrix mWorld;

    // Zuerst zeichnen wir die Sky-Box. Zu Beginn muss das Vertexformat gesetzt werden.

    tbDirect3D::SetFVF(SKYBOX_FVF);
        TB_INFO("CGame::RenderSkybox wird ausgeführt");


    // Die Beleuchtung und Z-Buffering schalten wir ab.

    tbDirect3D::SetRS(D3DRS_LIGHTING, FALSE);
    tbDirect3D::SetRS(D3DRS_ZENABLE, FALSE);
    tbDirect3D::SetRS(D3DRS_ZWRITEENABLE, FALSE);
        TB_INFO("CGame::RenderSkybox wird ausgeführt");


    // In die erste Texturschicht setzen wir die Umgebungstextur. Die zweite Schicht ist leer.

    tbDirect3D::SetTexture(0, pSkyboxTexture);
    tbDirect3D::SetTexture(1, NULL);
    TB_INFO("CGame::RenderSkybox wird ausgeführt");

    // Nun erstellen wir eine Translationsmatrix, die dafür sorgt, dass sich die Kamera immer

    // genau in der Mitte der Sky-Box befindet.

    mWorld = tbMatrixTranslation(vCameraPos);
    tbDirect3D::SetTransform(D3DTS_WORLD, mWorld);
        TB_INFO("CGame::RenderSkybox wird ausgeführt");


    // Jetzt zeichnen wir die Sky-Box mit DrawIndexedPrimitiveUP.

    tbDirect3D::GetDevice()->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST, // Dreiecksliste

                                                             0,                     // Beginn bei 0

                                                             8,                     // Größter Index

                                                             12,                    // Anz. Dreiecke

                                                             usSkyboxIndex,         // Indizes

                                                             D3DFMT_INDEX16,        // 16 Bits

                                                             g_pGQ->aSkyboxVertex,  // Vertizes

                                                             sizeof(SkyboxFVF));        // Vertexgröße

        TB_INFO("CGame::RenderSkybox wird ausgeführt");


    // Die Einstellungen wieder zurücksetzen

    tbDirect3D::SetRS(D3DRS_LIGHTING, TRUE);
    tbDirect3D::SetRS(D3DRS_ZENABLE, TRUE);
    tbDirect3D::SetRS(D3DRS_ZWRITEENABLE, TRUE);
        TB_INFO("CGame::RenderSkybox wird ausgeführt");
Verlierer jammern immer von wegen ihr bestes!
Sieger gehen nach Hause und vögeln die Ballkönigin!

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

22.01.2005, 13:41

was für ein fehler tritt denn auf?

bassdscho

Alter Hase

  • »bassdscho« ist der Autor dieses Themas

Beiträge: 1 056

Wohnort: Heuchlingen

Beruf: Student - Technische Informatik

  • Private Nachricht senden

3

22.01.2005, 15:03

Wenn die DrawIndex.. Funktion aufgerufen wurde, bleibt das Programm stehen und der Debugger fragt mich ob ich das Programm unterbrechen will oder fortsetzen. Er sagt das es einen schweren fehler gab.
Verlierer jammern immer von wegen ihr bestes!
Sieger gehen nach Hause und vögeln die Ballkönigin!

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

22.01.2005, 15:10

hm...

ich sehe in obigem code nirgendwo einen aufruf von SetStreamSource() oder SetIndices().

kanns sein, dass du das vergessen hast!?

bassdscho

Alter Hase

  • »bassdscho« ist der Autor dieses Themas

Beiträge: 1 056

Wohnort: Heuchlingen

Beruf: Student - Technische Informatik

  • Private Nachricht senden

5

22.01.2005, 18:31

Ich hab jetzt herausgefunden das nicht die Draw Funktion mir Schwierigkeiten macht sondern das Setzen der ersten Textur.

Diese habe ich so in den Textur Pointer geladen

C-/C++-Quelltext

1
2
3
PDIRECT3DCUBETEXTURE9 pSkyboxTexture;

pSkyboxTexture = tbTextureManager::LoadCubeTexture("Data\\EnvMap.dds",D3DX_DEFAULT,1,D3DFMT_UNKNOWN,0,D3DPOOL_MANAGED,D3DX_FILTER_NONE, D3DX_DEFAULT,0);


So stand es auch im Beispielprogramm. Aber immer wenn das Programm diese Textur setzen will stürzt es ab.

Es stürzt auch ab wenn ich bei der Ladefunktion oben nur den ersten parameter mit dem Dateipfad angebe.



Ich weiß nicht was ich falsch mache!!
Verlierer jammern immer von wegen ihr bestes!
Sieger gehen nach Hause und vögeln die Ballkönigin!

6

22.01.2005, 21:01

naja in der ladefunktion von der textur sollte eigentlich auch ein zeiger auf die variable in der die textur gespeichert wird vorkommen...

vielleicht haste ja auch vergessen das vertex-format zu setzten aber poste am besten mal den ganzen kot :]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

22.01.2005, 23:03

vielleicht kann er die textur nicht laden!?

bassdscho

Alter Hase

  • »bassdscho« ist der Autor dieses Themas

Beiträge: 1 056

Wohnort: Heuchlingen

Beruf: Student - Technische Informatik

  • Private Nachricht senden

8

23.01.2005, 11:43

Das ist die RenderSkybox Funktion:

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
    TB_INFO("CGame::RenderSkybox wird ausgeführt");

    unsigned short          usSkyboxIndex[36];
    PDIRECT3DCUBETEXTURE9   pSkyboxTexture;
    tbMatrix                mWorld;

    TB_INFO("CGame::RenderSkybox Variablen initialisierung hat geklappt");

    // Texture für Skybox laden

    pSkyboxTexture = tbTextureManager::LoadCubeTexture("Data\\EnvMap.dds",D3DX_DEFAULT,1,D3DFMT_UNKNOWN,0,D3DPOOL_MANAGED,D3DX_FILTER_NONE, D3DX_DEFAULT,0);
    if(pSkyboxTexture == NULL) TB_ERROR("Fehler beim Laden von Data\\EnvMap.dds", TB_ERROR);
    
    TB_INFO("CGame::RenderSkybox Texturladen hat geklappt");

    // Skybox Positions- und Texturkoordinaten festlegen

    g_pGQ->aSkyboxVertex[0].vPosition = tbVector3(-1.0f, 1.0f, 1.0f);
    g_pGQ->aSkyboxVertex[1].vPosition = tbVector3(1.0f, 1.0f, 1.0f);
    g_pGQ->aSkyboxVertex[2].vPosition = tbVector3(1.0f, 1.0f, -1.0f);
    g_pGQ->aSkyboxVertex[3].vPosition = tbVector3(-1.0f, 1.0f, -1.0f);
    g_pGQ->aSkyboxVertex[4].vPosition = tbVector3(-1.0f, -1.0f, 1.0f);
    g_pGQ->aSkyboxVertex[5].vPosition = tbVector3(1.0f, -1.0f, 1.0f);
    g_pGQ->aSkyboxVertex[6].vPosition = tbVector3(1.0f, -1.0f, -1.0f);
    g_pGQ->aSkyboxVertex[7].vPosition = tbVector3(-1.0f, -1.0f, -1.0f);

    g_pGQ->aSkyboxVertex[0].vTexture = g_pGQ->aSkyboxVertex[0].vPosition;
    g_pGQ->aSkyboxVertex[1].vTexture = g_pGQ->aSkyboxVertex[1].vPosition;
    g_pGQ->aSkyboxVertex[2].vTexture = g_pGQ->aSkyboxVertex[2].vPosition;
    g_pGQ->aSkyboxVertex[3].vTexture = g_pGQ->aSkyboxVertex[3].vPosition;
    g_pGQ->aSkyboxVertex[4].vTexture = g_pGQ->aSkyboxVertex[4].vPosition;
    g_pGQ->aSkyboxVertex[5].vTexture = g_pGQ->aSkyboxVertex[5].vPosition;
    g_pGQ->aSkyboxVertex[6].vTexture = g_pGQ->aSkyboxVertex[6].vPosition;
    g_pGQ->aSkyboxVertex[7].vTexture = g_pGQ->aSkyboxVertex[7].vPosition;

    TB_INFO("CGame::RenderSkybox Texturkoord und Positionkoords wurden gefüllt");
    
    // Idizes der Skybok eintragen

    usSkyboxIndex[36]    =  7,3,0,  4,7,0,  // Vorderseite

                                    5,1,2,  6,5,2,  // Hinterseite

                                    4,0,1,  5,4,1,  // Linke Seite

                                    6,2,3,  7,6,3,  // Rechte Seite

                                    2,1,0,  3,2,0,  // Oberseite

                                    4,5,6,  7,4,6; // Unterseite


    TB_INFO("CGame::RenderSkybox Inizes wurden eingetragen");

    // Zuerst zeichnen wir die Sky-Box. Zu Beginn muss das Vertexformat gesetzt werden.

    tbDirect3D::SetFVF(SKYBOX_FVF);

    TB_INFO("CGame::RenderSkybox Setzen des Vertexformats hat geklappt");

    // Die Beleuchtung und Z-Buffering schalten wir ab.

    tbDirect3D::SetRS(D3DRS_LIGHTING, FALSE);
    tbDirect3D::SetRS(D3DRS_ZENABLE, FALSE);
    tbDirect3D::SetRS(D3DRS_ZWRITEENABLE, FALSE);

    TB_INFO("CGame::RenderSkybox Renderstates wurden gesetzt");

    // In die erste Texturschicht setzen wir die Umgebungstextur. Die zweite Schicht ist leer.

    tbDirect3D::SetTexture(0, pSkyboxTexture);

    TB_INFO("CGame::RenderSkybox Textur wurde gesetzt");

return TB_OK;


Fehlermeldung:

Zitat


Mcrosoft Visual C++ Runtime Libary

Buffer overrun detected!

Programm: "Mein Spiel"

A buffer overrun has been detected wich has corrupted the programm's internal state. The programm cannot safely continue execution and must now be terminated.

OK


Letzte Zeilen der Log datei

Zitat

INFO: CGame::RenderSkybox wird ausgeführt (Game.cpp, Zeile 369, Funktion CGame::RenderSkybox)
INFO: CGame::RenderSkybox Variablen initialisierung hat geklappt (Game.cpp, Zeile 375, Funktion CGame::RenderSkybox)
INFO: CGame::RenderSkybox Texturladen hat geklappt (Game.cpp, Zeile 381, Funktion CGame::RenderSkybox)
INFO: CGame::RenderSkybox Texturkoord und Positionkoords wurden gefüllt (Game.cpp, Zeile 402, Funktion CGame::RenderSkybox)
INFO: CGame::RenderSkybox Inizes wurden eingetragen (Game.cpp, Zeile 412, Funktion CGame::RenderSkybox)
INFO: CGame::RenderSkybox Setzen des Vertexformats hat geklappt (Game.cpp, Zeile 417, Funktion CGame::RenderSkybox)
INFO: CGame::RenderSkybox Renderstates wurden gesetzt (Game.cpp, Zeile 424, Funktion CGame::RenderSkybox)
INFO: CGame::RenderSkybox Textur wurde gesetzt (Game.cpp, Zeile 429, Funktion CGame::RenderSkybox)
Der Thread 'Win32 Thread' (0xdc0) hat mit Code 0 (0x0) geendet.
Der Thread 'Win32 Thread' (0x8f0) hat mit Code 0 (0x0) geendet.
Der Thread 'Win32 Thread' (0x8bc) hat mit Code 3 (0x3) geendet.
Der Thread 'Win32 Thread' (0xf48) hat mit Code 3 (0x3) geendet.
Der Thread 'Win32 Thread' (0x580) hat mit Code 3 (0x3) geendet.
WARNUNG: tbExit wurde nicht aufgerufen! Wird automatisch erledigt... (TriBase.cpp, Zeile 49, Funktion (Unbekannt))
INFO: TriBase-Engine wird heruntergefahren... (TriBase.cpp, Zeile 110, Funktion (Unbekannt))
WARNUNG: Direct3D wurde nicht heruntergefahren! Wird automatisch erledigt... (TriBase.cpp, Zeile 115, Funktion (Unbekannt))
INFO: Die Direct3D-Komponente wurde heruntergefahren. (tbDirect3D.cpp, Zeile 308, Funktion (Unbekannt))
WARNUNG: DirectInput wurde nicht heruntergefahren! Wird automatisch erledigt... (TriBase.cpp, Zeile 122, Funktion (Unbekannt))
INFO: Die DirectInput-Komponente wurde heruntergefahren. (tbDirectInput.cpp, Zeile 779, Funktion (Unbekannt))
WARNUNG: Texturen werden automatisch gelöscht! Bitte die Exit-Methode von tbTextureManager aufrufen! (TriBase.cpp, Zeile 136, Funktion (Unbekannt))
INFO: Der Texturmanager wurde heruntergefahren. (tbTextureManager.cpp, Zeile 57, Funktion (Unbekannt))
INFO: Alle Speicherbereiche freigegeben! (tbMemory.cpp, Zeile 116, Funktion (Unbekannt))
INFO: Herunterfahren abgeschlossen! (TriBase.cpp, Zeile 146, Funktion (Unbekannt))


Ich muss beim laden der Cube Textur schon die .dds Datei angeben oder? Ich hab die gleiche genommen die bei dem Beispiel vom Buch dabei war. Und das Beispiel Funktioniert ja bei mir.
Was genau ist ein Buffer overran nochmal??
Verlierer jammern immer von wegen ihr bestes!
Sieger gehen nach Hause und vögeln die Ballkönigin!

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

23.01.2005, 12:09

was is g_pGQ für ein ding?

sehe ich das richtig, dass du jedesmal beim rendern der skybox die textur neu lädst und die vertex und indexbuffer neu befüllst?

wenn ja, möchte ich darauf hinweisen, dass das wie fahren mit angezogener handbremse is ;)

bassdscho

Alter Hase

  • »bassdscho« ist der Autor dieses Themas

Beiträge: 1 056

Wohnort: Heuchlingen

Beruf: Student - Technische Informatik

  • Private Nachricht senden

10

23.01.2005, 13:18

g_pGQ ist ein Pointer auf die Klasse in der die Variable aSkyboxvertex deklariert ist.

Das ist mir klar das das nicht sehr effekiv ist. Ich hab nur jetzt alles mal in eine Funktion geschreiben das ich den Fehler besser suchen kann.

Weiß niemand warum da ein Buffer ovverrun stattfindet oder was das überhaupt bedeutet? Ich habe keine Ahnung warum das nicht funktionert.

Wie rendert ihr eure Skybox??
Verlierer jammern immer von wegen ihr bestes!
Sieger gehen nach Hause und vögeln die Ballkönigin!

Werbeanzeige