In Textur Rendern



  • Hallo,
    wie der Titel schon zu erkennen gibt versuche ich mich gerade daran ein Bild in eine Textur zu rendern um diese nachher nutzen zu können.

    Mein Ansatz zum "in die Textur rendern":

    {
      LPDIRECT3DSURFACE9 surface, screen_surface;
      texture->GetSurfaceLevel(0, &surface);
      m_device->GetRenderTarget(0, &screen_surface);
      m_device->SetRenderTarget(0, surface);
      m_device->Clear(0, 0, D3DCLEAR_TARGET, D3DCOLOR_XRGB(250,50,50), 1.0f, 0);
      if (m_device->BeginScene())
      {
        m_device->SetTexture(0, texture);
        m_device->SetStreamSource(0, vertex, 0, sizeof(VERTEX2D));
        m_device->SetFVF(D3DFVF_VERTEX2D);
        m_device->DrawPrimitive(D3DPT_LINELIST, 0, 6);
    
        m_device->EndScene();
      }
      m_device->SetRenderTarget(0, screen_surface);
    }
    

    Textur wird dargestellt mit:

    {
    ..
      sprite->Begin(0);
      sprite->Draw(texture, 0, 0, &pos, 0xFFFFFFFF);
      sprite->End();
      ..
    }
    

    Textur wird erstellt mit:

    {
      m_device->CreateTexture(m_size_x, m_size_y, 1, D3DUSAGE_RENDERTARGET, 
        D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &texture, 0);
    }
    

    Das Problem ist dass nur der "m_device->Clear();" Befehl einen Effekt auf die Textur zu haben scheint - soll heißen sie hat zwar dann die gewünschte Grundfarbe, aber die Striche werden nicht gezeichnet 😞
    Was habe ich hier übersehen? (Und macht man das überhaupt so? :D)



  • OK - hat sich erledigt..
    BeginScene() gibt D3D_OK (0) zurück..
    NUR WARUM ZUM GEIER WURDE DANN ÜBERHAUPT IRGENDWAS ANGEZEIGT?!?
    Ich blick das irgendwie nicht mehr 😃



  • Warum sollte nix angezeigt werden?
    D3D wird sich beim SetRenderTarget nach dem if(BeginScene) denken "der Typ hat das EndScene() vergessen, naja, mach ich es halt für ihn".
    Und du hast die Textur ja davor mit Clear() gelöscht - von daher klar dass das das einzige ist was einen sichtbaren Effekt hatte.

    Schalte einfach mal auf die D3D Debug Runtime um, und dreh den Debug-Output Level auf die zweithöchste Stufe, und beobachte den Debug Output. Die D3D Debug Runtime ist sehr hilfreich wenn es um das finden bzw. vermeiden von Fehlern geht.



  • Danke für den Debug-Tipp - an sowas hatte ich noch gar nicht gedacht.
    Das mit dem "warum wird dann überhaupt etwas angezeigt" ist mir allerdings immer noch schleiferhaft, denn der zweite Render Block hätte ja auch übersprungen werden müssen, wurde aber offensichtlich ausgeführt 😃



  • Verstehe ich nicht.
    Welcher 2. Renderblock?
    Meinst du das sprite->Draw()?
    Da ist ja kein Test (if), von daher kann auch nix übersprungen werden.



  • Ou stimmt das steht ja so gar nicht oben.
    Ich habe um das sprite->Draw() natürlich noch device->BeginScene() und device->EndScene() genau so wie oben. Hätte also übersprungen werden müssen..



  • Hm.
    Müsstest du nochmal zurückbauen wenn's dich wirklich interessiert.
    Vielleicht macht D3D in SetRenderTarget auch nicht automatisch ein EndScene, sondern lässt es durchgehen. Dann würde der 2. BeginScene Call einen Fehler melden (2x BeginScene ohne EndScene ist ja ein Fehler), Fehlercodes sind != 0 -> er geht ins if(BeginScene()) rein -> er rendert was.
    Ist aber nur geraten.



  • Jetzt ists zu spät um das noch mal zurück zu bauen aber irgendsoein komischer Zufall wie Du ihn beschrieben hast wird es wohl gewesen sein 😃


Anmelden zum Antworten