Laden...

[gelöst] Screenshot von opengl-spiel machen?

Erstellt von Floste vor 14 Jahren Letzter Beitrag vor 14 Jahren 2.461 Views
Floste Themenstarter:in
1.130 Beiträge seit 2007
vor 14 Jahren
[gelöst] Screenshot von opengl-spiel machen?

mit manchen spielen geht das wuinderbar, mit anderen bekomme ich ein komplett schwarzes bild:


            using (Graphics gx = Graphics.FromImage(screenShot))
            {
                gx.CopyFromScreen(rect.X, rect.Y, 0, 0, rect.Size);
            }

Wie kann ich von so einem einem störrischen spiel jatzt screenshots machen?

Edit: ich hab erst jetzt bemerkt, dass das spiel ned directx, sondern opengl benutzt!

Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!

479 Beiträge seit 2008
vor 14 Jahren

Hallo floste,

man kann in DirectX das erstellen von Screenshots in den PresentParams verbieten, vllt ist das dein Problem.

mfg.
markus111

[Follow me on Twitter](http://twitter.com/blendingsky)
Floste Themenstarter:in
1.130 Beiträge seit 2007
vor 14 Jahren

Ich habe grade bemerkt, dass das spiel ned directx, sondern opengl benutzt.

Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!

H
91 Beiträge seit 2007
vor 14 Jahren

Lies lieber den framebuffer direct aus: ReadPixels. Ein Beispiel unter Verwendung von OpenTK:

          BitmapData bmpData = bitmap.LockBits(bounds,ImageLockMode.ReadWrite,
                                 System.Drawing.Imaging.PixelFormat.Format24bppRgb); 
            // reset any changes to pixel store
            GL.PixelStore(PixelStoreParameter.UnpackAlignment,4.0f); 
            GL.PixelStore(PixelStoreParameter.UnpackRowLength,bmpData.Width); 
            GL.PixelStore(PixelStoreParameter.UnpackSkipRows,bounds.Y); 
            GL.PixelStore(PixelStoreParameter.UnpackSkipPixels,bounds.X); 
            GL.ReadPixels(0,0,bounds.Width,bounds.Height,OpenTK.Graphics.PixelFormat.Bgr,
                          PixelType.UnsignedByte,(IntPtr)bmpData.Scan0); 
            bitmap.UnlockBits(bmpData); 
            bitmap.RotateFlip(RotateFlipType.RotateNoneFlipY); 

==============================
heute schon numerics gehabt? Dann nichts wie
hin zu : ILNumerics.Net - numerics for .NET

Floste Themenstarter:in
1.130 Beiträge seit 2007
vor 14 Jahren

Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt. bei GL.PixelStore

Muss ich den code im prozess des Spiels ausführen oder wie?

Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!

H
91 Beiträge seit 2007
vor 14 Jahren

die zeilen mit pixelstore brauchst du ggf. auch gar nicht.

==============================
heute schon numerics gehabt? Dann nichts wie
hin zu : ILNumerics.Net - numerics for .NET

Floste Themenstarter:in
1.130 Beiträge seit 2007
vor 14 Jahren

bei csGl seh ich ohne mal wieder schwarz.
bei OpenTK wieder null reference

Grr ich hab jetzt mal reflektiert, was da los is und es gibt nen delegaten für jede funktion. der ist null.

Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!

H
91 Beiträge seit 2007
vor 14 Jahren

hm, ja. Du musst die Lib schon richtig initialisieren. Lies Dir mal die Doku durch, bitte 😉 Womit machst Du denn den ganzen anderen OpenGL Kram? Also welche Bindings nimmst Du sonst? OpenTK war ja auch nur mein Beispiel, weil ich das nutze. Sonst machs doch einfach genauso, wie Du sonst Begin(..) und End() benutzt!

==============================
heute schon numerics gehabt? Dann nichts wie
hin zu : ILNumerics.Net - numerics for .NET

Floste Themenstarter:in
1.130 Beiträge seit 2007
vor 14 Jahren

Das is garned mein spiel sondern ein fertiges in nem anderen prozess! Deshalb hab ich mich auch gefragt, ob ich das im selben prozess oder sogar im selben thread ausführen muss.... (vllt. irgendne opengl-funktion hooken?)

Hätte nie gedacht, dass es so schwer sein kann, an die bilddaten auf dem Bildschirm zu kommen.

Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!

H
91 Beiträge seit 2007
vor 14 Jahren

Ah. verstehe. Ja, das sollte vom selben Thread ausgeführt werden, der auch den OpenGL-Kontext erzeugt hat. Schlimmstenfalls - falls Du da nicht ran kommst - müsstest Du die Daten aber auch direkt vom Screen lesen können? (Dann gäbe es aber evtl. noch Synchronitäts-Issues zu beachten, könnt ich mir vorstellen. )

==============================
heute schon numerics gehabt? Dann nichts wie
hin zu : ILNumerics.Net - numerics for .NET

Floste Themenstarter:in
1.130 Beiträge seit 2007
vor 14 Jahren

Juchu!!!!!!!! Es klappt!!!
War allerdings etwas kompliziert:
Also: Mit meinem Snippet ( Globale Hooks mit c# (nichtnur lowlevel) unten) injeziere ich meine Anwendung in das Spiel und erstelle mit einkopilieren Easyhook einen Hook auf "wglSwapBuffers". Dort rufe ich dann "glReadPixels" auf. Die Bilder stehen allerdings komischerweise auf dem Kopf^^.

Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!