Ich suche nach einer Möglichkeit die Farbe eines bestimmten Pixels auf einer Textur zu ermitteln (es geht um Kollisionsabfrage)
An sich wäre das ja kein großes Problem, weil ich einfach die Textur in ein TBitmap oder sonstetwas laden könnte, aber es soll zwischendurch auf die Textur gerendert werden (Einschusslöcher, etc.)
Nach einer Suche mit google hatte ich glCopyPixels und glReadPixels gefunden, aber ob oder wie ich das dafür benutzen könnte...?
Falls es hilft: Es soll im Ortho-Modus gerendert werden.
Mit glReadPixels kann die Farben,Tiefenwerte,Stencil usw.. die gerendert wurden zurücklesen. Mit glGetTexImage kann man den Inhalt einer Texture lesen, also genau das Gegenstück zu glTexImage. Allerdings sind diese Befehle nicht umbedingt sehr schnell.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Sinnvoller wäre es wahrscheinlich, wenn du beim Generieren der Texturen ein Kollisionsinfo, was speziell für deinen Fall optimiert und zugeschnitten ist, anlegst und dann bei der eigentlichen Kollisionsabfrage, dann nur noch auf diese Hochoptimierten Infos zugreifst.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Das ist durchaus richtig. Aber meinst du es ist besser, wenn du bei jeder Kollisionsabfrage (wahrscheinlich bei jedem Frame oder Bewegung) die Pixel deiner Textur untersuchen musst? Und das dann über den langsamen PerPixel Zugriff?
Mal im Ernst. Ich bin davon ausgegangen, dass es sich dabei nur um eine Textur handelt (wäre ein nützliche Info gewesen, dass dies nicht so ist). Aber in dem Fall musst du entweder auf die Farben zugreifen oder dir etwas anderes einfallen lassen. Und auf die Farben ist immer so eine Sache. Das sind recht langsame Zugriffe. Du solltest das wenn dann nur 1 Mal machen. Sinnvoller wäre es evtl, wenn du deine möglichen Bilder, beim Laden, vorrenderst (evtl sogar im speicher ablegen) und die Infos berechnen oder etwas ganz anderes. Das kommt aber darauf was du vor hast. Und da würde mich mal interessieren, was genau du da renderst. Evtl ist es auch gar nicht nötig das im laufenden Programm zu machen. Vielleicht reicht es ja, wenn man das in irgeneiner form vereinfacht. Aber zur Laufzeit ständig über die Pixel eine Kollision zu berechnen ist mit Sicherheit nicht die sinnvollste Lösung.
PS: Vielleicht könntest du dir ja auch mittels occlusion_query sagen lassen, ob dort eine Kollision existiert oder nicht. Das kommt aber immer auf deine Anforderung an.
Jetzt wo du es sagst... wahrscheinlich könnte ich einfach alles in einer normalen Bitmap durch GDI nachbilden. Dann müsste ich zwar GetPixel bzw. Canvas.Pixels benutzen, aber so oft werden diese Abfragen auch wieder nicht gemacht und ich muss mir nicht stängid wieder aktualisierte Daten von OpenGL zukommen lassen.
Ob es sich um eine oder mehrere Texturen handelt ist in meinem Fall relativ egal, weil nur in seltenen Fällen mehrere Texturen gleichzeitig aktualisiert werden (z.B. wenn gerade auf den Rand von einer geschossen wurde)
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
obbschtkuche hat geschrieben:
Jetzt wo du es sagst... wahrscheinlich könnte ich einfach alles in einer normalen Bitmap durch GDI nachbilden. Dann müsste ich zwar GetPixel bzw. Canvas.Pixels benutzen, aber so oft werden diese Abfragen auch wieder nicht gemacht und ich muss mir nicht stängid wieder aktualisierte Daten von OpenGL zukommen lassen.
Um gottes Willen. Benutz auf keinen Fall GetPixel oder die GDI. Da kannst du dann auch jedes Pixel von openGL einzeln abfragen. Das ist dann noch schneller. Das ist so ziemlich das Langsamste was mir bisher unter die Augen gekommen ist. Ein Bitmap geht. Dann würde ich aber von Pixels auch abraten, da das auch sehr einfach schneller geht. Benutze von dem Bitmap die Scanlines methode. Damit kannst du dann direkt auf den Speicher des Bildes zugriefen. Da Scanlines auch ein Wenig overhead verursacht, kannst du die Pointer die Scanline zurückliefert in einem dynamischen Array abspeichern. Solltest du dann allerdings aktualisieren, sobald du das Bild änderst. Die könnten sich dann wieder ändern.
Da kannst du dann auch jedes Pixel von openGL einzeln abfragen.
Textur rüberkopieren geht schneller als 5x GetPixel?
Lossy eX hat geschrieben:
obbschtkuche hat geschrieben:
Dann würde ich aber von Pixels auch abraten, da das auch sehr einfach schneller geht. Benutze von dem Bitmap die Scanlines methode.
Ich glaube eher weniger dass Scanline noch signifikant schneller ist wenn ich die Pixel an der Positon 10/10, danach 20/50 und dann 30/90 abfrage. GetPixel ist in meinem Fall aber allemal schnell genug - und ich weiß nicht wie lange ScanLine für DIBNeeded usw. benötigt.
Zitat:
Da Scanlines auch ein Wenig overhead verursacht, kannst du die Pointer die Scanline zurückliefert in einem dynamischen Array abspeichern
Ich kann mir auch einfach den Pointer von der letzten Zeile nehmen und schon kann ich auf alles zugreifen.
@Lars:
Es geht um eine Landschaft, auf der ein paar Figuren stehen. Die Landschaft kann jetzt steigen, sinken, durchlöchert werden, usw.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Zitat:
Ich glaube eher weniger dass Scanline noch signifikant schneller ist wenn ich die Pixel an der Positon 10/10, danach 20/50 und dann 30/90 abfrage. GetPixel ist in meinem Fall aber allemal schnell genug - und ich weiß nicht wie lange ScanLine für DIBNeeded usw. benötigt.
Das ist zum Beispiel auch wieder so eine nützliche Nebeninformation, die wir hätten vorher gebraucht!! Aber ja. In diesem Falle ist der Unterschied sehr gering und bei der Anzahl an Durchläufen (an der Zahl 3???) die du machst ist die Zeit dafür vernachlässigbar.
An dieser Stelle bitte ich dich noch einmal GENAU zu beschreiben was du vor hast und was du derzeit bereits zur Verfügung hast. Denn nur so können wir dir qualifiziert helfen. Sonst können wir nur raten was du eigentlich von uns willst. Und Hilfe wirst du so dann auch nicht bekommen. Um so besser deine Frage gestellt ist um so besser wird auch die Antwort sein.
PS: Es hat mit Sicherheit einen Grund, warum man für jede Zeile einen Pointer abfragen kann. Also würde ich mich nicht darauf verlassen, dass das Bild auch tatsächlich am Stück im Speicher liegt.
Das Problem ist schon seit ein paar Antworten gelöst (Siehe "jetzt wo du es sagst..."-Posting)
Lossy eX hat geschrieben:
An dieser Stelle bitte ich dich noch einmal GENAU zu beschreiben was du vor hast und was du derzeit bereits zur Verfügung hast. Denn nur so können wir dir qualifiziert helfen. Sonst können wir nur raten was du eigentlich von uns willst. Und Hilfe wirst du so dann auch nicht bekommen. Um so besser deine Frage gestellt ist um so besser wird auch die Antwort sein.
Habe ich doch: Ich wollte die Farbe eines Pixels einer Textur auslesen und hatte absolut keine Idee wie ich das am besten anstellen könnte. Da ich das ganze aber jetzt per GDI nachbilden werde (Es geht nur um ein paar Kreise) hat sich das Problem erledigt.
Lossy eX hat geschrieben:
PS: Es hat mit Sicherheit einen Grund, warum man für jede Zeile einen Pointer abfragen kann. Also würde ich mich nicht darauf verlassen, dass das Bild auch tatsächlich am Stück im Speicher liegt.
Natürlich hat es einen Zweck, weil der Programmierer nicht unbedingt noch rumrechnen will.
Aber das Bild liegt natürlich IMMER an einem Stück im Speicher. Stell dir mal vor das GDI müsste beim Zeichnen einer Bitmap für jede Zeile erst die Adresse abfragen (Womöglich auch noch mal für ds Ziel) und könnte dann erst anfangen zu Zeichnen. Nicht gerade optimal.
Das Bild liegt deshalb nicht unbedingt an einem Stück im Speicher weil es viel leichter ist bestimmte Werte wie z.B. Zweipotenzen für der Breite zu verwenden.
Mitglieder in diesem Forum: Majestic-12 [Bot] und 15 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.