【问题标题】:Scale OpenGL texture and return bitmap in CPU memory在 CPU 内存中缩放 OpenGL 纹理并返回位图
【发布时间】:2018-12-13 16:41:58
【问题描述】:

我在 GPU 上有一个由 OpenGL 纹理 ID 和目标定义的纹理。

我需要在 CPU 内存中进一步处理一个 300 像素的位图(宽度 300 像素,高度与源宽度成比例)。

像素格式应为带有浮点分量的 RGBA、ARGB 或 BGRA。

如何做到这一点?

感谢您的回复。

我尝试了以下方法。但我只得到白色像素:

glEnable(GL_TEXTURE_2D);

// create render texture
GLuint renderedTexture;
glGenTextures(1, &renderedTexture);
glBindTexture(GL_TEXTURE_2D, renderedTexture);
glTexImage2D(GL_TEXTURE_2D, 0,GL_RGB, (GLsizei)analyzeWidth, (GLsizei)analyzeHeight, 0,GL_RGBA, GL_FLOAT, 0);

unsigned int fbo;
glGenFramebuffers(1, &fbo);
glBindFramebuffer(GL_FRAMEBUFFER, fbo);

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, renderedTexture, 0);

// draw texture
glBindTexture(GL_TEXTURE_2D, inTextureId);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

// Draw a textured quad
glBegin(GL_QUADS);
glTexCoord2f(0, 0); glVertex3f(0, 0, 0);
glTexCoord2f(0, 1); glVertex3f(0, 1, 0);
glTexCoord2f(1, 1); glVertex3f(1, 1, 0);
glTexCoord2f(1, 0); glVertex3f(1, 0, 0);
glEnd();

GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if(status == GL_FRAMEBUFFER_COMPLETE)
{

}

unsigned char *buffer = CGBitmapContextGetData(mainCtx);
glReadPixels(0, 0, (GLsizei)analyzeWidth, (GLsizei)analyzeHeight, GL_RGBA, GL_FLOAT, buffer);

glDisable(GL_TEXTURE_2D);
glBindFramebuffer(GL_FRAMEBUFFER, 0); //

glDeleteFramebuffers(1, &fbo);

【问题讨论】:

    标签: macos opengl


    【解决方案1】:
    1. 创建第二个纹理,大小为300*width/height x 300
    2. 创建一个Framebuffer Object 并将新纹理附加为颜色缓冲区。
    3. 为(未缩放的)源纹理设置适当的纹理过滤器。您可以在点采样 (GL_NEAREST) 和双线性过滤 (GL_LINEAR) 之间进行选择。如果您要缩小 2 倍以上,您可能还会考虑使用 mipmapping,并且可能希望首先在源纹理上调用 glGenerateMipmap,然后使用 GL_..._MIPMAP_... 缩小过滤器之一。但是,mipmapping 的可用性将取决于源纹理的创建方式,如果它是没有 mipmap 金字塔的不可变纹理对象,这将不起作用。
    4. 将带纹理的对象(使用原始源纹理)渲染到新纹理。最直观的几何图形是填充视口的矩形,最有效的是单个三角形。
    5. 使用glReadPixels(通过FBO)或glGetTexImage(直接从纹理)读回缩放的纹理。为了提高性能,您可以考虑通过Pixel Buffer Objects 进行异步回读。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多