Seite 1 von 1

Nur Structs als Vertex Datenbasis für D3D?

Verfasst: 30.09.2010, 18:42
von Hellhound
Hallo zusammen,

ich arbeite mich grade in DirectX 9,10 und 11 ein um neben OpenGL auch DirectX supporten zu können. Soweit so gut. Basis läuft auch schon mal, d.h. Fenster und Device kann ich problemlos aufbauen. Nun bin ich dabei mir die VertexBuffer Geschichte anzuschauen. Ich habe gesehen, dass ich den VertexBuffer mit einer VertexDescription dazu bringen kann unterschiedliche Daten anzunehmen.

In allen Tutorials die mir vorliegen wird hier auf Structs als Datentyp für einen Vertex zurückgegriffen. Folge ich den Tutorials klappt auch alles fein und ich kann ein einfaches Dreieck rendern. Nun die Frage, kann ich auch Klassen anstelle von Structs verwenden (hab nämlich davon schon ne saubere Vertex Klassen Implementation vergleichbar mit der aus Assimp)? Irgendwie bekomme ich keinen Renderoutput wenn ich aus dem Struct eine Klasse mache und jedes mal die Daten aus der Klasse in ein Struct zu konvertieren finde ich unschön ...

Hier mal mein einfacher Testvertex:

Code: Alles auswählen

class Vertex
{
public:
   Vertex(float x, float y, float z, DWORD col)
   : posX(x), posY(y), posZ(z), COLOR(col){}

   float posX;
   float posY;   
   float posZ;
   DWORD COLOR;
};

Hier mal mein aktueller Code für die Buffererzeugung:

Code: Alles auswählen

// get D3DDevice object
    LPDIRECT3DDEVICE9 d3ddev = device->getDevice();

    Vertex vertices[] =
    {
	Vertex(400.0f, 62.5f,  0.5f, D3DCOLOR_XRGB(0, 0, 255)),
        Vertex(650.0f, 500.0f, 0.5f, D3DCOLOR_XRGB(0, 255, 0)),
        Vertex(150.0f, 500.0f, 0.5f, D3DCOLOR_XRGB(255, 0, 0)),
    };

    D3DVERTEXELEMENT9 elements[] =
    {
        {0, 0,  D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0},
        {0, 16, D3DDECLTYPE_D3DCOLOR,   D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0},
        D3DDECL_END() // this macro is needed as the last item!
    };

    // Use the vertex element array to create a vertex declaration.
    IDirect3DVertexDeclaration9* myVertexDecl;
    HRESULT hr = d3ddev->CreateVertexDeclaration(elements, &myVertexDecl);

    if (FAILED(hr))
    {
 	throw brCore::brIllegalStateException("Couldn't create valid D3D9VertexDeclaration!");
    }    

    // bind the VertexDeclaration to the device to make it usable
    d3ddev->SetVertexDeclaration(myVertexDecl);

    // create a vertex buffer interface called v_buffer
    d3ddev->CreateVertexBuffer(3*sizeof(Vertex),
                               0,
                               0,   // DON'T pass the FVF code if you are using vertex decleration
                               D3DPOOL_MANAGED,
                               &v_buffer,
                               NULL);

    VOID* pVoid;    // a void pointer

    // lock v_buffer and load the vertices into it
    v_buffer->Lock(0, 0, (void**)&pVoid, 0);
    memcpy(pVoid, vertices, sizeof(vertices));
    v_buffer->Unlock();

Zudem die weitere Frage, Texturkoordinaten müssen wahrscheinlich auch separiert, flach im Struct aufgeführt werden oder? Listen sind hier nicht möglich oder?

Ich weiß Fragen über Fragen ...
Bin Dankbar für jeden Tipp und gern auch gute Tutorials ...

Gruß
Christian

Re: Nur Structs als Vertex Datenbasis für D3D?

Verfasst: 30.09.2010, 18:49
von Krishty
Ja, kannst du. Abgesehen von Default-Privacy sind struct und class in C++ vollkommen gleichwertig. Die Texturkoordinaten muss du entweder direkt in die Vertices packen oder in einen zweiten Buffer, den du mit dem Vertex-Buffer zusammen übergibst, die kannst du dann aber auch nicht einzeln adressieren, sondern nur mit fester Sprungfolge – kurz – alles muss in die Vertex-Struktur.

Gruß, Ky

Re: Nur Structs als Vertex Datenbasis für D3D?

Verfasst: 30.09.2010, 18:50
von Hellhound
Hmm, dann verstehe ich nicht, warum er den Code als Klasse nicht anzieht. Habe ich evtl.
etwas übersehen?

Re: Nur Structs als Vertex Datenbasis für D3D?

Verfasst: 30.09.2010, 18:53
von Krishty
Ich gucke gerade. Vererbung ist nicht zufällig im Spiel? Es darf nämlich garkeinen Unterschied machen.
Könnte es sein, dass das Offset von Color nicht 16, sondern 12 Bytes ist? Benutz am besten offsetof für Vertex-Deklarationen.

