[DirectX] Vertices



  • Hi,

    ich habe folgendes Problem: Ich habe einige Vertices in einem Array gespeichert und möchte diese jeweiles miteinander verbinden (D3DPT_LINELIST). Allerdings startet das Programm dann nicht richtig und der Bildschirm flimmert komisch. Das einzige was geht ist die Vertices mit D3DPT_POINTLIST anzuzeigen. Ich will sie aber verbinden 😞

    Also, das sind die Vertices:

    typedef struct VERTEX
    {
        float       x, y, z;
        float       rhw;
        D3DCOLOR    color;
    } VERTEX, *LPVERTEX;
    
    #define VERTEXCAPS (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)
    
    #define VERTEXCOUNT 20
    

    Dann lege ich einen Vertexbuffer an:

    LPDIRECT3DVERTEXBUFFER8 lpVB = NULL;
    

    Nachdem dann das Device etc. initialisiert ist wird der Buffer erstellt:

    lpDevice->CreateVertexBuffer(sizeof(VERTEX)*VERTEXCOUNT, D3DUSAGE_WRITEONLY, VERTEXCAPS, D3DPOOL_DEFAULT, &lpVB);
    

    Dann werden die Vertices angelegt:

    VERTEX front[VERTEXCOUNT];
    srand((unsigned)time(0));
    
    for(int i=0; i<VERTEXCOUNT; ++i)
    {
        front[i].x        =    float(rand()%800);
        front[i].y        =    float(rand()%600);
        front[i].z        =    1.0f;
        front[i].rhw      =    1.0f;
        front[i].color    =    0xFFFFFF;
    }
    

    In jedem Hauptschleifendurchgang sollen sie dann angezeigt und verbunden werden:

    lpDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0);
    lpDevice->BeginScene();
    
    VERTEX*    pVertices;
    lpVB->Lock(0,0,(BYTE**)&pVertices,0);
    memcpy(pVertices, front, sizeof(VERTEX)*VERTEXCOUNT);
    lpVB->Unlock();
    
    lpDevice->SetStreamSource(0,lpVB,sizeof(VERTEX));
    lpDevice->SetVertexShader(VERTEXCAPS);
    lpDevice->DrawPrimitive(D3DPT_LINELIST, 0, VERTEXCOUNT);
    
    lpDevice->EndScene();
    lpDevice->Present(NULL,NULL,0,NULL);
    

    So, ich hoffe, ich habe die wichtigsten Zeilen herausgefischt. Wie gesagt, wenn ich sie mit D3DPT_POINTLIST zeichne, funktioniert es. Weiß jemand, wie das auch mit LINELIST etc. hinkriege?

    Was mich auch noch brennend interessieren würde: Wie kann man die Bildschirmauflösung festsetzen?

    So, danke an alle, die mir helfen 🙂

    [ Dieser Beitrag wurde am 07.02.2003 um 17:07 Uhr von Phobos editiert. ]



  • ich hab mit dx nicht am hut 🙂 aber ich glaube es gibt sowas wie LINESTRIP, sicher bin ich mir aber nicht...

    cu
    freddy



  • Hm,dann tritt derselbe komische Effekt auf. Es wird nicht in den Fullscreen-Mode geschaltet und der Bildschirm fängt an zu flimmern...



  • Einstellung der Auflösung:

    D3DPRESENT_PARAMETERS D3DAktuelleEinstellung;
    ZeroMemory(&D3DAktuelleEinstellung, sizeof(D3DAktuelleEinstellung));
    
    D3DAktuelleEinstellung.BackBufferWidth = 1024;
    D3DAktuelleEinstellung.BackBufferHeight = 768;
    
    if(FAILED(m_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &D3DAktuelleEinstellung, &m_pD3DDevice)))
    {
        // Fehler
    }
    

Anmelden zum Antworten