Flackern bei Würfelkanten
-
Hi!
Ich hab eine simple 3D Anwendung mit Direct3D gemacht um mir eine Klasse für Würfel zu bauen.
Allerdings muss schobn beim Grundgerüst etwas falsch gelaufen sein, denn
beim Rendern treten an einigen Kanten bzw nur Ecken seltsame Fehler aufEs handelt sich um einen einfachen Würfel (mit 6 Texturen ), die Flächen sind weiß und die Kanten schwarz gefärbt, was auch gut ist aber manche Ecken werden für einen kurzen Augenblick viel dicker gerendert und in einer seltsamen (zufälligen Form) bzw. mit in einer Textur tritt von der linken oberen Ecke bis zur rechten unteren Ecke ein dicker Schwarzer Strich auf.
Ich kann mir nicht erklären woher dieser kommen kann...
Außerdem passiert das wohl nur bei rotieren des Würfels...
Rotieren sieht wie folgt aus:
D3DXMATRIX RotationMatrixX; D3DXMATRIX RotationMatrixY; D3DXMATRIX mBuff1; D3DXMATRIX WorldMatrix;D3DXMatrixRotationX(&RotationMatrixX,rotX+=x); D3DXMatrixMultiply(&mBuff1,&RotationMatrixX,&RotationMatrixY); D3DXMatrixMultiply(&WorldMatrix,&RotationMatrixZ,&mBuff1); m_lpD3DDevice->SetTransform(D3DTS_WORLD,&WorldMatrix);Ich ändere zuerst x und füge dann die XMatrix und YMatrix zusammen in mBuff1 und dann füge ich die ZMatrix und mBuff1 in WorldMatrix zusammen
Die Methode gibt es für x,y und z
Der Aufruf in Main sieht so aus:
scene.rotateY(0.01); scene.rotateX(0.01); scene.render();
-
Mach mal ein Screenshot

-
Das Problem ist die Fehler tauchen nur ganz kurz auf...also man sieht es soz. aufblinken...aber bis man da die taste gedrückt hat ist schon das nächste frame da...
-
So habs doch hinbekommen in dem ich nen Framebegrenzer eingebaut und dann alles frame für frame durchgegangen bin:
Links oben die Ecke ist einfach irgendwie weg:
http://666kb.com/i/ap7oh5snykka3ixz9.jpg
Die hälfte der unteren Seite fehlt:
http://666kb.com/i/ap7owqwgde7boqmbp.jpg
-
Zeig mal deine Projektionsmatrix ... ich habe da einen Verdacht!
-
Hier die Init und Render Methoden:
void CScene::init(LPDIRECT3DDEVICE9 dev){ m_lpD3DDevice=dev; BYTE* VertexBufferStart; m_lpD3DDevice->CreateVertexBuffer(sizeof(TriangleVertices), D3DUSAGE_WRITEONLY, D3D_CUSTOMVERTEX, D3DPOOL_MANAGED, &VB_Triangle, NULL); VB_Triangle->Lock(0,0,(void**)&VertexBufferStart,0); memcpy(VertexBufferStart,TriangleVertices,sizeof(TriangleVertices)); VB_Triangle->Unlock(); m_lpD3DDevice->SetFVF(D3D_CUSTOMVERTEX); 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); /* PROJEKTIONSMATRIX */ D3DXMATRIX ProjMatrix; D3DXMatrixPerspectiveFovLH(&ProjMatrix, D3DX_PI/4, (float)Resolution_X / (float)Resolution_Y, 0.0f, 100.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); ZeroMemory( &m_MaterialTriangle, sizeof(m_MaterialTriangle) ); m_MaterialTriangle.Diffuse.r = m_MaterialTriangle.Ambient.r = 0.7f; m_MaterialTriangle.Diffuse.g = m_MaterialTriangle.Ambient.g = 0.7f; m_MaterialTriangle.Diffuse.b = m_MaterialTriangle.Ambient.b = 0.7f; m_MaterialTriangle.Diffuse.a = m_MaterialTriangle.Ambient.a = 0.5f; m_MaterialTriangle.Emissive.r=1.0f; m_MaterialTriangle.Emissive.g=1.0f; m_MaterialTriangle.Emissive.b=1.0f; m_MaterialTriangle.Emissive.a=1.0f; m_MaterialTriangle.Power=1.0f; m_lpD3DDevice->SetMaterial( &m_MaterialTriangle ); // Ambientes Licht aktivieren m_lpD3DDevice->SetRenderState( D3DRS_AMBIENT, 0x00F0F0F0); /* . . . TEXTUREN WERDEN GELADEN . . . */ // D3DXMatrixTranslation(&TranslationMatrix,0,0,0); D3DXMatrixIdentity(&TranslationMatrix); D3DXMatrixIdentity(&RotationMatrixX); D3DXMatrixIdentity(&RotationMatrixY); D3DXMatrixIdentity(&RotationMatrixZ); rotX=0; rotY=0; rotZ=0; dCamMove=D3DXVECTOR3(2,2,2); m_lpD3DDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_SOLID); m_lpD3DDevice->SetTextureStageState,D3DTSS_COLOROP,D3DTOP_SELECTARG1); m_lpD3DDevice->SetMaterial(&m_MaterialTriangle); m_lpD3DDevice->SetStreamSource(0,VB_Triangle,0,sizeof(CUSTOMVERTEX)); } void CScene::render(){ m_lpD3DDevice->SetTexture(0,lpTextures[0]); m_lpD3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST,0,6); m_lpD3DDevice->SetTexture(0,lpTextures[5]); m_lpD3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST,6,6); m_lpD3DDevice->SetTexture(0,lpTextures[3]); m_lpD3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST,12,6); m_lpD3DDevice->SetTexture(0,lpTextures[2]); m_lpD3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST,18,6); m_lpD3DDevice->SetTexture(0,lpTextures[1]); m_lpD3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST,24,6); m_lpD3DDevice->SetTexture(0,lpTextures[4]); m_lpD3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST,30,6); }
-
Setz mal die Near Clipping Plane (die hast du auf 0) auf einen höheren Wert, z.B. 1.
-
@David:
Danke!Aber der Bereich der Anzeige wird dadurch ja verringert..also statt zwischen 0 und 100 -> 1 und 100
Wieso bringt das aber was? Steh grad auf der Leitung ...sorry..

-
Wenn du die Near Clipping Plane zu nah setzt, geht ein Großteil der Genauigkeit des Z-Buffers für sehr geringe Tiefen drauf. Das ist nämlich nicht linear. Darum: Near so weit wie möglich nach hinten, Far so weit wie möglich nach vorne. Wobei es aber wesentlich mehr bringt, Near nach hinten zu verschieben als Far um denselben Betrag nach vorne.
Near = 0 ist das Schlimmste, was du dem Z-Buffer antun kannst
Hier:
Learning to Love your Z-buffer(Kannst ja mal deine Werte einsetzen)