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