将部分纹理复制到另一个纹理 OpenGL 4.6 C++
Copy part of texture to another texture OpenGL 4.6 C++
如果我必须纹理 ID
SrcID
和 DestID
如何将srcID的一部分复制到DestId
给定要复制的部分的归一化坐标,src和dest的宽度和高度
normailsed 我的意思是它们在 0 和 1 之间
您可以将纹理附加到帧缓冲区,然后使用 glBlitFramebuffer
。我无法测试下面的代码,但它应该是正确的。您只需要以像素为单位指定坐标,但通过将归一化坐标乘以纹理尺寸很容易计算。
GLuint FboID;
glGenFramebuffers(1, &FboID);
glBindFramebuffer(GL_FRAMEBUFFER, FboID);
// Attach the textures to atttachment slots
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, SrcID, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, DestID, 0);
// Prepare to read from first attachment (src texture)
// and draw into second attachment (dst texture)
glReadBuffer(GL_COLOR_ATTACHMENT0);
GLenum[] DstBuffer = { GL_COLOR_ATTACHMENT1 };
glDrawBuffers(1, &DstBuffer);
// Fill those pixel coordinates from your normalized coordinates
// (e.g. srcX0 = 0.2f * srcWidth)
GLint srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1;
glBlitFramebuffer(
srcX0, srcY0,
srcX1, srcY1,
dstX0, dstY0,
dstX1, dstY1
GL_COLOR_BUFFER_BIT,
GL_LINEAR);
glBindFramebuffer(GL_FRAMEBUFFER, 0); // disable FBO
// optionally delete FBO, if you won't need it anymore
// glDeleteFramebuffers(1, &FboID);
您可以为此使用 glCopyImageSubData。
glCopyImageSubData(SrcID, GL_TEXTURE_2D, 0, 0, 0, 0,
DestID, GL_TEXTURE_2D, 0, 0, 0, 0,
width, height, 1);
如果我必须纹理 ID
SrcID
和 DestID
如何将srcID的一部分复制到DestId
给定要复制的部分的归一化坐标,src和dest的宽度和高度
normailsed 我的意思是它们在 0 和 1 之间
您可以将纹理附加到帧缓冲区,然后使用 glBlitFramebuffer
。我无法测试下面的代码,但它应该是正确的。您只需要以像素为单位指定坐标,但通过将归一化坐标乘以纹理尺寸很容易计算。
GLuint FboID;
glGenFramebuffers(1, &FboID);
glBindFramebuffer(GL_FRAMEBUFFER, FboID);
// Attach the textures to atttachment slots
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, SrcID, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, DestID, 0);
// Prepare to read from first attachment (src texture)
// and draw into second attachment (dst texture)
glReadBuffer(GL_COLOR_ATTACHMENT0);
GLenum[] DstBuffer = { GL_COLOR_ATTACHMENT1 };
glDrawBuffers(1, &DstBuffer);
// Fill those pixel coordinates from your normalized coordinates
// (e.g. srcX0 = 0.2f * srcWidth)
GLint srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1;
glBlitFramebuffer(
srcX0, srcY0,
srcX1, srcY1,
dstX0, dstY0,
dstX1, dstY1
GL_COLOR_BUFFER_BIT,
GL_LINEAR);
glBindFramebuffer(GL_FRAMEBUFFER, 0); // disable FBO
// optionally delete FBO, if you won't need it anymore
// glDeleteFramebuffers(1, &FboID);
您可以为此使用 glCopyImageSubData。
glCopyImageSubData(SrcID, GL_TEXTURE_2D, 0, 0, 0, 0,
DestID, GL_TEXTURE_2D, 0, 0, 0, 0,
width, height, 1);