 |
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 04.12.2007, 18:56 Titel: |
|
|
Hmm, hast du die Möglichkeit, dir ein Dreieck als X-File zu erstellen? Dann würde ich das mal laden (da brauchts ja nicht viel) und checken, was in den ganzen Puffern drin steht.
Der Attribute-Buffer dient glaube ich dazu, verschiedene Materialien verschiedenen Mesh-Teilen zuzuweisen. Du kannst ja Meshes auch irgendwie teilweise Rendern und allerlei lustiges damit anstellen
Die Fehlerüberprüfung zeigt überall grünes Licht?
Zuletzt könnte es auch noch am Rendercall liegen. Zeig vielleicht mal den Code. _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
 |
Otscho Super JLI'ler

Alter: 36 Anmeldedatum: 31.08.2006 Beiträge: 338 Wohnort: Gummibären-Gasse Medaillen: Keine
|
Verfasst am: 04.12.2007, 19:24 Titel: |
|
|
Also die Renderfunktion lautet wie folgt: CPP: | void CDefaultSphere::Render() {
HRESULT hr;
m_lpD3DDevice->SetRenderState(D3DRS_LIGHTING, TRUE);
m_lpD3DDevice->SetFVF(FVF_FORMAT);
m_lpD3DDevice->SetTransform(D3DTS_WORLD, &WorldMatrix);
hr = m_lpMesh->DrawSubset(0); // 0 ist nur ne Vermutung
if(hr != D3D_OK) m_lpLogBook->Error(L"ID3DXMesh::DrawSubset(0);", hr, 0 );
} |
Und der Aufruf der Funktion:
CPP: | m_lpD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, m_ClearColor, 1.0f, 0);
m_lpD3DDevice->BeginScene();
m_Light.Diffuse.r = 1.0f;
m_Light.Diffuse.g = 1.0f;
m_Light.Diffuse.b = 1.0f;
m_lpD3DDevice->SetLight(0, &m_Light);
DefaultSphereMesh.Render();
|
Naja in x-file speichern und dann wieder laden.
Njea...
Gibts da nix eleganteres ? |
|
Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 05.12.2007, 17:33 Titel: |
|
|
Otscho hat Folgendes geschrieben: | CPP: | hr = m_lpMesh->DrawSubset(0); // 0 ist nur ne Vermutung |
|
Das macht man normal in einer Schleife, aber daran wirds wohl nicht liegen. Falls dein Mesh mehrere Materialien/Subsets hat, kannst du dir deren Anzahl (falls du es aus einer Datei lädst) anzeigen lassen.
Dass du für das ganze ein X-File verwendest, muss ja nicht der Dauerzustand sein (und deshalb auch nicht elegant). Ich würde das nur mal mit einem sehr simplen Mesh versuchen, dann kannst du nämlich falls du dieses geladene Mesh erst mal auf den Bildschirm bekommst, fortschreiten und nachschauen, was in jedem einzelnen Buffer des Meshes steht. So kommst du wohl am schnellsten darauf, was sich bei einem geladenen Mesh (was in der Regel kein ungültiges Mesh sein sollte) von deinem on-the-flow erstellten unterscheidet.
Ich kann im Moment keinen offensichtlichen Fehler entdecken, ich vermute, es liegt wirklich daran, dass noch irgendein Parameter/Bufferinhalt fehlt. _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
 |
Otscho Super JLI'ler

