Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Di Jul 15, 2025 17:23

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Farbe einer Textur an (x|y)
BeitragVerfasst: Sa Jul 24, 2004 13:53 
Offline
DGL Member
Benutzeravatar

Registriert: Do Nov 13, 2003 17:04
Beiträge: 13
Hi,

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jul 24, 2004 17:09 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jul 24, 2004 17:18 
Offline
DGL Member
Benutzeravatar

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jul 24, 2004 17:52 
Offline
DGL Member
Benutzeravatar

Registriert: Do Nov 13, 2003 17:04
Beiträge: 13
Dummerweise müsste ich dann ja nach jedem Rendern auf die Textur wieder meine Info aktualisieren :?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jul 24, 2004 18:14 
Offline
DGL Member
Benutzeravatar

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jul 24, 2004 18:46 
Offline
DGL Member
Benutzeravatar

Registriert: Do Nov 13, 2003 17:04
Beiträge: 13
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)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jul 24, 2004 21:23 
Offline
DGL Member
Benutzeravatar

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jul 24, 2004 22:21 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Wofür ist das denn gedacht? Vielleicht ist das nicht die richtige Methode für dein Problem.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jul 25, 2004 00:41 
Offline
DGL Member
Benutzeravatar

Registriert: Do Nov 13, 2003 17:04
Beiträge: 13
Zitat:
Da kannst du dann auch jedes Pixel von openGL einzeln abfragen.

:shock: Textur rüberkopieren geht schneller als 5x GetPixel? :roll:

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. :mrgreen:

@Lars:
Es geht um eine Landschaft, auf der ein paar Figuren stehen. Die Landschaft kann jetzt steigen, sinken, durchlöchert werden, usw.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jul 25, 2004 15:38 
Offline
DGL Member
Benutzeravatar

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 26, 2004 21:52 
Offline
DGL Member
Benutzeravatar

Registriert: Do Nov 13, 2003 17:04
Beiträge: 13
Das Problem ist schon seit ein paar Antworten gelöst :roll: (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. :D

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 26, 2004 22:21 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
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.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

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.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 15 Queries | GZIP : On ]