Ich arbeite an einer 2D-Schicht-basierten Anwendung, und ich würde gerne das Compositing mit WebGL machen. Die Schichten könnten relativ zueinander verschoben sein, und jeder Rahmen könnte nur einen kleinen (rechteckigen) Teil jeder Schicht ändern. Die Breite und Höhe dieses rechteckigen Teils können jedoch unvorhersehbar variieren. Ich möchte eine Leinwand (2D) und eine Textur pro Ebene verwenden, und jeder Rahmen zeichnet auf jeder Leinwand nur den Teil der Ebene, der verändert wurde, und lädt diesen kleinen Bereich einfach auf die GPU, um den entsprechenden Teil zu aktualisieren Textur, bevor die GPU das Compositing für mich macht. Allerdings habe ich keinen effizienten Weg gefunden, nur einen Teil eines Bildes in einen Teil einer Textur zu laden. Es scheint, dass texSubImage2D()
kann aktualisieren einen Teil einer Textur, aber nur vollständige Bilder/Leinwände, und es scheint nicht möglich, einen rechteckigen Bereich des Bildes zu verwenden, um zu verwenden.WebGL: Gibt es eine effiziente Möglichkeit, nur einen Teil eines Bildes/Canvas als Textur hochzuladen?
Ich habe ein paar Möglichkeiten gedacht, dies zu tun, aber jeder scheint offensichtlich, Overhead zu haben:
- Verwendung
getImageData()
+texSubImage2D()
nur den Teil auf die GPU zu laden, die bei der Umwandlung der Leinwand Pixel ändert (Overhead Daten zu Imagedata) - Wieder laden die Leinwand ganze Schicht, die jeden Rahmen mit
texImage2D()
- oder erstellen/eine kleine Canvas2D auf die richtige Dimension die Größe perfekt für jede Schicht Modifikation zu passen, dann
texSubImage2D()
verwenden sie es zu senden, um die damit verbundenen aktualisieren Textur (Speicher r Aufbereitungs-Overhead)
Gibt es also eine Möglichkeit, einen Teil eines Bildes/einer Leinwand für die Textur anzugeben? Etwas wie texImagePart2D()
und texSubImagePart2D
, die beide vier weitere Parameter akzeptieren würden, sourceX
, sourceY
, sourceWidth
und sourceHeight
, um den Rect-Bereich des Bildes/Canvas zu spezifizieren?
In den meisten eingebetteten GPUs atleast wird die TexSubImage2D API langsamer sein. Es könnte besser sein, TexImage2D selbst zu verwenden. – prabindh
Es gibt also keinen schnelleren Weg als die gesamte Textur neu zu laden, auch wenn nur ein Teil davon verändert wurde? Aber ich verstehe nicht, warum wäre es langsamer, wenn es nur ein kleines Rect und nicht die ganze Textur hochlädt? Liegt es daran, dass das Ändern einer vorhandenen Textur langsam ist? – Jor