OpenGL将纹理的一部分复制/粘贴到另一个纹理中

时间:2015-01-01 15:58:35

标签: java opengl textures

我需要从不同的精灵表中取出一堆图像,然后将它们以特定的方式放入我的游戏的一个纹理中(虽然我对OpenGL不是很熟悉)。那么,在OpenGL中从纹理的较小部分制作纹理的最佳方法是什么?在OpenGL中将两个或多个纹理组合成一个纹理的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

使用glBlitFramebuffer()执行此操作的最直接方式。您将需要两个FBO(帧缓冲对象):一个用于源,一个用于目标。然后将源和目标纹理附加到FBO,并调用glBlitFramebuffer()

代码看起来像这样,srcTexId源纹理的纹理名称,dstTexId目标:

GLuint fboIds[2];
glGenFramebuffers(2, fboIds);

glBindFramebuffer(GL_READ_FRAMEBUFFER, fboIds[0]);
glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
                       GL_TEXTURE_2D, srcTexId, 0);

glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fboIds[1]);
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
                       GL_TEXTURE_2D, dstTexId, 0);

glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1,
                  dstX0, dstY0, dstX1, dstY1,
                  GL_COLOR_BUFFER_BIT, GL_NEAREST);

glBlitFramebuffer()的前8个参数指定源和目标纹理中的矩形。

答案 1 :(得分:0)

在OpenGL中有许多不同的方法可以实现。假设一个可靠的现代GL版本,我建议使用FBOs。将目标纹理绑定为一个FBO的颜色附件。然后,您可以简单地渲染纹理四边形(使用源纹理区域)。您甚至可以完全跳过渲染步骤,也可以使用FBO作为源纹理,并使用glBlitFramebuffer()直接对部件进行blit。