PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probelm mit C++ und D3D


[Dirk]
2008-10-08, 01:19:12
Hallo, da ich bereits vor einigen Wochen mit der D3D Programmierung unter C++ angefangen habe, aber noch nicht viele Erfahrungen mit C bzw. C++ gemacht hatte, habe ich mich erst einmal ein wenig in verschiedene Bücher vertieft. Jetzt möchte ich erneut angefangen eine kleine 3D-Engine zu schreiben. Ich habe bereits D3D initialisiert, und versuche jetzt mit DrawPrimitiveUP ein Dreieck anzuzeigen. Wenn ich das FVF auf D3DFVF_NORMAL setze, wird mir auch ein weißes Dreieck angezeigt, wenn ich aber auf D3DFVF_DIFFUSE setzte ist es einfach nur schwarz. Warum??

evtl hilft das bischen Code:

struct SVERTEX
{
dlVECTOR3 vPosition; // Position des Vertex
DWORD dwColor; // Farbe des Vertex
};



g_TriangleVertex[0].vPosition = dlVECTOR3( 0.0f, 1.0f, 0.0f);
g_TriangleVertex[1].vPosition = dlVECTOR3( 1.0f,-1.0f, 0.0f);
g_TriangleVertex[2].vPosition = dlVECTOR3(-1.0f,-1.0f, 0.0f);
g_TriangleVertex[0].dwColor = dlCOLOR(1.0f, 0.0f, 0.0f);
g_TriangleVertex[1].dwColor = dlCOLOR(0.0f, 1.0f, 0.0f);
g_TriangleVertex[2].dwColor = dlCOLOR(0.0f, 0.0f, 1.0f);



if(FAILED(hResult = d3d.pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST, // Dreiecksliste
1, // 1 Dreieck
g_TriangleVertex, // Vertizes
sizeof(SVERTEX)))) // Vertexgröße
{
LogEngine.dlWriteToLog("ERROR: Fehler beim Zeichnen...");
return dl_ERROR_DIRECT3D;
}


Ich habe absolut keine Ahnung woran es liegen könnte. Ich habe die Farbwerte auch schon mit mit D3DCOLOR_XRGB(...) übergeben aber keine Änderung, immernoch ein schwarzes Dreieck...

rotalever
2008-10-08, 12:51:34
;6833491']
Ich habe absolut keine Ahnung woran es liegen könnte. Ich habe die Farbwerte auch schon mit mit D3DCOLOR_XRGB(...) übergeben aber keine Änderung, immernoch ein schwarzes Dreieck...
Ich habe zwar noch nie was mit D3D gemacht, aber könnte es sein, dass einfach keine Diffuse Lichtquelle da ist, und deshalb das Dreieck nicht leuchtet, also schwarz ist?

[Dirk]
2008-10-08, 13:28:50
Klingt zwar einleuchtend, da ich noch kein Material oder Lichtquellen gesetzt habe, allerdings ist auch noch


d3d.pD3DDevice->SetRenderState(D3DRS_LIGHTING, false);


Also sollte es doch gehen....

HajottV
2008-10-08, 14:49:57
Hallo,

ich hab gerade mal 10 Minuteb versucht, das nachzustellen. Bei mir klappt es aber. Könntest Du den kompletten Code mal posten?

Gruß

Jörg

[Dirk]
2008-10-08, 19:18:07
Ist alles ein bischen zerstückelt.... deswegen hab ich mal alles gepackt...
Wenn du dir das mal ansehen möchtest, wäre ich dir sehr dankbar :)

http://www.lange-dirk.com/downloads/3dcenter.rar

HajottV
2008-10-09, 11:25:29
;6835040']Ist alles ein bischen zerstückelt.... deswegen hab ich mal alles gepackt...
Wenn du dir das mal ansehen möchtest, wäre ich dir sehr dankbar :)

http://www.lange-dirk.com/downloads/3dcenter.rar

Moin! Hab den Code... und leider nur VC6 hier. Passt aber schon!

