Hallo
Ich hab mich schon ein bisschen durch das forum gekämpft und auch das einsteiger tutorial gelesen.
Allerdings komm ich immernoch nicht zurecht.
Was ich eigentlich will ist von einem spiel (medal of honor) einen screenshot machen.
Ich hab das schon programmiert, allerdings über die windows funktionen:
hier habe ich aber das problem, daß overlays bzw. huds und manchmal auch die spieler oder models nicht am screenshot drauf sind.
jetzt hab ich mir gedacht ich muß doch dirrekt den grafikspeicher auslesen können.
ich hab versucht eine funktion von Sascha Willems aus diesem forum zu nutzen aber bin kläglich gescheitert.
Ich hab dazu ein template runtergeladen und die funktion einfach mit einem button aufgerufen. damit macht er mir auch ein bild allerdings nur von dem fenster des templates und da auch nur ein schwarzes bild.
Wenn ich das richtig verstehe, muß ich beim inizialisieren der ogl funktionen den handle des fensters übergeben:
Code:
DC := GetDC(Handle);
handle also im sinn von HWND - also würde das dann der handle von dem spiel fenster sein????.
Das würde aber bedeuten ich initalisiere opengl erst nachdem das spiel gestartet ist und ich den handle davon hab.
danach mach ich das init und ruf die screenshot funktion auf?
oder hab ich das komplett falsch verstanden?
ich frag deshalb nach, weil ich schon seit 2 tagen damit rumspiel und einfach keinen screenshot zusammenbekom lol.
Registriert: So Dez 19, 2004 00:27 Beiträge: 454 Wohnort: Nürnberg
ich weiß nicht ab es das ist, was du meinst, aber während dem Bild die "Druck"-Taste drücken (über Einfg ), und dann kannst du das Bild
in Paint oder so einfügen
Also von SnagIt7 weiß ich, dass es DirectX verwenden kann, um DirectX Ausgaben zu photographieren. Funktioniert auch einwandfrei. Für OpenGL konnte ich das aber IMHO ganz normal machen.
Dein Problem mit dem nicht vorhandenen HUD dürfte sich leicht erklären lassen. Bei FRAPS war ja cuh eine README dabei, wo ein paar Denkansätze gegeben wurden. Und da wurde auch vom Doublebuffering gesprochen. Es kann einfach sein, dass du ein Bild machst, zu diesem Zeitpunkt aber das HUD noch im Grafikspeicher rumliegt und erst in der nächsten Millisekunde danach gezeichnet wird, dann aber dafür der Rest von der Graphik fehlt.
Dagegen gibt es jetzt direkt AFAIK kein richtiges Mittel, außer höchstens irgendwie Doublebuffering auszumachen, was aber leider wohl flachfallen dürfte...
_________________ "Für kein Tier wird so viel gearbeitet wie für die Katz'."
ja ist mir bekannt die druck taste - jetzt mal im ernst.
ich schreib ein anticheat tool für medal of honor - sogar ein sehr gutes.
es wird ja auch schon verwenden in diversen ligen.
ich mach screenshots vom desktop eben mit scrcopy und da fehlen mir leider diese huds.
ich lade die auch dirrekt auf den anticheat server rauf.
Das funktioniert alles wunderbar - bis auf zwei dinge.
1. es lagt sehr beim screenshot holen (nicht beim raufladen).
2. es ist nicht alles drauf was drauf sein sollte.
ich poste mal was ich mir zusammengebastelt hab - ich bekomm aber leider kein bild sondern nur sinnlose grafik pixel.
Registriert: Fr Mai 14, 2004 18:56 Beiträge: 804 Wohnort: GER/OBB/TÖL-WOR/Greiling
wie wäre es denn, wenn du
1. die framerate holst(sollte ja gehen, die meisten anticheat-tools sind ja hacks)
2. 2 bis 4 shots innerhalb dieser zeitspanne machst
3. und dann mal schaust was rauskommt?
das wäre bestimmt interessant, oder?
EDIT: natürlich mit der methode, die funktioniert, aber das hud o.ä. fehlt.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Also warum es bei dir lagt kann ich dir sagen. (Denke ich mal)
1. glReadPixels ist ziemlich langsam.
2. Als JPG Komprimieren ist ebenso sehr langsam.
Wenn du beides zusammen in einem Atemzug machst, dürfte der Rechner ca 750ms (PI mal Daumen) mit deiner Arbeit beschäftigt sein. Das führt dann natürlich unweigerlich dazu, dass es langsam ist.
Was mich allerdings ein wenig wundert ist die Tatsache, dass das Auslesen des Fensterinhaltes (zwar auch nicht wesentlich schneller) keine sinnvollen Ergebnisse geliefert hat. Normal ließt du ja nur das aus was auf dem Bildschirm dargestellt wird. Das sollte ja ein sinnvolles Bild sein.
Außerdem erstellst du deinen eigenen RenderContext auf dem Fenster von Medal of Honor. Wenn ich mich nicht irre dürften die dann nichts miteinander zu tun haben. Habe so etwas aber auch noch nie probiert.
Allerdings das schon mal angesprochene Fraps macht das. Wäre mal ganz interessant herraus zufinden was er genau macht. Der ist nämlich auch in der Lage auf sinnvolle Art und Weise ein Screenshot von einem Programm anzufertigen.
@ Lossy eX
du hast das falsch verstanden - die methode die ich bisher benutzt habe schaut so aus und das funktioniert recht gut.
bis auf lag und das fehlen von teilen:
und hier vom gleichen spieler ein bild - wo einfach alles fehlt - der spieler selbst alle anzeigen und auch die gegner.
Das ist für einen anitcheat unbrauchbar
Also versuche ich eine methode zu finden wo ich alles drauf bekomme und nach möglichkeit nicht die windows funktionen verwendet (wegen lag).
Arnulf
Moderiert von Lossy eX: Code durch Pascaltag ersetzt
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Zitat:
also ob die farbpalette nicht stimmt ...
Ne. Du das ist keine falsche Farbpalette. Ich arbeite derzeit an Bildern an denen ich die Farbpalette verändere. Und die Bilder sehen noch wesentlich mehr nach Bildern aus als dein willenloser Speicherauszug. Wie du bei dem Bild siehst ist das ein wiederkehrendes Muster. Ich tippe einfach mal darauf, dass das in nicht initialisierter Speicherbereich ist. Also als ob du etwas ausgelesen hättest was vorher von etwas anderem verwendet wurde. Also texturen oder so. Aber dafür ist das eigentlich zu durcheinander.
Was mir aber da gerade auffällt. Ist jetzt auch nicht wichtig, weil es ja eh nicht funktioniert. Evtl wäre es sinnvoll, nicht so viel Aktionen durchzuführen. Also in dem Code von sniper. Erst Bilddaten auslesen, dann Rot und Blau Tauschen, dann Alpha wegschmeißen. Die beiden letzten Aktionen könnte man in eine packen. Also RGB in BGR umformen und gleichzeitig das Alpha wegfallen lassen. Somit spart man sich schon ein mal den Speicher zu kopieren. Noch besser wäre es aber wenn OpenGL einem das richtige Format liefert. glReadPixels müsste das Format GL_BGR verstehen. Somit wäre der Buffer den wir von OpenGL bekommen auch genau schon das was wir direkt auf die Platte schreiben könnten. Somit würden keine zusätzlichen Speicherkopierereien anfallen. Das aber nur mal so am Rande.
Zitat:
du hast das falsch verstanden - die methode die ich bisher benutzt habe schaut so aus und das funktioniert recht gut. bis auf lag und das fehlen von teilen:
Na ja. Ich meinte mit dem nicht funktionieren ja eigentlich das Fehlen von verschiedenen Teilen. Aber Wundern tut es mich dennoch wieso da so etwas dabei raus kommt.
Hat du schon mal versucht nicht den Desktop (GetDC(0)) sondern das mit dem DC des Fensters zu machen? Ich denke mal ja. Aber sicher ist sicher.
PS: Wenn du Code postest dann benutz bitte die Pascaltags und nicht die Code Tags. Danke.
Registriert: Mi Dez 15, 2004 20:36 Beiträge: 454 Wohnort: Wien, Österreich
Zitat:
Ich hab die methode von sniper_w probiert aber es kommt das gleiche raus wie mit dem bitmap bzw. jpg.
Natürlich kommt nichts, weli du kein Zugriff auf RC von MedalOfHonor hast. Sonst, mit einem eigenem RC geht es wunderbar, schließlich ist das so in Quake II gemacht.
_________________ "Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump
Mitglieder in diesem Forum: 0 Mitglieder und 10 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.