wieder probleme mit engine - vertexbuffer



  • hi,
    ich hab hier schon wieder ein problem mit meiner engine:
    ich hab versucht die vertexbuffer-unterstützung einzubauen, und habe zu diesem zweck folgende klasse geschrieben:

    sgeVertexBuffer.h
    und
    sgeVertexBuffer.cpp

    mein code zum zeichnen sieht so aus:

    sgeReturn Direct3D::DrawTriangleListVB(int startVertex, int numTriangles)
    {
      HRESULT r = d3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, startVertex, numTriangles);
    
      if(FAILED(r))
      {
        SGE_ERROR_DIRECTX_LOG("DrawPrimitive", r)
        return SGE_ERROR;
      }
    
      return SGE_OK;
    }
    

    im beispielprogramm initialisiere ich den buffer mit folgendem code:

    Direct3D d3d;
    VertexBuffer vb;
    
    struct Vertex
    {
      Vector3 pos;
      Vector2 texCoords;
    };
    
    #define FVF (D3DFVF_XYZ | D3DFVF_TEX1)
    

    und in der main funktion:

    vb.Init(&d3d);
    if(vb.Create(sizeof(Vertex)*3, FVF, 0, D3DPOOL_MANAGED) != SGE_OK)
    {
      SGE_ERROR_LOG("Konnte den VertexBuffer nicht erstellen")
      return 1;
    }
    
    Vertex v[3];
    
    v[0].pos.x = -1.5f;
    v[0].pos.y = 1.5f;
    v[0].pos.z = 10.0f;
    v[0].texCoords.u = 0.0f;
    v[0].texCoords.v = 0.0f;
    
    v[1].pos.x = 1.5f;
    v[1].pos.y = 1.5f;
    v[1].pos.z = 10.0f;
    v[1].texCoords.u = 1.0f;
    v[1].texCoords.v = 0.0f;
    
    v[2].pos.x = 0.0f;
    v[2].pos.y = -1.5f;
    v[2].pos.z = 10.0f;
    v[2].texCoords.u = 0.5f;
    v[2].texCoords.v = 1.0f;
    
    vb.Write((void *)&v);
    

    die klassen Vector3 und Vector2 haben als variablen:

    union
    {
      struct
      {
        float x;
        float y;
      };
    
      struct
      {
        float u;
        float v;
      };
    
      float c[2];
    };
    

    bzw.

    union
    {
      struct
      {
        float x;
        float y;
        float z;
      };
    
      struct
      {
        float u;
        float v;
        float w;
      };
    
      float c[3];
      D3DVECTOR d3dVector;
    };
    

    dann setze ich per SetFVF() das FVF auf den (ist es der define?) define FVF.
    dann will ich in der schleife mit folgendem code rendern:

    sgeReturn renderProc(float time)
    {
      d3d.Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
    
      if(vb.SetVB(0, sizeof(Vertex)) != SGE_OK)
        return SGE_STOP;
    
      if(d3d.DrawTriangleListVB(0, 1) != SGE_OK)
        return SGE_STOP;
    
      d3d.Present();
    
      return SGE_OK;
    }
    

    jedoch liefert mir die die funktion DrawPrimitive() die durch d3d.DrawTriangleListVB() aufgerufen wird einen fehler: D3DERR_INVALIDCALL

    es schlägt allerdings scheinbar nur diese funktion fehl.

    kann sich das ganze vielleicht jemand antun und mir nen tipp geben woran das liegen könnte?

    danke sehr 😃

    mfg



  • Setzt du auch irgendwo den StreamSource?



  • jop, sry, hab ich vor lauter copy & paste vergessen 🕶 .

    den setze ich mit vb.SetVB():

    sgeReturn VertexBuffer::SetVB(int offset, int sizeOfVertex)
    {
      if(d3dVertexBuffer == NULL)
      {
        SGE_NULL_POINTER_LOG("d3dVertexBuffer")
        return SGE_ERROR;
      }
    
      if(d3d == NULL)
      {
        SGE_NULL_POINTER_LOG("d3d")
        return SGE_ERROR;
      }
    
      HRESULT r = d3d->GetD3DDevice()->SetStreamSource(0, d3dVertexBuffer, offset, sizeOfVertex);
    
      if(FAILED(r))
      {
        SGE_ERROR_DIRECTX_LOG("SetStreamSource", r)
        return SGE_ERROR;
      }
    
      return SGE_OK;
    }
    

    mfg



  • kann mir keiner helfen? -.-
    oder braucht ihr noch infos?

    thx
    mfg



  • Black Sting schrieb:

    kann mir keiner helfen? -.-
    oder braucht ihr noch infos?

    thx
    mfg

    Sorry, mein THC is alle 🙄



  • Debug runtimes benutzt?

    Bye, TGGC \-/



  • jup, hab ich.

    debugger meldet nix

    thx
    mfg


  • Mod

    Black Sting schrieb:

    jup, hab ich.

    sorry, aber das hast du nicht, denn wenn dir D3D folgendes meldet:

    Black Sting schrieb:

    DrawTriangleListVB() aufgerufen wird einen fehler: D3DERR_INVALIDCALL ...

    dann schreibt d3d in die debugausgabe auch wieso, sofern du den debugmode davon aktiviert hast.

    rapso->greets();



  • hm dann muss ich nochma schauen -.-
    sorry
    und danke 😃
    mfg


Anmelden zum Antworten