[DxGraphics, C++] Flimmern



  • So. Nun ist mein xter Versuch mit DxGraphics etwas brauchbares azf den Schirm zu bringen gescheitert. Die Sache sollte eigentlich simpel sein - einfach ein 2D-Bmp auf den Screen. Ich habe nun schon die verschiedensten Versionen irgendwelcher Tuts aus dem Netz durch. Bisher hatte ich immer das selbe Prob (anscheind mache ich irgend etwas grundlegend falsch): Es flimmert. Und zwar immer so gelblich-rot. Zu sehen von dem bmp ist natürlich nichts.
    Nach dem ich den Source erstmal gespeichert hatte fing ich an damit rumzuexperiementieren, in der Docu nachzulesen, zuergänzen, wegzulassen, umzuändern, etc. Aber nix änderte sich an dem Flimmern.
    (Btw. sind Teile auch aus codes aus dem Forum - falls wer was wiedererkennt 🙂
    Vielleicht weiß ja jemand von Euch, was mein Problem eigentlich ausmacht:
    Der Aufruf:

    CGraphics gfx;
        gfx.createDxGraphics(hwnd);
    
        while(bRun)
        {   if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
            {   if (msg.message == WM_QUIT)
                    return 0;
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
            gfx.Render(0.0f, 0.0f, 256.0f, 256.0f);
        }
        gfx.CleanUp();
    

    CGraphics

    // d3dx9dt.lib d3d9.lib
    #include <windows.h>
    #include <cassert>
    #include <d3dx9.h>
    
    #include "graphic_structs.h"
    
    class CGraphics
    {       LPDIRECT3D9             m_pD3DObject;
            LPDIRECT3DDEVICE9       m_pD3DDevice;
            LPDIRECT3DVERTEXBUFFER9 m_pD3DVertexBuffer;
            D3DDISPLAYMODE          m_pD3DDisplayMode;
    
            LPDIRECT3DTEXTURE9      m_pD3DTexture;
    
            HWND                    m_hwnd;
        public:
            void                    createDxGraphics(HWND hwnd);
            void                    CleanUp();
            void                    Render(float x, float y, float h, float w);
    };
    

    Und die Implementation:

    void CGraphics::createDxGraphics(HWND hwnd)
    {   m_pD3DObject = Direct3DCreate9(D3D_SDK_VERSION);
        assert(m_pD3DObject != NULL && "Could not create D3DObject...");
        m_hwnd = hwnd;
    
        D3DPRESENT_PARAMETERS d3dpp; 
        ZeroMemory( &d3dpp, sizeof(d3dpp) );
        d3dpp.Windowed = TRUE;
        d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
        d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
    
        m_pD3DObject->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, m_hwnd,
                                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                      &d3dpp, &m_pD3DDevice);
    
        m_pD3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
        m_pD3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
        m_pD3DDevice->SetRenderState(D3DRS_ZENABLE, TRUE);
    
        if(FAILED(D3DXCreateTextureFromFile(m_pD3DDevice, "ascii_c.bmp", &m_pD3DTexture)))
        {   if(FAILED(D3DXCreateTextureFromFile(m_pD3DDevice, "..\\ascii_c.bmp", &m_pD3DTexture)))
            {   assert(!"Could not find ascii_c.bmp");
                return;
            }
        }
    
        m_pD3DDevice->SetRenderState(D3DRS_ZENABLE, FALSE);
        m_pD3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
        m_pD3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
    
        return;
    };
    
    void CGraphics::Render(float x, float y, float w, float h)
    {   m_pD3DDevice->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,0), 1.0f, 0 );
    
        if(SUCCEEDED(m_pD3DDevice->BeginScene()))
        {   VERTEX2D vertices[4]; 
    
            vertices[0].x = x; 
            vertices[0].y = y; 
            vertices[0].z = 1.0f; 
            vertices[0].u = 0.0f; 
            vertices[0].v = 0.0f; 
            vertices[0].color = 0xFF000FF;
    
            vertices[1].x = x + w; 
            vertices[1].y = y; 
            vertices[1].z = 1.0f; 
            vertices[1].u = 1.0f; 
            vertices[1].v = 0.0f; 
            vertices[1].color = 0xFF0000FF; 
    
            vertices[2].x = x; 
            vertices[2].y = y + h; 
            vertices[2].z = 1.0f; 
            vertices[2].u = 0.0f; 
            vertices[2].v = 1.0f; 
            vertices[2].color = 0xFF0000FF; 
    
            vertices[3].x = x + w;
            vertices[3].y = y + h;
            vertices[3].z = 1.0f; 
            vertices[3].u = 1.0f; 
            vertices[3].v = 1.0f; 
            vertices[3].color = 0xFF0000FF;
    
            VOID *lpVertices; 
    
            m_pD3DDevice->CreateVertexBuffer(sizeof(vertices), 0, D3DFVF_VERTEX2D, D3DPOOL_DEFAULT, &m_pD3DVertexBuffer, NULL);
    
            m_pD3DVertexBuffer->Lock(0, sizeof(vertices), (VOID**)&lpVertices, 0);
            memcpy(lpVertices, vertices, sizeof(vertices));
            m_pD3DVertexBuffer->Unlock();
    
            m_pD3DDevice->SetTexture(0, m_pD3DTexture);
    
            m_pD3DDevice->SetFVF(D3DFVF_VERTEX2D);
            m_pD3DDevice->SetStreamSource(0, m_pD3DVertexBuffer,0, sizeof(VERTEX2D));
    
            m_pD3DDevice->EndScene();
        }
    
        m_pD3DDevice->Present(NULL, NULL, NULL, NULL);
    }
    
    void CGraphics::CleanUp()
    {   if(m_pD3DTexture != NULL)
            m_pD3DTexture->Release();
        if(m_pD3DVertexBuffer != NULL)
            m_pD3DVertexBuffer->Release();
        if(m_pD3DDevice != NULL)
            m_pD3DDevice->Release();
        if(m_pD3DObject != NULL)
            m_pD3DObject->Release();
    };
    

    graphic_structs.h

    #define D3DFVF_VERTEX2D (D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1)  
    
    struct VERTEX2D 
    {   float x, y, z; 
        DWORD color; 
        float u, v; 
    };
    

    Wieso flimmert das so?



  • du bist ein trottel
    mehr sag ich nicht
    hab den fehler auf anhieb gesehn!!!



  • Hat es vielleicht damit zu tun das beim ersten Vertex nur 3 Nullen statt 4 wie bei den andern bei Color steht?



  • Hi,

    In den PresentParameters musst Du AutoDepthStencil auf TRUE stellen, wenn Du mit dem Z Buffer arbeiten willst, sonst sorgt der Clear Aufruf für lustige Farben weil es gar keinen Z-Buffer gibt. Auch das DepthStencilFormat musst Du in den PP füllen, beispielsweise mit D3DFMT_D16.

    Einen Render-Aufruf gibt es bei Dir übrigens auch gar nicht [DrawPrimitive()], zudem erstellst Du in jedem Frame den VertexBuffer neu ohne ihn vorher frei zu geben => Memory Leak. Einmal bei der Init reicht für das Erstellen der Geometrie.

    Ciao,
    Stefan

    [ Dieser Beitrag wurde am 25.03.2003 um 12:15 Uhr von Stefan Zerbst editiert. ]

    [ Dieser Beitrag wurde am 25.03.2003 um 12:17 Uhr von Stefan Zerbst editiert. ]



  • @ Saugi: Keine ahnung ob das den fehler mit verursacht hat - so gewollt war es auf keinen Fall 🙂

    @ Stefan Zerbst: Danke für die aufschlussreichen Einwürfe - ich wuste, da liegt einiges im Argen 🙂



  • Ehm, muss da nich noch sowas hier kommen

    //...
    
           m_pD3DDevice->SetStreamSource(0, m_pD3DVertexBuffer,0, sizeof(VERTEX2D));
    
           //muss dazwischen nich noch DrawPrimitive() kommen?
    
           m_pD3DDevice->Drawprimitve(/*weiß die Parameter nich..*/)
    //schau mal in die doku
            m_pD3DDevice->EndScene();
        }
    
    PS: Hab auch nohc nich so die rechte Peilung von DX. Oder berauchman bei DX 9 gar kein drawprimitve() mrehr?
    
    Gruß, Maxi
    


  • Hi,

    vielleicht hilft Dir ja eine kleione Vorlage auf die Beine, Folge 1 und 2 zeigen Dir alles was nötig ist, um ein Dreieck auf den Bildschirm zu bringen 😉
    http://www.zfx.info/Tutorials.php?action=Tutorial&ID=61

    Ciao,
    Stefan



  • Danke nach deindem ersten Post hatte ich bereits die Sache lauffähig gekriegt (war ne Menge zu ändern).

    Ich werd mir mal die Serie ansehen.

    @Maxi: Genau da steht jetzt ein DrawPrimitive(...); 🙂


Anmelden zum Antworten