Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi [OpenGL] pixelweise verarbeiten (https://www.delphipraxis.net/22280-%5Bopengl%5D-pixelweise-verarbeiten.html)

nailor 15. Mai 2004 12:59


[OpenGL] pixelweise verarbeiten
 
Hi,
ich habe ein Programm, dass für einzelne Pixel Farbwerte bestimmt und einen Mauszeiger anzeigt.

Wenn man nun bei jedem Frame jeden Pixel neu berechnet (die Liste mit den gespeicherten Farbwerten durchgeht), wird das sehr schnell langsam. Wenn man mit Display-Listen arbeitet, wird die Sache schon ne ganze Ecke schneller, da sich die Pixel nur relativ selten ändern. Danach noch den Mauszeiger zeichnen, und fertig ist der Frame. Allerdings werden auch die Listen nach einer Weile langsam, wenn man sehr viele Pixel hat. Daher ist meine Frage, ob man das ganze irgendwie noch schneller machen kann. Wie gesagt, der eigentliche Bildschirminhalt ändert sich nur realtiv selten...

nailor

Muetze1 15. Mai 2004 16:52

Re: [OpenGL] pixelweise verarbeiten
 
Moin!

Optimiere die Liste nebenbei noch. Im Detail: Schmeisse die Pixel wieder raus, die eine sehr selten abgefragte Farbe haben und alle anderen bleiben drinne, so dass du immer einen festen Stamm von Einträgen drinne hast.

Zusätzlich kannst du die Liste noch zugriffsorientiert sortieren.

MfG
Muetze1

nailor 15. Mai 2004 17:01

Re: [OpenGL] pixelweise verarbeiten
 
ich muss immer entweder alle pixel neu einlesen, oder aber das alte bild (bis auf den mauszeiger) nochmal verwenden...

irgendwie werde ich aus deinem beitrag nicht schlau

moritz 15. Mai 2004 17:02

Re: [OpenGL] pixelweise verarbeiten
 
Ich werd aus beiden Beiträge ned schlau :gruebel:

nailor 15. Mai 2004 19:35

Re: [OpenGL] pixelweise verarbeiten
 
im prinzip ist es so (nur prinzip nicht ganz genau):

ich hab ein 2-dimensionales array, wo drinsteht, welcher pixel welche farbe bekommt

und immer wenn sich da was ändert, will ich die pixel neu setzen. da ich aber mit opengl arbeite (also ohne vcl und so was) muss ich mich immer drum kümmern, dass der ganze bildschirm neu gezeichnet wird (und das muss ich immer, wenn die maus bewegt wird). dann muss ich aber auch alle pixel neu machen, was viel zu lange dauert. deshalb suche ich eine möglichlkeit, die pixel schneller zu setzen.

weil die sich nur relativ selten (aber noch oft genug) ändern, war meine erste idee eine display-liste. die hat zwar geholfen, aber noch nicht genug. perfekt wäre es, wenn ich den kompletten bilschirm, bevor der mauszeiger gezeichnet wird, irgendwie auf einen stack packen könnte, dann den mauszeiger zeichnen, und beim nächsten frame entweder alles neu machen (falls sich was geändert hat) oder einfach das alte vom stack hohlen könnte (wenn alles geblieben ist). dann sofort wieder auf den stack, den mauszeiger dabei, und warten auf den nächsten frame...

dann wäre das komplett neu zeichnen _wesentlich_ seltener nötig, und die sache erheblich beschleunigt.

hoffe, jetzt versteht man mich!

nailor

moritz 15. Mai 2004 19:57

Re: [OpenGL] pixelweise verarbeiten
 
Hallo

Jupp! :) Also in DirectX gibt es sg. Surfaces, also Buffer außerhalb des anzeigebereichs. Diese kannst dann in den Backbuffer kopieren, und dann den Mausziger zeichnen. Das kopieren geht Flott da das Surface auch im Grafikspeicher liegt. Vielleicht gibt es sowas ja auch in OpenGl

Schönen Gruß

nailor 15. Mai 2004 20:03

Re: [OpenGL] pixelweise verarbeiten
 
Zitat:

Zitat von Onz
Vielleicht gibt es sowas ja auch in OpenGl

das will ich doch grade rausfinden

Jan 3. Dez 2005 12:55

Re: [OpenGL] pixelweise verarbeiten
 
Hallo Nailor,

Dieser Beitrag kommt zwar reichlich spät, aber vielleicht hilft er ja doch nocht.

Ich weiß, dass man in OpenGL das Quadbuffering aktivieren kann, dazu wird dann die doppelte Menge an Speicher für die Ausgabe reserviert.
Das wird zum Beispiel für stereo-rendering genutzt.
Vielleicht hilft dir allerdings auch schon doublebuffering weiter, wenn du den 2. Buffer noch nicht nutzt.

Ich aktiviere das bei mir so:

Delphi-Quellcode:
RC:= CreateRenderingContext( DC,
                               [opDoubleBuffered],
                               32,
                               24,
                               0,0,0,
                               0);
und dann kann man den derzeit zum bearbeiten aktiven Buffer mit

Delphi-Quellcode:
SwapBuffers(DC);
zum aktiven Bildschirmbuffer machen.

Wahrscheinlich weißt du das alles selber, aber das war so das, was mir zur Frage nach einem weiteren Buffer einfiel.

Gruß
Jan

sniper_w 3. Dez 2005 13:10

Re: [OpenGL] pixelweise verarbeiten
 
Wenn ich es richtig verstanden habe, dann brauchst du eine Textur als Render-Ziel. Dh du renderst alles auf einer Textur, solle sich nichts ändern, zeichnest du sie immer wieder + Cursor. Sollte das Bedarf bestehen, etwas zu ändern, renderst wieder auf Textur und so wieter....


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:16 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz