Ich versuche, SDL_LockTexture und SDL_UnlockTexture zum direkten Bearbeiten von Pixeln in einer Textur zu verwenden. Ich benutze SDL 2.0. Durch Festlegen des Pixelwerts mithilfe des folgenden Codes wird die Textur nicht geändert:
void *pixels;
int pitch;
SDL_LockTexture(mytexture, NULL, &pixels, &pitch);
// Set pixel 100,100 to blue
((uint32_t *)pixels)[100 * 100] = 255;
SDL_UnlockTexture(mytexture);
Antworten:
Das Färben von SDL-Texturen kann etwas schwierig sein. Der folgende Code sollte die wichtigsten Punkte beim Färben einer Textur beschreiben. Der Schlüssel besteht darin, alle erforderlichen Daten aus SDL abzurufen, bevor mit der Änderung der Textur begonnen wird.
Jetzt sollten Sie auch beachten, dass das Ändern von Texturen im Code relativ teuer ist. Außerdem ist der Code nicht sehr sauber, da das Bearbeiten von C ++ int-Zeigerarrays und das Übersetzen von Farben in verschiedene Formate zu Problemen führen kann, da die Vorgänge dort möglicherweise nicht so klar sind, wie sie benötigt werden. Dies jedoch nur dann zu tun, wenn dies unbedingt erforderlich ist, sollte nicht zu viele Probleme verursachen.
Möglicherweise möchten Sie auch
SDL_SetRenderTarget
die Textur verwenden und ändern, indem Sie sie rendern. Bei einigen Aufgaben ist das Rendern von Grundelementen für die Textur möglicherweise keine Option. Dies ist jedoch der Fall, wenn Sie die Pixel wie folgt ändern.quelle
surface->BytesPerPixel
, es ist nicht sicher anzunehmen, dass ... usw.SDL_MapRGB
ist jedoch ein gültiger Punkt.falsch - Sie benötigen die Details des "Oberflächen" -Formats aus der Textur - bevor Sie MapRGB blind verwenden können.
Um die Daten zu erhalten, fragen Sie die Textur ab, wie oben beschrieben.
MapRGB erwartet, dass das Oberflächen-> Format (in meinem Fall das Oberflächenformat ^ .format) übergeben wird. check (SDL-Syntax in den Header-Dateien)
Das Rendern der Textur ist die effizientere Methode für SDL2. Sie rendern im Allgemeinen stapelweise - aktualisieren Sie keine einzelnen Pixel - (zumindest nicht bis zur nächsten Bildschirmaktualisierung). Viele Leute rendern und realisieren es. Nicht präsentieren, bis der Bildschirm (der Monitor) dazu bereit ist - dies führt zu "Flimmern". Persönlich würde ich warten, bis alles gerendert ist, um fertig zu sein ... und dann die nächste Charge von Operationen vorbereiten.
quelle