[Gelöst] Direct3D Dreieck seltsam ausgegeben
-
hi!
ich erstelle gerade ein simples dreieck und hab das problem dass es ohne extra angabe der viewMatrix und Projmatrix korrekt dargestellt wird, wenn ich aber die kameraposition bestimme wird es bei wireframe modus in unterbrochenen linien ausgegeben die einfach dutzende löcher haben....
bei solid mode sieht das muster sowieso total seltsam aus...
zwischendurch sind einfach schwarze löcher drin die manchmal das muster eines dreiecks ergeben manchmal einfach irgendwas...
wenn ich die kamera verschiebe ändert sich nichts daran...
wenn ich aber einen scrennshot mache dann wird mehr von dem ursprünglichen dreieck sichtbar....Alles in allem sieht das Bild aus als wäre das Dreieck aus lauter kleinen Rechtecken zusammengesetzt worden...
Hoffe ihr könnt mir helfen
mein code für die szene:
CUSTOMVERTEX TriangleVertices[] = { { -1.0f, -1.0f, 0.0f, 0xFF00FFFF, -1.0f, -1.0f }, { 0.0f, 1.0f, 0.0f, 0xFF00FFFF, 0.0f, 1.0f }, { 1.0f, -1.0f, 0.0f, 0xFF00FFFF, 1.0f, -1.0f } }; void CScene::init(LPDIRECT3DDEVICE9 dev){ m_lpD3DDevice=dev; // Zeiger, der auf den Vertex Buffer gesetzt wird BYTE* VertexBufferStart; // Vertex Buffer für das Dreieck anlegen // die Größe des Vertex Buffer muss mit // der Größe der Struktur, in der das Dreieck // gespeichert ist, übereinsimmen m_lpD3DDevice->CreateVertexBuffer(sizeof(TriangleVertices), D3DUSAGE_WRITEONLY, D3D_CUSTOMVERTEX, D3DPOOL_MANAGED, &VB_Triangle, NULL); // Vertex Buffer sperren VB_Triangle->Lock(0,0,(void**)&VertexBufferStart,0); // Vertices des Dreiecks in den Puffer kopieren memcpy(VertexBufferStart,TriangleVertices,sizeof(TriangleVertices)); // Vertex Buffer wieder freigeben VB_Triangle->Unlock(); // Das Vertex-Format festlegen m_lpD3DDevice->SetFVF(D3D_CUSTOMVERTEX); // Die Kamera wird an der Position (0.0f, 0.0f, -10.0f) aufgestellt D3DXMATRIX ViewMatrix; D3DXMatrixLookAtLH(&ViewMatrix, &D3DXVECTOR3(0.0f, 0.0f,-10.0f), &D3DXVECTOR3(0.0f, 0.0f, 0.0f), &D3DXVECTOR3(0.0f, 1.0f, 0.0f)); m_lpD3DDevice->SetTransform(D3DTS_VIEW,&ViewMatrix); // Sichtkegel definieren D3DXMATRIX ProjMatrix; D3DXMatrixPerspectiveFovLH(&ProjMatrix, D3DX_PI/4, (float)Resolution_X / (float)Resolution_Y, 1.0f, 100.0f ); m_lpD3DDevice->SetTransform(D3DTS_PROJECTION,&ProjMatrix); ZeroMemory(&m_Light,sizeof(D3DLIGHT9)); // bei der Lichtquelle soll es sich um eine // Punktlichtquelle handeln m_Light.Type = D3DLIGHT_POINT; // die Lichtfarbe wird auf Weiß gesetzt m_Light.Diffuse.r = 1.0f; m_Light.Diffuse.g = 1.0f; m_Light.Diffuse.b = 1.0f; // das Licht soll eine Reichweite von 1000 haben m_Light.Range = 1000.0f; // das Licht wird an der gleichen Stelle positio- // niert, an der sich auch unsere Kamera befindet m_Light.Position = D3DXVECTOR3(0.0f, 0.0f, -10.0f); // das Element Attenuation0 bestimmt, wie stark die // Lichtstärke mit der Entfernung abfällt // 1.0 bedeutet dabei keinen Abfall der Lichtstärke m_Light.Attenuation0 = 1.0f; // das definierte Licht bekommt die Nummer 0 m_lpD3DDevice->SetLight(0,&m_Light); // Lichtquelle anschalten m_lpD3DDevice->LightEnable(0,TRUE); // Licht einschalten m_lpD3DDevice->SetRenderState(D3DRS_LIGHTING,TRUE); // Materialien definieren ZeroMemory( &m_MaterialTriangle, sizeof(m_MaterialTriangle) ); m_MaterialTriangle.Diffuse.r = m_MaterialTriangle.Ambient.r = 1.0f; m_MaterialTriangle.Diffuse.g = m_MaterialTriangle.Ambient.g = 0.2f; m_MaterialTriangle.Diffuse.b = m_MaterialTriangle.Ambient.b = 0.2f; m_MaterialTriangle.Diffuse.a = m_MaterialTriangle.Ambient.a = 1.0f; m_lpD3DDevice->SetMaterial( &m_MaterialTriangle ); // Ambientes Licht aktivieren m_lpD3DDevice->SetRenderState( D3DRS_AMBIENT, 0x00F0F0F0); } void CScene::render(){ m_lpD3DDevice->SetMaterial(&m_MaterialTriangle); m_lpD3DDevice->SetStreamSource(0,VB_Triangle,0,sizeof(CUSTOMVERTEX)); m_lpD3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST,0,1); } void CScene::LightONOFF(){ if(lt%2==0){ m_lpD3DDevice->LightEnable(0,FALSE); m_lpD3DDevice->SetRenderState(D3DRS_LIGHTING,FALSE); } else{ m_lpD3DDevice->LightEnable(0,TRUE); m_lpD3DDevice->SetRenderState(D3DRS_LIGHTING,TRUE); } lt++; }mein code für die direct3d init:
BOOL CDirect3D::Init(HWND hWnd, bool bWindowed) { WINDOWEDVAR=bWindowed; hwnd=hWnd; // Direct3D-Objekt erzeugen m_lpD3D = Direct3DCreate9(D3D_SDK_VERSION); if(NULL == m_lpD3D) { // Fehler, D3D-Objekt wurde nicht erzeugt return FALSE; } // Parameter für den Modus festlegen ZeroMemory(&PParams,sizeof(PParams)); PParams.SwapEffect = D3DSWAPEFFECT_DISCARD; PParams.hDeviceWindow = hWnd; PParams.Windowed = bWindowed; PParams.BackBufferWidth = Resolution_X; PParams.BackBufferHeight = Resolution_Y; PParams.BackBufferFormat = D3DFMT_A8R8G8B8; PParams.EnableAutoDepthStencil=TRUE; PParams.AutoDepthStencilFormat=D3DFMT_D16; HRESULT hr; // Direct3D-Gerät anlegen if(FAILED(hr = m_lpD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &PParams, &m_lpD3DDevice))) { // Fehler, Gerät kann nicht angelegt werden const char* Err = DXGetErrorDescription9(hr); DXTRACE_MSG(Err); return FALSE; } // Schrift erzeugen CreateFont(); // Zeiger auf dem Hintergrundpuffer holen m_lpD3DDevice->GetBackBuffer(0,0, D3DBACKBUFFER_TYPE_MONO, &m_lpBackBuffer); return TRUE; }
-
Ich habe jetzt das Dreieck einfach um noch eines erweitert, also insgesamt ein Rechteck darausgemacht UND eine Textur darüber gelegt...
das seltsame ist dass diese viereckigen schwarzen flecken jetzt auch auf der Textur angezeigt werden!!!
ich weißt echt nicht woran das liegen könnte!
-
Kuldren schrieb:
m_lpD3DDevice->SetRenderState(D3DRS_LIGHTING,TRUE);hmm? true? ahem?
-
Kuldren schrieb:
C/C++ Code:
m_lpD3DDevice->SetRenderState(D3DRS_LIGHTING,TRUE);
hmm? true? ahem?Hm?
Es macht keinen Unterschied ob das Licht aktiviert wird oder nicht, die Störungen bleiben vorhanden
-
Ok hab den Fehler gefunden...
Der Z-Buffer war nicht aktiviert, dadurch sind lauter schwarze Flecken entstanden...
Ich kann mir zwar nicht erklären warum aber wenigstens funktioniert es jetzt!