|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Kaiserludi Mini JLI'ler
Anmeldedatum: 22.07.2004 Beiträge: 27
Medaillen: Keine
|
Verfasst am: 18.08.2004, 14:13 Titel: Terrainprob |
|
|
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 |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 18.08.2004, 14:53 Titel: |
|
|
Was sagt die Debug Runtime? |
|
Nach oben |
|
|
Kaiserludi Mini JLI'ler
Anmeldedatum: 22.07.2004 Beiträge: 27
Medaillen: Keine
|
Verfasst am: 18.08.2004, 14:57 Titel: |
|
|
Sorry, aber "Debug Runtime" ? Ist das die Ausgabe, die ich bekomme, wenn ich in Visual C++ F5 drücke? |
|
Nach oben |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
|
Nach oben |
|
|
Kaiserludi Mini JLI'ler
Anmeldedatum: 22.07.2004 Beiträge: 27
Medaillen: Keine
|
Verfasst am: 18.08.2004, 19:08 Titel: |
|
|
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 |
|
|
Sören JLI Master Trainee
Anmeldedatum: 26.07.2002 Beiträge: 647 Wohnort: Bonn Medaillen: Keine
|
Verfasst am: 18.08.2004, 19:28 Titel: |
|
|
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 |
|
|
Kaiserludi Mini JLI'ler
Anmeldedatum: 22.07.2004 Beiträge: 27
Medaillen: Keine
|
Verfasst am: 18.08.2004, 19:54 Titel: |
|
|
Ne, hat noch nie gefunzt.
Skybox ist korrekt implementiert, die Dummieobjekte werden ja auch vor die Skybox gerendert! |
|
Nach oben |
|
|
Sören JLI Master Trainee
Anmeldedatum: 26.07.2002 Beiträge: 647 Wohnort: Bonn Medaillen: Keine
|
Verfasst am: 18.08.2004, 20:01 Titel: |
|
|
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 |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 18.08.2004, 20:20 Titel: |
|
|
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? |
|
Nach oben |
|
|
Kaiserludi Mini JLI'ler
Anmeldedatum: 22.07.2004 Beiträge: 27
Medaillen: Keine
|
Verfasst am: 18.08.2004, 20:22 Titel: |
|
|
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
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! |
|
Nach oben |
|
|
Kaiserludi Mini JLI'ler
Anmeldedatum: 22.07.2004 Beiträge: 27
Medaillen: Keine
|
Verfasst am: 19.08.2004, 22:00 Titel: |
|
|
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 |
|
Nach oben |
|
|
Sören JLI Master Trainee
Anmeldedatum: 26.07.2002 Beiträge: 647 Wohnort: Bonn Medaillen: Keine
|
Verfasst am: 20.08.2004, 12:46 Titel: |
|
|
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? |
Nun, ich nutze allerdings OpenGL und da ist nicht viel mit DebugRuntime. |
|
Nach oben |
|
|
|
|
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
|