Nur Structs als Vertex Datenbasis für D3D?

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Benutzeravatar
Hellhound
Beiträge: 53
Registriert: 23.08.2010, 10:00
Wohnort: Braunschweig
Kontaktdaten:

Nur Structs als Vertex Datenbasis für D3D?

Beitrag 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
Benutzeravatar
Krishty
Establishment
Beiträge: 8316
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

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

Beitrag 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
Zuletzt geändert von Krishty am 30.09.2010, 18:52, insgesamt 1-mal geändert.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Hellhound
Beiträge: 53
Registriert: 23.08.2010, 10:00
Wohnort: Braunschweig
Kontaktdaten:

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

Beitrag von Hellhound »

Hmm, dann verstehe ich nicht, warum er den Code als Klasse nicht anzieht. Habe ich evtl.
etwas übersehen?
Benutzeravatar
Krishty
Establishment
Beiträge: 8316
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

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

Beitrag 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.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Hellhound
Beiträge: 53
Registriert: 23.08.2010, 10:00
Wohnort: Braunschweig
Kontaktdaten:

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

Beitrag 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...
Benutzeravatar
Krishty
Establishment
Beiträge: 8316
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

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

Beitrag 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.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
dowhilefor
Moderator
Beiträge: 173
Registriert: 27.02.2009, 15:44
Alter Benutzername: 6SidedDice
Echter Name: Nico Probst
Wohnort: Bochum
Kontaktdaten:

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

Beitrag 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.
Mein Gehirn besteht nur noch aus einem hash-index, ich weiss was ich kenn aber kenn nicht was ich weiss
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

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

Beitrag 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
Benutzeravatar
Krishty
Establishment
Beiträge: 8316
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

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

Beitrag 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.
Zuletzt geändert von Krishty am 01.10.2010, 12:16, insgesamt 1-mal geändert.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
TGGC
Establishment
Beiträge: 569
Registriert: 15.05.2009, 18:14
Benutzertext: Ich _bin_ es.
Alter Benutzername: TGGC
Echter Name: Ich _bin_ es.
Wohnort: Mainz
Kontaktdaten:

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

Beitrag 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.
Benutzeravatar
Hellhound
Beiträge: 53
Registriert: 23.08.2010, 10:00
Wohnort: Braunschweig
Kontaktdaten:

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

Beitrag 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?
Benutzeravatar
Krishty
Establishment
Beiträge: 8316
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

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

Beitrag von Krishty »

Nein.

Zum einen ist der VRAM nicht virtualisiert und zum anderen bietet der Input-Assembler keinen Random Access an.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Antworten