Gib mir noch ein paar Minuten. Ich glaube, ich weiß, was da schief geht!

Gruß

Jörg

HajottV
2008-10-09, 12:05:09
Moin!

Hier der Fix: :deal:


class dlVECTOR3 // Klasse, die Methoden zur Behandlung von 3dim Vektoren bereit stellt
{
public:
float x, y, z;
// D3DVECTOR vD3DVector; <-- das hier ist das Problem, das muss raus

// Konstruktoren
dlVECTOR3() {}
dlVECTOR3(const float f) : x(f), y(f), z(f) {}
dlVECTOR3(dlVECTOR3& v) : x(v.x), y(v.y), z(v.z) {}
dlVECTOR3(const float vx, const float vy, const float vz) : x(vx), y(vy), z(vz) {}

// Casting
// operator D3DVECTOR& () {return *(D3DVECTOR*) this;} <-- wenn, dann so, aber schön ist das nicht
// operator const D3DVECTOR& () const {return vD3DVector;} // raus, oder wie oben


Erklärung:

Das Problem liegt darin, daß Du in Deiner Vertex-Struktur SVERTEX die dlVECTOR3 Klasse (als vermeintlichen D3DVECTOR) benutzt.


struct SVERTEX
{
dlVECTOR3 vPosition; // Position des Vertex
DWORD dwColor; // Farbe des Vertex
};


Dein FVF sieht so aus: D3DFVF_XYZ | D3DFVF_DIFFUSE

D3D erwartet jetzt also:


float X
float Y
float Z
dword C


Deine Struktur sieht aber so aus:


float X <-- das hier sind Deine floats in dlVECTOR3
float Y
float Z
float X1 <-- huch! da ist ja noch der D3DVECTOR :eek:
float Y2
float Z3
dword C


Dadurch holt sich D3D den diffuse-Wert aus der X-Koordinate von der D3DVECTOR Struktur, die im Konstruktor mit 0 initialisiert wird (und hier ergibt der float Wert als int interpretiert die Farbe Schwarz).

Ich würde Dir empfehlen, die auf den von D3D bereitgestellten Datentypen zu rechnen und auf die linalg Klassen komplett zu verzichten. Dort wird ja nur etwas nachimplementiert, was Du eh schon hast. Außerdem machst Du damit Casts die zwar klappen, aber ziemlich unsauber sind. :nono:

So, jetzt muss ich aber mal wieder arbeiten.

Gruß

Jörg

[Dirk]
2008-10-09, 12:12:34
Ich danke dir vielmals. Super, dass du dir so viel Zeit genommen hast :)

Leider habe ich gerade keine Zeit, werde es heute Abend gleich mal testen...

dirk

[Dirk]
2008-10-13, 21:27:41
So... es funktioniert :) Konnte es leider nicht eeher testen, da ich krank war :(

Ich habe jetzt sämtliche Vektor und Matrizen Methoden entfernt. Wie sieht es eigentlich mit der Geschwindigkeit aus? Bringt es etwas, wenn man eigene mathematische Routinen schreibt?

Wie sieht es mit 2D Vektoren aus gibt es neben D3DVECTOR auch eine Klasse D3DVECTOR2D o.ä. ??

dirk

HajottV
2008-10-14, 09:53:05
Prima, freut mich, helfen zu können!

Gerade bei solchen Sachen ist man schnell "betriebsblind" und verbrät da eine Menge Zeit, bis man den Fehler findet. Wenn man da unbelastet rangeht, findet man den Fehler u.U. viel schneller. Bei meiner 3d-Engine hab ich auch stundenlang nach Fehlern gesucht, bei denen man sich nachher an den Kopf fasst und denkt: "Oh weia!".

Die Routinen in den d3dx Bibliotheken sind SSE optimiert (und das ziemlich gut). Das sollte überhaupt kein Problem sein.

Es gibt D3DXVECTOR2, D3DXVECTOR3 (und D3DXVECTOR4) - überladen für +, -, usw. - ist also alles da, was man braucht.

Gruß

Jörg