JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=f505d531e53bccafe6b4f20680dbc354Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Terrainprob

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Kaiserludi
Mini JLI'ler



Anmeldedatum: 22.07.2004
Beiträge: 27

Medaillen: Keine

BeitragVerfasst am: 18.08.2004, 14:13    Titel: Terrainprob Antworten mit Zitat

Also ich habe ein ganz ähnliches Terrain wie im Buch, bzw. ich sollte sowas haben, aber das Prob ist, es wird nichts gerendert, also kein Terrain, der Rest (Skybox und Testobjekte) wird gerendert! Natürlich werden die Createfunktionen auch aufgerufen, aber irgendwie bringen sie kein sichtbares Ergebnis!

Hier mal der Code:

Code:

// Ludi Visions 3D Engine   Terrain.h

// Includes /////////////////////////////////////////////////////////////////

#ifndef Direct3D_h
   #define Direct3D_h
   #include "Direct3D.h"   // Direct3D
#endif

// Definitionen /////////////////////////////////////////////////////////////

#define TERRAINVERTEX (D3DFVF_XYZ | D3DFVF_DIFFUSE)

// Strukturen ///////////////////////////////////////////////////////////////

struct TerrainVertex
{
   float x, y, z;
   D3DCOLOR Color;
};

// Klassen //////////////////////////////////////////////////////////////////

class TERRAIN
{
public:
   void Create(void);
   void Render(void);
   ~TERRAIN();

private:
   LPDIRECT3DVERTEXBUFFER9 VB_Terrain;
   LPDIRECT3DINDEXBUFFER9 IB_Terrain;

   int vx;
   int vy;
};


Code:

// Ludi Visions 3D Engine   Terrain.cpp

// Includes /////////////////////////////////////////////////////////////////

#include "Terrain.h"

// Externes /////////////////////////////////////////////////////////////////

extern DIRECT3D Direct3D;

// Funktionen ///////////////////////////////////////////////////////////////

void TERRAIN::Create(void)
{
   // Anzahl Vertices
   vx = 65;
   vy = 65;

   // Vertex und Index Buffer anlegen
   Direct3D.lpD3DDevice->CreateVertexBuffer(vx*vy * sizeof(TerrainVertex),
                              0, TERRAINVERTEX,
                              D3DPOOL_DEFAULT, &VB_Terrain, 0);

   Direct3D.lpD3DDevice->CreateIndexBuffer(64*64*2*3 * 4, 0,
                              D3DFMT_INDEX32, D3DPOOL_DEFAULT,
                              &IB_Terrain, 0);

   TerrainVertex *V = new TerrainVertex[vx*vy];

   for(int zaehler_y=0; zaehler_y<vy; zaehler_y++)
   {
      for(int zaehler_x=0; zaehler_x<vx; zaehler_x++)
      {
         V[zaehler_x + vx*zaehler_y].x = (float)zaehler_x;
         V[zaehler_x + vx*zaehler_y].y = (float)((GetTickCount()+rand())%4);
         V[zaehler_x + vx*zaehler_y].z = (float)(vy-zaehler_y);
         V[zaehler_x + vx*zaehler_y].Color = D3DCOLOR_XRGB(255, 255, 255);
      }
   }

   unsigned int *I = new unsigned int[64*64*2*3];
   int zaehler = 0;

   for(zaehler_y=0; zaehler_y<vy-1; zaehler_y++)
   {
      for(int zaehler_x=0; zaehler_x<vx-1; zaehler_x++)
      {
         I[zaehler++] = vx*(zaehler_y+1) + zaehler_x;
         I[zaehler++] = vx*zaehler_y     + zaehler_x;
         I[zaehler++] = vx*(zaehler_y+1) + zaehler_x + 1;
         I[zaehler++] = vx*zaehler_y     + zaehler_x;
         I[zaehler++] = vx*zaehler_y     + zaehler_x + 1;
         I[zaehler++] = vx*(zaehler_y+1) + zaehler_x + 1;
      }
   }

   // Zeiger, der auf den Vertex Buffer gesetzt wird   
   BYTE* VertexBufferStart;

   // Vertex Buffer sperren
   VB_Terrain->Lock(0, 0, (void**)&VertexBufferStart, 0);

   // Vertices des Würfels in den Puffer kopieren
   memcpy(VertexBufferStart, V, sizeof(V));

   // Vertex Buffer wieder freigeben
   VB_Terrain->Unlock();



   // Zeiger, der auf den Vertex Buffer gesetzt wird   
   BYTE* IndexBufferStart;

   // Vertex Buffer sperren
   IB_Terrain->Lock(0, 0, (void**)&IndexBufferStart, 0);

   // Vertices des Würfels in den Puffer kopieren
   memcpy(IndexBufferStart, I, sizeof(I));

   // Vertex Buffer wieder freigeben
   IB_Terrain->Unlock();


   // Speicher freigeben
    delete[] V;
    delete[] I;
}

