Dja*_*ngo 4 c++ opengl textures
我正在尝试创建一个空白(白色没有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);
Run Code Online (Sandbox Code Playgroud)
如果您可以访问OpenGL 4.3或ARB_copy_image扩展(或其较旧的表兄,NV_copy_image),那么您可以使用glCopyImageSubData.
否则,您可以使用FBO blitting.您将源纹理附加到FBO,将目标纹理附加到FBO(可能是相同的,但如果是这样,然后显然不是相同的附着点),设置读取缓冲区和绘制缓冲区以供FBO读取源附件并绘制到目标附件,然后从一个帧缓冲区blit到另一个帧缓冲区.
你试图做的伎俩不行,BTW,因为你从来没有为你的新纹理分配存储空间.除非已分配该图像的存储,否则glTexSubImage 无法在纹理中调用图像.这可以通过呼叫或许多其他功能之一."SubImage"功能全部用于上传到现有存储,而不是用于创建新存储.glTexImage