Alter: 36 Anmeldedatum: 31.08.2006 Beiträge: 338 Wohnort: Gummibären-Gasse Medaillen: Keine
|
Verfasst am: 17.12.2007, 16:49 Titel: |
|
|
Ok ich hab jetzt mal ein mesh von ner x-file datei geladen und versuche jetzt nachträglich die verticies zu verändern. Genau gesagt skaliere ich nur das mesh:
CPP: | DWORD NumVerticies = m_lpMesh->GetNumVertices();
DWORD NumBytesPerVertex = m_lpMesh->GetNumBytesPerVertex();
BYTE* VertexBufferStart;
D3DXVECTOR3 vp;
m_lpMesh->LockVertexBuffer(0, reinterpret_cast<void**>(&VertexBufferStart));
// jeden Vertex durchfahren
for(int i = 0; i < NumBytesPerVertex; i++) {
// Vektor holen
memcpy(&vp, VertexBufferStart, sizeof(vp));
// Vektor skalieren
vp.x *= Size.x;
vp.y *= Size.y;
vp.z *= Size.z;
// Vektor in den Vertexbuffer kopieren
memcpy(VertexBufferStart, &vp, sizeof(vp));
// Zum nächsten array-eintrag springen
VertexBufferStart += NumBytesPerVertex;
}
m_lpMesh->UnlockVertexBuffer(); |
Size gibt hier dann quasi die Skalierung an.
Das funktioniert solange einwandfrei, solang Size.z = 1.0f und Size.x ein vielfaches von 2.0f ist. Size.y darf hingegen jeden Wert bekommen. Ansonsten kommt es zu einem schwerwiegenden Absturz.
Anscheinend hab ich dann irgendein Speicher verändert der das nicht will.
Diese umständlich Variante hab ich verwendet, da ich keine Ahnung hab, wie die Vertexstruktur eines meshes aussieht, das mit der D3DXLoadMeshFromXW(...) erstellt wurde.
Kennt jemand zufällig diese Struktur ? Oder weiß, wie man die herausfindet ? |
|
Nach oben |
|
 |
DirectXer Dark JLI'ler

Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 17.12.2007, 20:04 Titel: |
|
|
zum Absturz: Vllt hat das was mit den internen Referenzen auf die Vertices zu tun? Vllt können die Texturen dann nicht richtig gespannt werden... Hast du mal probiert mit dem Debugger zu prüfen, ob die kopierten Werte in vp auch wirklich den Mesh-Vertices entsprechen? Im Code kann ich nichts auffälliges entdecken. Im Grunde dürfte es dabei keine Probleme geben, wenn nicht in der Doc irgendwas besonderes dazu steht...
Gruß DXer |
|
Nach oben |
|
 |
Otscho Super JLI'ler

Alter: 36 Anmeldedatum: 31.08.2006 Beiträge: 338 Wohnort: Gummibären-Gasse Medaillen: Keine
|
Verfasst am: 18.12.2007, 13:19 Titel: |
|
|
Naja ich hab jetzt noch keine Texturen verwendet. Und komischer weiße funtzt es anscheinend beim Debuggen wunderbar. Ich finds halt dumm, dass ich die verticies auf eine so "bescheuerte" Art und Weiße verändern muss und nich die Struktur eines Meshes kenn.
Da hätt ich mal ne Frage: Wenn ihr ein eigenes 3D-Format verwendet, versucht ihr dann das in ein DX-Mesh zu schreiben oder verwendet ihr dann eigene Vertex- bzw. Indexbuffers ?
Gibt es bei dem DX-Mesh einen Vorteil, den man selber mit den Buffern nie hinbekommen könnte? Auch performenztechnisch gesehen ?
Wie machen das die Softwareschmieden ?
Sind DX-Meshs nur für Anfänger wirklich sinnvoll ?
PS. Alle Fragen sind unter dem Gesichtspunkt zu verstehen, dass man nicht vor hat, auf eine andere Bibiothek als DX umzusteigen. |
|
Nach oben |
|
 |
DirectXer Dark JLI'ler

Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 18.12.2007, 17:37 Titel: |
|
|
hmm du könntest dir das md2-file format (auch mal bei google schauen) von Quake II anschauen; das ist sehr leicht zu verstehen und umzusetzen. Das X-Format ist sicher auch nicht schlecht, du könntest auch dein eigenen X-Parser schreiben... Aber später ist es natürlich günstiger, ein binäres Format anstatt ein Textformat zu nehmen, z.B. wegen Größe und Effizienz
Gruß DXer |
|
Nach oben |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 18.12.2007, 18:22 Titel: |
|
|
md2 ist mir zu sehr beschränk, man merkt richtig das damals die Computer langsam und der Speicher teuer war.
Cal3d ist für animierte Charaktere ein Versuch wert. Für statische evtl. wavefront obj _________________ https://jonathank.de/games/ |
|
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
|