Jeśli masz wsparcie dla OpenGL 4.3, jest dokładnie tym celu prosta glCopyImageSubData
:
glCopyImageSubData(tex1, GL_TEXTURE_2D, 0, 0, 0, 0,
tex2, GL_TEXTURE_2D, 0, 0, 0, 0,
width, height, 1);
Oczywiście wymaga to docelowy teksturę już zostać przydzielone z obrazem odpowiedniego rozmiaru i formatu (używając zwykłego glTexImage2D(..., nullptr)
, a może nawet lepiej glTexStorage2D
, jeśli mimo to masz GL 4).
Jeśli tego nie zrobisz, to najlepszym sposobem będzie nadal renderowanie jednej tekstury do drugiej przy użyciu FBO. Na końcu nie trzeba nawet renderować tekstury źródłowej. Możesz po prostu dołączyć obie tekstury do pliku FBO i przenieść jeden kolorowy załącznik do drugiego przy użyciu glBlitFramebuffer
(rdzeń od OpenGL 3 lub z rozszerzeniem GL_EXT_framebuffer_blit w 2.x, praktycznie wszędzie tam, gdzie znajdują się pliki FBO):
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
GL_TEXTURE_2D, tex1, 0);
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT1,
GL_TEXTURE_2D, tex2, 0);
glDrawBuffer(GL_COLOR_ATTACHMENT1);
glBlitFramebuffer(0, 0, width, height, 0, 0, width, height,
GL_COLOR_BUFFER_BIT, GL_NEAREST);
Oczywiście, jeśli robisz to wiele razy, dobrym pomysłem może być utrzymanie tego pliku FBO przy życiu. Podobnie również wymaga to, aby docelowy obraz tekstury miał wcześniej odpowiedni format i format. Możesz także użyć sugestii, aby Michael dołączyć teksturę źródłową do FBO i zrobić dobrą starą glCopyTex(Sub)Image2D
w docelowej teksturze. Wymaga oceny, która działa lepiej (jeśli występuje).
A jeśli nawet nie masz tego, to możesz nadal używać swojego podejścia do czytania jednej tekstury i zapisywania tych danych w drugiej. Ale zamiast używać pamięci procesora jako tymczasowego bufora, użyj pixel buffer object (PBO) (rdzeń od OpenGL 2.1). Nadal będziesz mieć dodatkową kopię, ale przynajmniej będzie to (lub prawdopodobnie będzie) kopia GPU-GPU.
glCopyTexImage2D? –
glCopyTexImage2D kopiowanie z bufora kolorów do tekstury. Myślę, że powinien mieć sposób, który unika renderowania do bufora kolorów lub bufora ramki. – rtrobin
Bufor kolorów w FBO może być również teksturą. –