DX11 - Texturpixel manipulieren



  • Hi Leute,

    Ich möchte einen alten Software Renderer von mir wiederbeleben der noch mit DirectDraw in den vram geschrieben hat. Dazu möchte DX11 verwenden, hab aber keine Ahnung davon.

    Mein Bild liegt als array im Ram vor. Ich hab irgendwo gelesen dass es die Möglichkeit gibt eine Textur zu rendern und den array jeden Frame auf die Textur zu kopieren.
    Wie finde ich heraus welche DX Funktionen überhaupt aufgerufen werden müssen um sowas zu bewerkstelligen? Langes Suchen in den Funktionslisten der DX Doku hat mich wenig weitergebracht und ich fühl mich etwas erschlagen.

    Bitte um etwas Rat. Vielleicht gibt es auch eine andere und performante Möglichkeit?



  • Ich kann kein Direct3D(X) aber unter OpenGL gibt es eine Funktion um Pixel aus einem Pointer in einen Buffer zu kopieren. Das sollte performanter sein, als ein texturiertes Quad zu Zeichnen, da dieses die Pipeline durchqueren müsste.

    MfG, EOutOfResources



  • Naja ich fürchte dir wird nichts andres übrig bleiben als die Grundlagen von D3D11 zu lernen wenn du das verwenden willst. Tutorials gibts z.B. hier: http://msdn.microsoft.com/en-us/library/ff729717.aspx

    Der grundlegende Ablauf ist einfach:

    1. Textur erstellen (z.B. dynamische Textur die per Map() upgedated wird)
    2. In jedem Frame neue Daten in Textur kopieren und ein Bildfüllendes Quad mit der Textur drauf zeichnen

    In D3D11 involviert dieser Ablauf aber die ganze Pipeline, d.h. du musst da sogar deine eigenen Shader schreiben auch wenn du nur ein einfaches Quad auf den Schirm bringen willst. Mit D3D9 oder OpenGL wär das sicher etwas einfacher aber der mit Abstand allereinfachste Weg führt denk ich über GDI: http://msdn.microsoft.com/en-us/library/dd145121.aspx



  • Das sollte performanter sein, als ein texturiertes Quad zu Zeichnen, da dieses die Pipeline durchqueren müsste.

    dot schrieb:

    In D3D11 involviert dieser Ablauf aber die ganze Pipeline, d.h. du musst da sogar deine eigenen Shader schreiben auch wenn du nur ein einfaches Quad auf den Schirm bringen willst.

    Hm.

    Ich hätte schon die GDI benutzt, möchte aber irgendwann Compute Shader für größere Berechnungen integrieren. Ich hatte nur gehofft da gibts ne einfache Lösung damit ich mir Zeit spare und endlich Algorithmen entwickeln kann. Die API interessiert mich ja nicht so.

    Meinst du mit Dynamische Textur diese flags?

    screen_desc.Usage = D3D11_USAGE_DYNAMIC;
    screen_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE | D3D11_CPU_ACCESS_READ;
    

    muss ich die cpu flags setzen?



  • Kontrasubjekt schrieb:

    Ich hätte schon die GDI benutzt, möchte aber irgendwann Compute Shader für größere Berechnungen integrieren. Ich hatte nur gehofft da gibts ne einfache Lösung damit ich mir Zeit spare und endlich Algorithmen entwickeln kann. Die API interessiert mich ja nicht so.

    Wenn du mit ComputeShadern arbeiten willst sollte dich die API aber besser doch interessieren da du dann zwangsweise viel damit zu tun haben wirst^^

    Kontrasubjekt schrieb:

    Meinst du mit Dynamische Textur diese flags?

    screen_desc.Usage = D3D11_USAGE_DYNAMIC;
    screen_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE | D3D11_CPU_ACCESS_READ;
    

    muss ich die cpu flags setzen?

    Ja und Ja, aber nur write und keinen read access. Du kannst alternativ auch mit UpdateSubresource, CopyResource, etc. arbeiten, ziemlich viele Wege führen da nach Rom, dürfte für deine Zwecke aber keinen großen Unterschied machen. Du kannst es evtl. auch irgendwie hinbiegen dass du deine Daten direkt in den BackBuffer schreiben kannst (per Map bzw. UpdateSubresource, CopyResource, oder direkt mit dem ComputeShader reinschreiben, whatever) das musste ich nur noch nie machen daher kann ich nur die Vermutung äußern dass das möglich sein könnte.



  • Vielen Dank, sowas hab ich gesucht.

    Wenn du mit ComputeShadern arbeiten willst sollte dich die API aber besser doch interessieren da du dann zwangsweise viel damit zu tun haben wirst

    Ja, ich versuchs halt in Grenzen zu halten. Für die ComputeShader hab ich mir schon code geschrieben, da gibts überraschend viele Resourcen dazu. Funktionen wie du sie genannt hast fand ich jetzt schwieriger zu finden.

    Also ich erstelle meine textur, mach paar minimalistische shader und render dann ein quad. Vor dem Draw() UpdateSubresource auf die Textur.
    oder ich update die textur die ich zum erstellen des backbuffers benutzt hab?

    swapchain->GetBuffer(0, __uuidof(backbuf_txt), reinterpret_cast<void**>(&backbuf_txt));
    


  • Kontrasubjekt schrieb:

    Funktionen wie du sie genannt hast fand ich jetzt schwieriger zu finden.

    http://msdn.microsoft.com/en-us/library/ff476080.aspx !?

    Kontrasubjekt schrieb:

    Also ich erstelle meine textur, mach paar minimalistische shader und render dann ein quad. Vor dem Draw() UpdateSubresource auf die Textur.
    oder ich update die textur die ich zum erstellen des backbuffers benutzt hab?

    swapchain->GetBuffer(0, __uuidof(backbuf_txt), reinterpret_cast<void**>(&backbuf_txt));
    

    Ja, nur bin ich mir nicht sicher ob du einfach so den Backbuffer updaten kannst, evtl. musst du zumindest mit den Flags der SwapChain rumspielen damit das geht, wie gesagt ich musste das noch nie machen daher kann ich nur mal vermuten...



  • dot schrieb:

    Kontrasubjekt schrieb:

    Funktionen wie du sie genannt hast fand ich jetzt schwieriger zu finden.

    http://msdn.microsoft.com/en-us/library/ff476080.aspx !?

    Jaja, aber rate mal als Anfänger das Textur updates Ressourcen updates sind. Klingt jetzt für mich auch logisch, beim durchschauen der Listen ist das alles gleich spanisch. Hab doch erst gestern gelernt wie man devices, swapchain und alles drumherum initialisiert. 😉

    Ja, nur bin ich mir nicht sicher ob du einfach so den Backbuffer updaten kannst, evtl. musst du zumindest mit den Flags der SwapChain rumspielen damit das geht

    Jep, ich probier mal rum.



  • ok, klappt mit dem reinschreiben in den backbuffer. Das ist alles was nötig war, flags musste ich nicht ändern:

    devcon->UpdateSubresource(backbuf_txt, 0, 0, &screen.data[0], sizeof(screen.data[0]) * screen.width, sizeof(screen.data[0]) * screen.height);
    swapchain->Present(0, 0);
    

    👍


Anmelden zum Antworten