Seltsame Verzerrung
-
Hi!
Ich hab mir gerade eine Klasse für simple dreidimensionale Objekte zusammengebaut.
Aber ich bekomme wenn ich das Ganze dann darstellen will diese seltsamen "Striche" im Bild:
http://i191.photobucket.com/albums/z231/kuldren/Fehler2.jpg
http://i191.photobucket.com/albums/z231/kuldren/Fehler.jpgDas seltsame ist, wenn ich nur 4 Würfel darstellen will treten diese Fehler im Bild nicht auf!
Jmd eine Idee woher das vlt kommt=?Das sind die verwendeten Methoden für den Würfel:
Cube::Cube(LPDIRECT3DDEVICE9 dev,D3DXVECTOR3 Position, D3DXVECTOR3 Size, DWORD Color):MY3DObject(dev,Position,Size,Color){ CUSTOMVERTEX cbuf[]={ ... }; //Hier werden die Punkte für den Würfel bestimmt Device=dev; BYTE* VertexBufferStart; Device->CreateVertexBuffer(sizeof(cbuf), D3DUSAGE_WRITEONLY, D3D_CUSTOMVERTEX, D3DPOOL_MANAGED, &VB, NULL); VB->Lock(0,0,(void**)&VertexBufferStart,0); memcpy(VertexBufferStart,cbuf,sizeof(cbuf)); VB->Unlock(); Device->SetFVF(D3D_CUSTOMVERTEX); } void Cube::setColor(DWORD Color,int Side){ this->Color=Color; } void Cube::setSize(D3DXVECTOR3 Size){ this->Size=Size; } void Cube::Draw(){ Device->SetStreamSource(0,VB,0,sizeof(CUSTOMVERTEX)); Device->DrawPrimitive(D3DPT_TRIANGLELIST,0,36); }Das ist die Klasse die die 3D Objekte verwaltet:
void MY3DObjectManager::DrawAll(){ for(int q=0;q<numOfObjects;q++){ Objects[q]->Draw(); } } void MY3DObjectManager::AddObject(MY3DObject *obj){ Objects.resize(numOfObjects+1); Objects[numOfObjects]=obj; numOfObjects++; } MY3DObjectManager::MY3DObjectManager(){ numOfObjects=0; }Mit DrawAll rufe ich einfach alle nacheinander auf und stelle sie dar.
Zusätzlich hab ich noch eine Klasse "Scene", deren Init Methode den Blickwinkel und dgl festlegt:
m_lpD3DDevice=dev; camPos=D3DXVECTOR3(0.0f, 0.0f,-50.0f); camEye=D3DXVECTOR3(0.0f, 0.0f, 0.0f); camY =D3DXVECTOR3(0.0f, 1.0f, 0.0f); D3DXMATRIX ViewMatrix; D3DXMatrixLookAtLH(&ViewMatrix, &camPos, &camEye, &camY); m_lpD3DDevice->SetTransform(D3DTS_VIEW,&ViewMatrix); D3DXMATRIX ProjMatrix; D3DXMatrixPerspectiveFovLH(&ProjMatrix, D3DX_PI/4, (float)ResolutionX / (float)ResolutionY, 1.0f, 1000.0f ); m_lpD3DDevice->SetTransform(D3DTS_PROJECTION,&ProjMatrix); ZeroMemory(&m_Light,sizeof(D3DLIGHT9)); m_Light.Type = D3DLIGHT_POINT; m_Light.Diffuse.r = 1.0f; m_Light.Diffuse.g = 1.0f; m_Light.Diffuse.b = 1.0f; m_Light.Range = 1000.0f; m_Light.Position = D3DXVECTOR3(0.0f, 0.0f, -10.0f); m_Light.Attenuation0 = 1.0f; m_lpD3DDevice->SetLight(0,&m_Light); m_lpD3DDevice->LightEnable(0,TRUE); m_lpD3DDevice->SetRenderState(D3DRS_LIGHTING,FALSE); }Zusätzlich hätt ich noch eine Frage bzgl des Rotierens:
Brauch ich da für jedes einzelne Objekt verschiedene Matrizen? und wie kann verbinde ich die dann mit der world matrix?
Verwende Vista, VC++ 2005 EE und Direct3D
-
Du machst was falsch. Benutzt du die Debug Runtime Libs? f'`8k
AutocogitoGruß, TGGC (making great games since 1992)
-
Wie gesagt, hab mir das so überlegt, weil ich nicht wusste wie man das am Besten aufbaut, mit mehreren Objekten die ich so kapsele dass jedes seine Punkte speichert...
Ich nehme an dass man das prinzipiell anders aufbauen muss aber in dem Buch das ich da hab gibts eben leider nur den Fall dass man einen Würfel gestaltet und nicht mehrere Objekte (also Kugeln, weitere Würfel, etc...)Gibts da ein gutes Tut?
-
naja, in der d3d doku steht wie man das macht
start -> systemsteuerung -> directX
dort dann auf debug stellen.
-
naja, in der d3d doku steht wie man das macht
start -> systemsteuerung -> directX
dort dann auf debug stellen.Ja habs umgestellt...
Als Resultat wird jetzt gar nichts mehr angezeigt...
Also die Textur links oben schon aber kein einziger Würfel...
Was bringt das nun?BTW: Was ist der Unterschied zwischen Retail und Debug? Doch wohl nicht dass es beim Einen funktioniert aber beim Anderen nicht, oder?
-
Das zeigt dir ueber die Debugausgaben, was genau dein Fehler ist. Das brauchst du also nur noch lesen und beheben. f'`8k
AutocogitoGruß, TGGC (making great games since 1992)
-
Sorry aber mit der Antwort kann ich genau nichts anfangen.
Wieso funktioniert das bei Debug nicht, aber bei Retail schon bzw. was kann da der Fehler sein...
wenn ich mit dem Debugger durchlaufe, sehe ich dass die Werte alle richtig zugewisen werden...
Was aber der Fehler ist kann ich so nicht erkennen...
-
-
Hi,
die falschen Dreiecke entstehen wenn falsche Daten an die Grafikkarte geliefert werden. Folgende Möglichkeiten:
- falsches FVF
- mehr Daten in VB geschrieben als dort Platz ist
- weniger Daten im VB als beim Render-Aufruf angegeben
- ...-> Wenn man auf die Debug Libs schaltet sieht man i.d.R. in Visual Studio Output Fenster etliche Meldungen von D3D, kann man gar nicht übersehen. Dass er im DebugModus nicht rendert heisst, dass er dann durch mehr Fehlerprüfungen selbst erkennt dass etwas an deinen Daten faul ist und sie dann gar nicht erst rendert. Dann wird er aber im Output sagen was falsch ist.
Allerdings kommt es auch vor, dass die Debug-Ausgaben nicht dargestellt werden. Bei mir ist das so weil ich Vista 64 Bit habe aber eine 32 Bit Applikation erzeuge. In dem Fall hilft nur deinen Datenerzeugungscode und den Rendercode noch mal genaustens durch zu gehen und den Fehler dadurch zu finden.
Ciao,
Stefan
-
Danke für die Hinweise!
Ich bekomm bei jedem Aufruf von Draw bei Cube diese Meldungen:
Direct3D9: (ERROR) :Stream 0 does not have required number of vertices
Eine Ausnahme (erste Chance) bei 0x7674b09e in TurretX.exe: Microsoft C++-Ausnahme: long an Speicherposition 0x0012f978..
Direct3D9: (ERROR) :DrawPrimitive failed.Also betreffen die diesen Teil des Codes:
Cube::Cube(LPDIRECT3DDEVICE9 dev,D3DXVECTOR3 Position, D3DXVECTOR3 Size, DWORD Color):MY3DObject(dev,Position,Size,Color){ CUSTOMVERTEX cbuf[]={ { Position.x- Size.x/2, Position.y- Size.y/2, Position.z- Size.z/2, D3DCOLOR_XRGB(255,0,0), 0, 1}, // Vorne { Position.x- Size.x/2, Position.y+ Size.y/2, Position.z- Size.z/2, D3DCOLOR_XRGB(255,0,0), 0, 0}, { Position.x+ Size.x/2, Position.y+ Size.y/2, Position.z- Size.z/2, D3DCOLOR_XRGB(255,0,0), 1, 0}, { Position.x+ Size.x/2, Position.y+ Size.y/2, Position.z- Size.z/2, D3DCOLOR_XRGB(255,0,0), 1, 0}, { Position.x+ Size.x/2, Position.y- Size.y/2, Position.z- Size.z/2, D3DCOLOR_XRGB(255,0,0), 1, 1}, { Position.x- Size.x/2, Position.y- Size.y/2, Position.z- Size.z/2, D3DCOLOR_XRGB(255,0,0), 0, 1}, { Position.x+ Size.x/2, Position.y- Size.y/2, Position.z+ Size.z/2, D3DCOLOR_XRGB(0,255,0), 0, 1}, // Hinten { Position.x+ Size.x/2, Position.y+ Size.y/2, Position.z+ Size.z/2, D3DCOLOR_XRGB(0,255,0), 0, 0}, { Position.x- Size.x/2, Position.y+ Size.y/2, Position.z+ Size.z/2, D3DCOLOR_XRGB(0,255,0), 1, 0}, { Position.x- Size.x/2, Position.y+ Size.y/2, Position.z+ Size.z/2, D3DCOLOR_XRGB(0,255,0), 1, 0}, { Position.x- Size.x/2, Position.y- Size.y/2, Position.z+ Size.z/2, D3DCOLOR_XRGB(0,255,0), 1, 1}, { Position.x+ Size.x/2, Position.y- Size.y/2, Position.z+ Size.z/2, D3DCOLOR_XRGB(0,255,0), 0, 1}, { Position.x- Size.x/2, Position.y+ Size.y/2, Position.z- Size.z/2, D3DCOLOR_XRGB(0,0,255), 0, 1}, // Oben { Position.x- Size.x/2, Position.y+ Size.y/2, Position.z+ Size.z/2, D3DCOLOR_XRGB(0,0,255), 0, 0}, { Position.x+ Size.x/2, Position.y+ Size.y/2, Position.z+ Size.z/2, D3DCOLOR_XRGB(0,0,255), 1, 0}, { Position.x+ Size.x/2, Position.y+ Size.y/2, Position.z+ Size.z/2, D3DCOLOR_XRGB(0,0,255), 1, 0}, { Position.x+ Size.x/2, Position.y+ Size.y/2, Position.z- Size.z/2, D3DCOLOR_XRGB(0,0,255), 1, 1}, { Position.x- Size.x/2, Position.y+ Size.y/2, Position.z- Size.z/2, D3DCOLOR_XRGB(0,0,255), 0, 1}, { Position.x+ Size.x/2, Position.y- Size.y/2, Position.z- Size.z/2, D3DCOLOR_XRGB(255,0,0), 0, 1}, // Unten { Position.x+ Size.x/2, Position.y- Size.y/2, Position.z+ Size.z/2, D3DCOLOR_XRGB(255,0,0), 0, 0}, { Position.x- Size.x/2, Position.y- Size.y/2, Position.z+ Size.z/2, D3DCOLOR_XRGB(255,0,0), 1, 0}, { Position.x- Size.x/2, Position.y- Size.y/2, Position.z+ Size.z/2, D3DCOLOR_XRGB(255,0,0), 1, 0}, { Position.x- Size.x/2, Position.y- Size.y/2, Position.z- Size.z/2, D3DCOLOR_XRGB(255,0,0), 1, 1}, { Position.x+ Size.x/2, Position.y- Size.y/2, Position.z- Size.z/2, D3DCOLOR_XRGB(255,0,0), 0, 1}, { Position.x- Size.x/2, Position.y- Size.y/2, Position.z+ Size.z/2, D3DCOLOR_XRGB(0,255,0), 0, 1}, // Links { Position.x- Size.x/2, Position.y+ Size.y/2, Position.z+ Size.z/2, D3DCOLOR_XRGB(0,255,0), 0, 0}, { Position.x- Size.x/2, Position.y+ Size.y/2, Position.z- Size.z/2, D3DCOLOR_XRGB(0,255,0), 1, 0}, { Position.x- Size.x/2, Position.y+ Size.y/2, Position.z- Size.z/2, D3DCOLOR_XRGB(0,255,0), 1, 0}, { Position.x- Size.x/2, Position.y- Size.y/2, Position.z- Size.z/2, D3DCOLOR_XRGB(0,255,0), 1, 1}, { Position.x- Size.x/2, Position.y- Size.y/2, Position.z+ Size.z/2, D3DCOLOR_XRGB(0,255,0), 0, 1}, { Position.x+ Size.x/2, Position.y- Size.y/2, Position.z- Size.z/2, D3DCOLOR_XRGB(0,0,255), 0, 1}, // Rechts { Position.x+ Size.x/2, Position.y+ Size.y/2, Position.z- Size.z/2, D3DCOLOR_XRGB(0,0,255), 0, 0}, { Position.x+ Size.x/2, Position.y+ Size.y/2, Position.z+ Size.z/2, D3DCOLOR_XRGB(0,0,255), 1, 0}, { Position.x+ Size.x/2, Position.y+ Size.y/2, Position.z+ Size.z/2, D3DCOLOR_XRGB(0,0,255), 1, 0}, { Position.x+ Size.x/2, Position.y- Size.y/2, Position.z+ Size.z/2, D3DCOLOR_XRGB(0,0,255), 1, 1}, { Position.x+ Size.x/2, Position.y- Size.y/2, Position.z- Size.z/2, D3DCOLOR_XRGB(0,0,255), 0, 1}, }; //Hier werden die Punkte für den Würfel bestimmt Device=dev; BYTE* VertexBufferStart; Device->CreateVertexBuffer(sizeof(cbuf), D3DUSAGE_WRITEONLY, D3D_CUSTOMVERTEX, D3DPOOL_MANAGED, &VB, NULL); VB->Lock(0,0,(void**)&VertexBufferStart,0); memcpy(VertexBufferStart,cbuf,sizeof(cbuf)); VB->Unlock(); Device->SetFVF(D3D_CUSTOMVERTEX); } void Cube::setColor(DWORD Color,int Side){ this->Color=Color; } void Cube::setSize(D3DXVECTOR3 Size){ this->Size=Size; } void Cube::Draw(){ Device->SetStreamSource(0,VB,0,sizeof(CUSTOMVERTEX)); Device->DrawPrimitive(D3DPT_TRIANGLELIST,0,36); }Ich übergebe doch 6x6=36 Vertices und gebe auch an er soll bei 0 anfangen und dass es 36 sind....mh...

-
Vielleicht solltest du statt irgendwelcher Daten zu uebergeben erstmal die Doku von DrawPrimitive lesen:
"PrimitiveCount
[in] Number of primitives to render. The maximum number of primitives allowed is determined by checking the MaxPrimitiveCount member of the D3DCAPS9 structure. PrimitiveCount is the number of primitives as determined by the primitive type. If it is a line list, each primitive has two vertices. If it is a triangle list, each primitive has three vertices."Hab dir ja gleich gesagt, das du da was falsch machst. f'`8k
AutocogitoGruß, TGGC (making great games since 1992)
-
Achja...

Danke!
sind also 12 und nicht 36...
-
np, Hauptsache du weisst, wo du beim naechsten Mal nachschauen musst. f'`8k
Gruß, TGGC (making great games since 1992)