void TERRAIN::Render(void)
{
   // Vertex-Format setzen
   Direct3D.lpD3DDevice->SetFVF(TERRAINVERTEX);

   // Vertex Buffer angeben
   Direct3D.lpD3DDevice->SetStreamSource(0, VB_Terrain, 0,
                                 sizeof(TerrainVertex));
   
   // Index Buffer angeben
   Direct3D.lpD3DDevice->SetIndices(IB_Terrain);
   
   // Terrain rendern
   Direct3D.lpD3DDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0,
                                    vy * vx, 0,
                                    (vx-1)*(vy-1) * 2);
}

TERRAIN::~TERRAIN()
{
   // Vertexbuffer freigeben
   if(NULL != VB_Terrain)
   {
      VB_Terrain->Release();
      VB_Terrain = NULL;
   }

   // Indexbuffer freigeben
   if(NULL != IB_Terrain)
   {
      IB_Terrain->Release();
      IB_Terrain = NULL;
   }
}


Ich hoffe, ihr könnt mir sagen, wo der Fehler liegt, danke schon mal im Vorraus!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 18.08.2004, 14:53    Titel: Antworten mit Zitat

Was sagt die Debug Runtime?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Kaiserludi
Mini JLI'ler



Anmeldedatum: 22.07.2004
Beiträge: 27

Medaillen: Keine

BeitragVerfasst am: 18.08.2004, 14:57    Titel: Antworten mit Zitat

Sorry, aber "Debug Runtime" ? Ist das die Ausgabe, die ich bekomme, wenn ich in Visual C++ F5 drücke?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 18.08.2004, 15:32    Titel: Antworten mit Zitat

FAQ: http://www.jliforum.de/board/viewtopic.php?t=2326
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Kaiserludi
Mini JLI'ler



Anmeldedatum: 22.07.2004
Beiträge: 27

Medaillen: Keine

BeitragVerfasst am: 18.08.2004, 19:08    Titel: Antworten mit Zitat

Hmm, die habe ich aktiviert, aber es wird ja alles fehlerfrei kompiliert, sonst könte ich ja nciht sehen, dass nichts zu sehen ist!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sören
JLI Master Trainee



Anmeldedatum: 26.07.2002
Beiträge: 647
Wohnort: Bonn
Medaillen: Keine

BeitragVerfasst am: 18.08.2004, 19:28    Titel: Antworten mit Zitat

backface culling etc. mal ausgestellt? hats denn mal gefunzt?
ansonsten renderste die skybox auch ohne z-buffer? nicht dass die dein terrain verdeckt.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Kaiserludi
Mini JLI'ler



Anmeldedatum: 22.07.2004
Beiträge: 27

Medaillen: Keine

BeitragVerfasst am: 18.08.2004, 19:54    Titel: Antworten mit Zitat

Ne, hat noch nie gefunzt.
Skybox ist korrekt implementiert, die Dummieobjekte werden ja auch vor die Skybox gerendert!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sören
JLI Master Trainee



Anmeldedatum: 26.07.2002
Beiträge: 647
Wohnort: Bonn
Medaillen: Keine

BeitragVerfasst am: 18.08.2004, 20:01    Titel: Antworten mit Zitat

