wieder probleme mit engine - vertexbuffer
-
hi,
ich hab hier schon wieder ein problem mit meiner engine:
ich hab versucht die vertexbuffer-unterstützung einzubauen, und habe zu diesem zweck folgende klasse geschrieben:sgeVertexBuffer.h
und
sgeVertexBuffer.cppmein code zum zeichnen sieht so aus:
sgeReturn Direct3D::DrawTriangleListVB(int startVertex, int numTriangles) { HRESULT r = d3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, startVertex, numTriangles); if(FAILED(r)) { SGE_ERROR_DIRECTX_LOG("DrawPrimitive", r) return SGE_ERROR; } return SGE_OK; }
im beispielprogramm initialisiere ich den buffer mit folgendem code:
Direct3D d3d; VertexBuffer vb; struct Vertex { Vector3 pos; Vector2 texCoords; }; #define FVF (D3DFVF_XYZ | D3DFVF_TEX1)
und in der main funktion:
vb.Init(&d3d); if(vb.Create(sizeof(Vertex)*3, FVF, 0, D3DPOOL_MANAGED) != SGE_OK) { SGE_ERROR_LOG("Konnte den VertexBuffer nicht erstellen") return 1; } Vertex v[3]; v[0].pos.x = -1.5f; v[0].pos.y = 1.5f; v[0].pos.z = 10.0f; v[0].texCoords.u = 0.0f; v[0].texCoords.v = 0.0f; v[1].pos.x = 1.5f; v[1].pos.y = 1.5f; v[1].pos.z = 10.0f; v[1].texCoords.u = 1.0f; v[1].texCoords.v = 0.0f; v[2].pos.x = 0.0f; v[2].pos.y = -1.5f; v[2].pos.z = 10.0f; v[2].texCoords.u = 0.5f; v[2].texCoords.v = 1.0f; vb.Write((void *)&v);
die klassen Vector3 und Vector2 haben als variablen:
union { struct { float x; float y; }; struct { float u; float v; }; float c[2]; };
bzw.
union { struct { float x; float y; float z; }; struct { float u; float v; float w; }; float c[3]; D3DVECTOR d3dVector; };
dann setze ich per SetFVF() das FVF auf den (ist es der define?) define FVF.
dann will ich in der schleife mit folgendem code rendern:sgeReturn renderProc(float time) { d3d.Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0); if(vb.SetVB(0, sizeof(Vertex)) != SGE_OK) return SGE_STOP; if(d3d.DrawTriangleListVB(0, 1) != SGE_OK) return SGE_STOP; d3d.Present(); return SGE_OK; }
jedoch liefert mir die die funktion DrawPrimitive() die durch d3d.DrawTriangleListVB() aufgerufen wird einen fehler: D3DERR_INVALIDCALL
es schlägt allerdings scheinbar nur diese funktion fehl.
kann sich das ganze vielleicht jemand antun und mir nen tipp geben woran das liegen könnte?
danke sehr
mfg
-
Setzt du auch irgendwo den StreamSource?
-
jop, sry, hab ich vor lauter copy & paste vergessen
.
den setze ich mit vb.SetVB():
sgeReturn VertexBuffer::SetVB(int offset, int sizeOfVertex) { if(d3dVertexBuffer == NULL) { SGE_NULL_POINTER_LOG("d3dVertexBuffer") return SGE_ERROR; } if(d3d == NULL) { SGE_NULL_POINTER_LOG("d3d") return SGE_ERROR; } HRESULT r = d3d->GetD3DDevice()->SetStreamSource(0, d3dVertexBuffer, offset, sizeOfVertex); if(FAILED(r)) { SGE_ERROR_DIRECTX_LOG("SetStreamSource", r) return SGE_ERROR; } return SGE_OK; }
mfg
-
kann mir keiner helfen? -.-
oder braucht ihr noch infos?thx
mfg
-
Black Sting schrieb:
kann mir keiner helfen? -.-
oder braucht ihr noch infos?thx
mfgSorry, mein THC is alle
-
Debug runtimes benutzt?
Bye, TGGC \-/
-
jup, hab ich.
debugger meldet nix
thx
mfg
-
Black Sting schrieb:
jup, hab ich.
sorry, aber das hast du nicht, denn wenn dir D3D folgendes meldet:
Black Sting schrieb:
DrawTriangleListVB() aufgerufen wird einen fehler: D3DERR_INVALIDCALL ...
dann schreibt d3d in die debugausgabe auch wieso, sofern du den debugmode davon aktiviert hast.
rapso->greets();
-
hm dann muss ich nochma schauen -.-
sorry
und danke
mfg