[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!


Anmelden zum Antworten