opengl - 使用libpng将 "split"图像分割成片段

标签 opengl libpng

我正在尝试使用 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.widthimg.height,并且 RGB 像素有 4 个字节,即每个像素填充一个字节,并且您的子图片定义为subimg.off_xsubimg.off_ysubimg.widthsubimg.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/

相关文章:

c - 如何正确安装libpng?

python - 即使重新安装 matplotlib、libpng 和 brew 后,导入 pylab 也会失败

c - libpng 的 png 大小

c++ - glDrawArrays 抛出 1282 错误并且不绘制任何东西

c++ - 纹理未应用于二维几何体

c++ - 在另一个线程中绘制 OpenGL

c++ - png_read_image 访问冲突?

c++ - 在 Qt 应用程序中使用 glad loader

c - 将 glBegin 和 glEnd 之间的代码块括在方括号中的目的是什么?

opencv - 如何在 Ubuntu 16.04 中从 libjpeg.so.8 更新到 libjpeg.so.9?