Próbuję wykonać renderowanie OpenGL ES 2.0 do pliku obrazu, niezależnie od renderowania wyświetlanego na ekranie użytkownikowi. Obraz, który renderuję, ma inny rozmiar niż ekran użytkownika. Potrzebuję tylko tablicy bajtowej danych GL_RGB. Jestem zaznajomiony z glReadPixels, ale nie sądzę, że w tym przypadku byłaby to dobra sztuczka, ponieważ nie wyciągam z już renderowanego ekranu użytkownika.Renderowanie OpenGL ES 2.0 do obrazu
Pseudokod:
// Switch rendering to another buffer (framebuffer? renderbuffer?)
// Draw code here
// Save byte array of rendered data GL_RGB to file
// Switch rendering back to user's screen.
Jak mogę to zrobić bez przerywania wyświetlacz użytkownika? Wolałbym nie migotać ekranu użytkownika, rysując żądane informacje dla pojedynczej klatki, glReadPixel-ing, a następnie znikając.
Ponownie, nie chcę, aby pokazywał cokolwiek użytkownikowi. Oto mój kod. Nie działa. Czy coś mi brakuje?
unsigned int canvasFrameBuffer;
bglGenFramebuffers(1, &canvasFrameBuffer);
bglBindFramebuffer(BGL_RENDERBUFFER, canvasFrameBuffer);
unsigned int canvasRenderBuffer;
bglGenRenderbuffers(1, &canvasRenderBuffer);
bglBindRenderbuffer(BGL_RENDERBUFFER, canvasRenderBuffer);
bglRenderbufferStorage(BGL_RENDERBUFFER, BGL_RGBA4, width, height);
bglFramebufferRenderbuffer(BGL_FRAMEBUFFER, BGL_COLOR_ATTACHMENT0, BGL_RENDERBUFFER, canvasRenderBuffer);
unsigned int canvasTexture;
bglGenTextures(1, &canvasTexture);
bglBindTexture(BGL_TEXTURE_2D, canvasTexture);
bglTexImage2D(BGL_TEXTURE_2D, 0, BGL_RGB, width, height, 0, BGL_RGB, BGL_UNSIGNED_BYTE, 0);
bglFramebufferTexture2D(BGL_FRAMEBUFFER, BGL_COLOR_ATTACHMENT0, BGL_TEXTURE_2D, canvasTexture, 0);
Matrix::matrix_t identity;
Matrix::LoadIdentity(&identity);
bglClearColor(1.0f, 1.0f, 1.0f, 1.0f);
bglClear(BGL_COLOR_BUFFER_BIT);
Draw(&identity, &identity, this);
bglFlush();
bglFinish();
byte *buffer = (byte*)Z_Malloc(width * height * 4, ZT_STATIC);
bglReadPixels(0, 0, width, height, BGL_RGB, BGL_UNSIGNED_BYTE, buffer);
SaveTGA("canvas.tga", buffer, width, height);
Z_Free(buffer);
// unbind frame buffer
bglBindRenderbuffer(BGL_RENDERBUFFER, 0);
bglBindFramebuffer(BGL_FRAMEBUFFER, 0);
bglDeleteTextures(1, &canvasTexture);
bglDeleteRenderbuffers(1, &canvasRenderBuffer);
bglDeleteFramebuffers(1, &canvasFrameBuffer);
znalazłem pewne informacje na temat renderowania-do -tekstury, ale nie jestem pewien, czy tego chcę, ponieważ chcę renderować do te tablica do zapisywania/analizowania danych obrazu. Ciekawi mnie, jaka jest właściwa ścieżka. – user1054922
Określa, czy bufor kończy się na ekranie, czy nie, GPU nadal musi go renderować. Nie ma sposobu, aby renderowanie poza ekranem nie wpłynęło na wydajność ... –
Nie mówię o wpływie na wydajność, mówię o tym, że nic nie pokazywałem użytkownikowi (np. Migotanie) – user1054922