Re: Nur Structs als Vertex Datenbasis für D3D?

Verfasst: 30.09.2010, 22:01
von Hellhound
Das mit den 12 war richtig. Aber das war nicht der Fehler, sehe nach wie vor kein Dreieck,
stelle ich die Klasse auf ein Struct um funzt es sofort. Vererbung sollte kein Problem sein,
gibt es nicht...

Re: Nur Structs als Vertex Datenbasis für D3D?

Verfasst: 30.09.2010, 22:27
von Krishty
„umstellen“ im Sinne von „Schlüsselwort austauschen“ oder machst du noch was anderes? Deklaration identisch mit der im ersten Post?

Achja, btw ist jetzt noch D3D9 lernen/implementieren echt für den Popo, wenn man nicht zufällig Nischen-Casual-Games oder für Mobile Plattformen entwickelt.

Re: Nur Structs als Vertex Datenbasis für D3D?

Verfasst: 01.10.2010, 00:34
von dowhilefor
Unqualifizierter Beitrag von mir :) Könnte es ein alignment Problem sein? was sagt sizeof() zu class und struct? Naja C++ ist was länger her bei mir, ist nur eine vermutung.

Re: Nur Structs als Vertex Datenbasis für D3D?

Verfasst: 01.10.2010, 09:14
von kimmi
Vergleiche doch mal die Daten per memcmp, um einen gegebenenfalls vorhandenen Unterschied zu finden. Und Direct3D 9 wird noch als der Grafikstandard angesehen und auf der XBox 360 ( sofern man diese unterstützen will ) gibt das gar nichts anderes. Man wird sehen, ob sich DirectX 11 durchsetzt ( was ich hoffe ).

Gruß Kimmi

Re: Nur Structs als Vertex Datenbasis für D3D?

Verfasst: 01.10.2010, 10:59
von Krishty
kimmi hat geschrieben:Und Direct3D 9 wird noch als der Grafikstandard angesehen
Ach komm, gerade mal ein Drittel der Käufer hat noch XP, mit einem Prozentpunkt Verlust pro Monat. Zehn Prozentpunkte davon fallen sowieso aus der Zielgruppe, weil sie ihren Rechner seit zehn Jahren nicht aktualisiert (noch D3D8-Hardware und Athlon XP verbaut) haben. Falls das Projekt in einem Jahr fertig ist, haben nurnoch 10 % XP, aber 80 % Vista / 7 und damit D3D11 – dann kann man dort immernoch auf Techlevel 9 programmieren, wenn es einem die paar Leute ohne 10er-Hardware wert sind. Abgesehen von den Sonderfällen ist es Zeitverschwendung, und zwar von Tag zu Tag mehr.
kimmi hat geschrieben:und auf der XBox 360 ( sofern man diese unterstützen will ) gibt das gar nichts anderes.
Stimmt, die vergesse ich immer.

Re: Nur Structs als Vertex Datenbasis für D3D?

Verfasst: 01.10.2010, 12:04
von TGGC
Struct? Klasse? Alles egal! Wichtig ist es einen Speicherbereich mit den Daten des spezifizierten Formats zu befuellen. Structs sind nur eines der moeglichen Werkzeuge dazu.

Re: Nur Structs als Vertex Datenbasis für D3D?

Verfasst: 01.10.2010, 12:16
von Hellhound
So das ganze läuft nun. Manchmal bewirkt ein clean Wunder ;) Irgendwie muß er was beim umwurschteln vermischt haben, so dass er da Murx
kompiliert hat ... Danke erstmal für Eure Tipps!

Und um mich der Diskusion anzuschließen, D3D9 läuft leider noch auf vielen Rechnern u.A. der Kiste an der ich aktuell sitze auch und D3D10 ist
hier leider keine Option. Und so kann ich wenigstens ab und zu in der Mittagspause einen Fluchtversuch aus dem Java Gedöns nehmen :mrgreen:
Und bei einer Cross-Plattform render Engine soll schön jeder selbst entscheiden dürfen, womit er sich rumärgert, steh selber eh mehr auf Linux i.V.m. OpenGL, aber was macht man nicht alles für für die bösen Widnows Devils da draußen :lol:

Aber eine Frage ist noch unbeantwortet ... Kann ich dem Biest auch beibringen mit Listen zu arbeiten? In der schönen OOP Welt nehm mich natürlich ne
Liste aus der STL für die 1-8 Texturkoordinaten als sie einzeln runterzubrezeln ... Aber da komm ich vermutlich nicht rum oder?

Re: Nur Structs als Vertex Datenbasis für D3D?

Verfasst: 01.10.2010, 12:17
von Krishty
Nein.

Zum einen ist der VRAM nicht virtualisiert und zum anderen bietet der Input-Assembler keinen Random Access an.