Ich würd mal die Rückgabe Werte der DX Funktionen beim Initialisieren und beim Rendern überprüfen. Sollte man sowieso machen, ist auf dem ersten Blick zwar ein größerer Umstand, aber es lohnt in jedem Fall, weil man so schnell und sicher Fehlerquellen ausschließen kann. Ich hab den Code zwar nicht komplett durchgesehen, aber ansonsten würde ich die Schleifen die die Vertices mal draussenlassen und stattdessen einfach mal ein dreieck in den vb schreiben und rendern, wenn das funzt weisste ja dann wo der fehler liegt etc.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 18.08.2004, 20:20    Titel: Antworten mit Zitat

Um sich das mit den Rückgabewerten zu sparen kann man einfach einen Blick in den Ausgabebereich von Visual C++ werfen, wenn man die Debug Runtime aktiviert hat - wenn die Funktion etwas anderes als S_OK (oder einen anderen Erfolgscode zurückgibt), wird eine genaue Beschreibung ausgegeben.

Ist irgendwas an der Debug Runtime, dass die Leute nicht leiden können und sie deshalb nicht benutzen oder dient das dazu mich wahnsinnig zu machen? Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Kaiserludi
Mini JLI'ler



Anmeldedatum: 22.07.2004
Beiträge: 27

Medaillen: Keine

BeitragVerfasst am: 18.08.2004, 20:22    Titel: Antworten mit Zitat

Also ich habe jetzt mal testweise den hier gezeigeten Code durch die gleichnamigen Dateien in Christians 1. Terrainbeispiel aus dem Buchquellcode ersetzt (selten habe ich die OOP so geschätzt wie eben, innerhalb von 2min liefs [aber typisch DX, 3 unaufgelöste externe Verweise, nichts geändert, nur nochmal Rebuild All und plötzlich meckert der Compiler net mehr ^^ ]).
Das Terrain zeigt er an, es liegt also auf jeden Fall schonmal an dem Terraincode selbst!
Werde dann wohl morgennachmittag Schritt für Schritt den Code von Christian an meinen Terraincode anpassen, dann sehe ich ja, ab welcher Stelle er nicht mehr mitspielt Rolling Eyes

PS @ Christian: Das letztere natürlich, was hast du denn gedacht? Wir wollen alle, dass du verrückt wirst und dann das 3. Buch in einem Anfall von geistiger Umnachtung gratis unter die Leute bringst! Very Happy Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Kaiserludi
Mini JLI'ler



Anmeldedatum: 22.07.2004
Beiträge: 27

Medaillen: Keine

BeitragVerfasst am: 19.08.2004, 22:00    Titel: Antworten mit Zitat

OK, ich habe den Fehler gefunden! Es lag an den beiden Zeilen:
Code:

memcpy(VertexBufferStart, V, sizeof(V));
memcpy(IndexBufferStart, I, sizeof(I));

Dummerweise sind V und I dynamisch angelegte Arrays, ich bekomme mit sizeof also nur die Größe des Pointers und nciht des ganzen Arrays zurückgeliefert, demzufolge kopiert memcpy natürlich auch so gut wie garnichts und der Inhalt der Buffer ist auch nicht sichtbar :rolleyes: Ich liebe diese Pointer Evil or Very Mad
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sören
JLI Master Trainee



Anmeldedatum: 26.07.2002
Beiträge: 647
Wohnort: Bonn
Medaillen: Keine

BeitragVerfasst am: 20.08.2004, 12:46    Titel: Antworten mit Zitat

Christian Rousselle hat Folgendes geschrieben:
Um sich das mit den Rückgabewerten zu sparen kann man einfach einen Blick in den Ausgabebereich von Visual C++ werfen, wenn man die Debug Runtime aktiviert hat - wenn die Funktion etwas anderes als S_OK (oder einen anderen Erfolgscode zurückgibt), wird eine genaue Beschreibung ausgegeben.

Ist irgendwas an der Debug Runtime, dass die Leute nicht leiden können und sie deshalb nicht benutzen oder dient das dazu mich wahnsinnig zu machen? Wink

Nun, ich nutze allerdings OpenGL und da ist nicht viel mit DebugRuntime. Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum