(OpenGL)-Rendering in eine Portable Netzwerkgrafik

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von jvbsl.

    (OpenGL)-Rendering in eine Portable Netzwerkgrafik

    So ich krame jetzt mal "Render to texture" wieder aus!

    Nabend,

    Ich habe mal wieder ein kleines Testprojekt angefangen,
    die Hauptaufgabe des projekts sollte sein, im hintergrund gewisse Szenen mit variabler Auflösung in einzelne PNGs reinzurendern.

    Meine Frage nun: Wie realisiere ich das am besten?

    Ich habe bisher bereits danach gegoogelt und bin dann auf die Methode "Mit OpenGL auf den Bildschirm rendern und abfotografieren" gestoßen.
    Das Problem ist, das ich kein Window habe, weil es minimiert/im hintergrund läuft und die Auflösung auch nicht sehr variabel ist.

    Ich bin was Bibliotheken/Libs angeht sehr flexibel, kennt da jemand eine Methode() :?:

    Grüße und Danke im vorraus,
    Luca ^^ :?:
    こんにちわ
    Achte beim stellen von Fragen auf eine genaue Fragestellung, mir passiert das selbst häufig, andere können dir dann nicht so gut helfen.
    Hey @Bluespide

    Die "Szenen" sind schliecht und ergreifend Polygone (bzw. 3 × 3 Floats mit deren X/Y/Z Punkten) die ich wie in OpenGl rendern würde... aber halt ohne es auf dem Bildschirn auszugeben sondern nur als PNG oder JPEG.

    Wie kann ich das machen?

    Grüße
    こんにちわ
    Achte beim stellen von Fragen auf eine genaue Fragestellung, mir passiert das selbst häufig, andere können dir dann nicht so gut helfen.
    Aha und ist das aufwendig? Also brauchst du dafür wirklich OpenGL? Es würde mit OpenGL funktionieren, aber wenn das nur einfache Polygone sind könntest du ja auch ein Bitmap nehmen. Das kann auch mit Graphics.FillPolygon die Sachen Zeichnen. Vielleicht reicht das dann ja schon, wie würdest du das einschätzen?
    Dann müsste ich diese aber erst von 3D zu 2D umrechnen, das wäre ja noch einigermaßen möglich. Aber wie sieht es denn mit texturen aus? Kann ich polygone mit textur zeichnen?

    Grüße
    こんにちわ
    Achte beim stellen von Fragen auf eine genaue Fragestellung, mir passiert das selbst häufig, andere können dir dann nicht so gut helfen.
    Wenn du also OpenGL nehmen willst, dann kannst du einfach ein Panel erstellen und mit dem Handle dann OpenGL initialisieren. Dabei muss das Panel nicht der Form hinzugefügt werden und ist damit auch nicht sichtbar. Du brauchst auch keine Textur, du zeichnest einfach deine Szene horizontal gespiegelt. Nach dem GL.Finish(); kannst du dann ca. so das ganze in ein Bitmap laden und abspeichern:

    C#-Quellcode

    1. int imageWidth = 200;
    2. int imageHeight = 200;
    3. byte[] data = new byte[imageWidth * imageHeight * 4];
    4. GL.ReadPixels(0, 0, imageWidth, imageHeight, GL.BGRA, GL.UNSIGNED_BYTE, data);
    5. using (Bitmap newBitmap = new Bitmap(imageWidth, imageHeight)) {
    6. BitmapData bd = newBitmap.LockBits(new Rectangle(0, 0, imageWidth, imageHeight), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);
    7. unsafe {
    8. fixed (void* ptr = data) {
    9. WinAPI.Memcpy(bd.Scan0, new IntPtr(ptr), new UIntPtr((ulong)(imageWidth * imageHeight * 4L)));
    10. }
    11. }
    12. newBitmap.UnlockBits(bd);
    13. newBitmap.Save(@"C:\Users\Andreas\Desktop\test.png");
    14. }
    Erstell lieber einen Framebuffer, dafür wurde er schließlich gemacht, ist außerdem auch performancetechnisch meines Wissens besser als glReadPixels.
    Den behandelst am Ende dann auch nicht anders als ne Textur. Kannst dich evtl. ja davon inspirieren lassen:
    github.com/OctoAwesome/engenio…raphics/RenderTarget2D.cs
    Und vor dem Rendern einfach glBindFramebuffer. Mit glGetTexImage holst dir außerdem die Pixeldaten.

    Was ich gerne zum kopieren von solchen Dingen verwende:
    github.com/OctoAwesome/engenio…us/Helper/MemoryHelper.cs
    Hast keine WinAPI abhängigkeit. Funktioniert also auch unter Linux/Mac mit Mono.
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---