我正在尝试使用 libpng 将图像分割成不同的 block 。原因是我无法在我当前正在使用的硬件上加载大于 512x512 的纹理。我之前使用 SDL 和 SDL_Image 的混合来完成此操作。我基本上使用 SDL_BlitSurface 中的 srcrect 参数来复制图像的一部分,然后将其转换为 OpenGL 纹理。将其与水平然后垂直的简单循环相结合,我能够获得一组纹理,每个纹理的最大尺寸为 512x512。然后只需将它们渲染到正确的位置即可。
现在,我没有机会使用 SDL,所以我认为可以通过 libpng 直接自己完成此操作。基于一些谷歌搜索,我认为这只是使用 png_read_rows 来读取我需要的部分的问题。但这就是我陷入困境的地方,我不太确定该怎么做。
此外,如果您想知道为什么我不只是在 gimp/photoshop/paint 或其他工具中分割图像,那是因为我无法控制它们并在运行时下载它们。
感谢您提前提供的帮助。
最佳答案
您不必费力地提取图 block 。您可以告诉 OpenGL 仅使用您提供的数据的一部分来初始化纹理。关键字是 glPixelStorei(GL_UNPACK...) 参数。假设您的输入图像的尺寸为 img.width
和 img.height
,并且 RGB 像素有 4 个字节,即每个像素填充一个字节,并且您的子图片定义为subimg.off_x
、subimg.off_y
、subimg.width
、subimg.height
。然后你可以像这样加载它:
glPixelStorei(GL_UNPACK_ROW_LENGTH, img.width)
glPixelStorei(GL_UNPACK_SKIP_PIXELS, subimg.off_x)
glPixelStorei(GL_UNPACK_SKIP_ROWS, subimg.off_y)
glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
glTexImage2D(GL_TEXTURE_2D, GL_RGB, 0,
subimg.width, subimg.height, 0,
GL_RGBA, GL_UNSIGNED_BYTE, pixeldata)
关于opengl - 使用libpng将 "split"图像分割成片段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4801478/