Opengl es 将OpenGL ES 2.0渲染为图像

Opengl es 将OpenGL ES 2.0渲染为图像,opengl-es,Opengl Es,我正在尝试对图像文件进行一些OpenGL ES 2.0渲染,与屏幕上向用户显示的渲染无关。我要渲染到的图像的大小与用户屏幕的大小不同。我只需要一个GL_RGB数据的字节数组。我熟悉glReadPixels,但我不认为它在这种情况下会起作用,因为我不是从已经渲染的用户屏幕中提取 伪代码: // Switch rendering to another buffer (framebuffer? renderbuffer?) // Draw code here // Save byte array

我正在尝试对图像文件进行一些OpenGL ES 2.0渲染,与屏幕上向用户显示的渲染无关。我要渲染到的图像的大小与用户屏幕的大小不同。我只需要一个GL_RGB数据的字节数组。我熟悉glReadPixels,但我不认为它在这种情况下会起作用,因为我不是从已经渲染的用户屏幕中提取

伪代码:

// 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.
如何在不中断用户显示的情况下执行此操作?我宁愿不必闪烁用户的屏幕,为一帧绘制我想要的信息,读取像素然后让它消失

同样,我不希望它向用户显示任何内容。这是我的密码。不起作用。。我错过什么了吗

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);

可以渲染到纹理,读取像素并使用该纹理绘制四边形(如果要向用户显示)。它不应闪烁,但会明显降低性能

例如,在iOS上:


    • 这是一个解决方案,适用于任何需要它的人:

          // Create framebuffer
      unsigned int canvasFrameBuffer;
      glGenFramebuffers(1, &canvasFrameBuffer);
      glBindFramebuffer(GL_RENDERBUFFER, canvasFrameBuffer);
      
      // Attach renderbuffer
      unsigned int canvasRenderBuffer;
      glGenRenderbuffers(1, &canvasRenderBuffer);
      glBindRenderbuffer(GL_RENDERBUFFER, canvasRenderBuffer);
      glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA4, width, height);
      glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, canvasRenderBuffer);
      
          // Clear the target (optional)
      glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
      glClear(GL_COLOR_BUFFER_BIT);
      
          // Draw whatever you want here
      
      char *buffer = (char*)malloc(width * height * 3);
      glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, buffer);
      SaveTGA("canvas.tga", buffer, width, height); // Your own function to save the image data to a file (in this case, a TGA)
      free(buffer);
      
      // unbind frame buffer
      glBindRenderbuffer(GL_RENDERBUFFER, 0);
      glBindFramebuffer(GL_FRAMEBUFFER, 0);
      glDeleteRenderbuffers(1, &canvasRenderBuffer);
      glDeleteFramebuffers(1, &canvasFrameBuffer);
      

      我找到了一些关于渲染到纹理的信息,但我不确定这是我想要的,因为我想渲染到字节数组以保存/分析图像数据。我很好奇正确的路径是什么。缓冲区是否最终出现在屏幕上,GPU仍然需要渲染它。没有办法让屏幕外渲染不影响性能…我不是说影响性能,我是说不向用户显示任何内容(即闪烁)非ES版本:| |用我试图渲染到屏幕外纹理的一些代码更新了帖子。用stackoverflow上的答案更新了我的答案和一些相关问题。我没有看到对glBindFramebuffer的调用,是在Draw中吗?Draw()只包含基本的OpenGL绘图代码。。。绑定数组和gldrawArray等。OpenGL ES 2.0没有glReadBuffer。。。?我读了你的链接,其中一个发布了一个“解决方案”,但它看起来非常具体。正在寻找仅适用于GL的内容。是的,我的错,您不需要glReadBuffer,版本太多:)如果宽度/高度大于GL\U MAX\U RENDERBUFFER\U大小,您可以建议怎么做?所以不可能创建所需大小的renderbuffer…我无法在linux上运行它。什么是BGL_RGBA4、ZT_CACHE和Z_MALLOC、SAVE_TGA、Z_FREE?抱歉,这些是我构建的函数。我已经编辑了我的帖子,用标准的等价物替换它们。