繁体   English   中英

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

[英]In openGL. How do you copy part of a texture to another texture

我试图创建一个空白(没有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);

如果可以访问OpenGL 4.3或ARB_copy_image扩展名 (或其较旧的表亲NV_copy_image),则可以使用glCopyImageSubData

否则,您可以使用FBO发条。 您将源纹理附加到FBO ,将目标纹理附加到FBO(可能是相同的,但如果是,则显然不是相同的附加点),设置FBO的读取缓冲区绘制缓冲区以从中读取源附件并绘制到目标附件,然后从一个帧缓冲区到另一帧缓冲

顺便说一句,您尝试做的技巧不起作用,因为您从未为新纹理分配存储空间 除非已为该图像的存储分配了存储空间,否则无法为纹理中的图像调用 glTexSubImage 这可以通过调用glTexImage或其他许多功能之一来实现。 “ SubImage”功能全部用于上载到现有存储,而不用于创建新存储。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM