如果我必须纹理IDSrcID和DestID如何将srcID的一部分复制到DestId给定要复制的部分的标准化坐标,src和dest的宽度和高度
SrcID
DestID
deyfvvtc1#
您可以使用glCopyImageSubData执行此操作。glCopyImageSubData
glCopyImageSubData(SrcID, GL_TEXTURE_2D, 0, 0, 0, 0, DestID, GL_TEXTURE_2D, 0, 0, 0, 0, width, height, 1);
lrpiutwd2#
你可以把纹理附加到一个帧缓冲区,然后使用glBlitFramebuffer。我不能测试下面的代码,但它应该是正确的。你只需要指定像素的坐标,但它很容易计算,通过乘以归一化坐标的纹理尺寸。
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);
2条答案
按热度按时间deyfvvtc1#
您可以使用glCopyImageSubData执行此操作。
glCopyImageSubData
lrpiutwd2#
你可以把纹理附加到一个帧缓冲区,然后使用
glBlitFramebuffer
。我不能测试下面的代码,但它应该是正确的。你只需要指定像素的坐标,但它很容易计算,通过乘以归一化坐标的纹理尺寸。