在openGL中。如何将纹理的一部分复制到另一个纹理

Posted

技术标签:

【中文标题】在openGL中。如何将纹理的一部分复制到另一个纹理【英文标题】:In openGL. How do you copy part of a texture to another texture 【发布时间】:2013-07-16 17:06:10 【问题描述】:

我正在尝试创建一个空白(没有 alpha 的白色)纹理,我可以在其中加载其他纹理并写入其中的一部分。我尝试只需要获取纹理的一部分,然后使用 glTexSubImage2D 将它放在那里似乎无法正常工作。任何人都知道如何做到这一点?我做错了什么?

int sourceTextWidth;
int sourceTextHeight;
int sourceFormat;
int formatOffset = 0;

//bind the texture
glBindTexture( GL_TEXTURE_2D, textureID );

//get its params
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_COMPONENTS, &sourceFormat);
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &sourceTextWidth);
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &sourceTextHeight);
switch (sourceFormat)

    case GL_RGB:
    
        formatOffset = 3;
    
    break;
    case GL_RGBA:
    
        formatOffset = 4;
    
    break;

if (formatOffset == 0)

    return false;



unsigned char * sourceData = (unsigned char *)malloc(sourceTextWidth * sourceTextHeight * formatOffset);

glGetTexImage(GL_TEXTURE_2D, 0, GL_RGB, GL_UNSIGNED_BYTE, sourceData);

glBindTexture( GL_TEXTURE_2D, m_currentTextureId );

unsigned char * destData = (unsigned char *)malloc(width * height * 3);



glGetTexImage(GL_TEXTURE_2D, 0, GL_RGB, GL_UNSIGNED_BYTE, sourceData);

for (int i = 0; i < height; ++i)
       
memcpy(&destData[(i * width * 3) ], &sourceData[((i + y) * sourceTextWidth * 3) + (x * 3)], width * 3);

//glDeleteTextures (1, m_currentTextureId);
glBindTexture( GL_TEXTURE_2D, m_currentTextureId );

glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, width, height, GL_RGB,GL_UNSIGNED_BYTE, destData );
free(destData);
free(sourceData);

【问题讨论】:

尝试为此使用 glCopyTexSubImage2D:opengl.org/sdk/docs/man/xhtml/glCopyTexSubImage2D.xml 我用 OpenGL 回答了这个关于 GPU 内部副本的问题,但 *** 变得愚蠢,因为我的非常精确的问题被标记为与一个糟糕的不精确的问题重复,而另一位高排名用户甚至改变了我的问题以拒绝再感慨。现在我希望每个人都能在自己找到问题的解决方案时获得很多乐趣。 How to copy texture1 to texture2 efficiently?的可能重复 【参考方案1】:

如果您有权访问OpenGL 4.3 or the ARB_copy_image extension(或其老表亲,NV_copy_image),那么您可以访问use glCopyImageSubData

否则,您可以使用 FBO 位图。您将源纹理附加到 an FBO,将目标纹理附加到 FBO(可能是同一个,但如果是,那么显然不是同一个附加点),将 FBO 的 read buffers 和 draw buffers 设置为从源附件读取并绘制到目标附件,然后blit from one framebuffer to the other。

顺便说一句,您尝试做的技巧不起作用,因为您从未为新纹理分配 存储glTexSubImage 不能为纹理中的图像调用,除非已分配 storage for that image。这可以通过call to glTexImage or one of a number of other functions.“SubImage”功能全部用于上传到现有存储,而不是用于创建新存储。

【讨论】:

谢谢!我在让它工作时遇到了一些问题,但它有效且有效。

以上是关于在openGL中。如何将纹理的一部分复制到另一个纹理的主要内容,如果未能解决你的问题,请参考以下文章

将绑定到 FBO 的纹理复制到另一个 OpenGL 上下文

如何将部分纹理复制到opengl中的图像

如何将纹理应用到四边形以纹理立方体?

如何向我的 openGL 程序添加多个纹理?

如何让纹理在 OpenGL 中工作?

找不到使用 C# 在 openGL 中将纹理应用于 3d 对象的方法