2

我正在尝试使用 libpng 将图像拆分为不同的块。原因是我无法在我目前正在使用的硬件上加载大于 512x512 的纹理。我之前通过混合使用 SDL 和 SDL_Image 来完成此操作。我基本上使用 SDL_BlitSurface 中的 srcrect 参数来复制图像的一部分,然后将其转换为 OpenGL 纹理。将其与水平然后垂直的简单循环相结合,我能够获得一组纹理,每个最大为 512x512。然后只需将它们渲染到正确的位置即可。

现在,我没有使用 SDL 的奢侈,所以我认为可以通过 libpng 自己直接执行此操作。基于一些谷歌搜索,我认为这只是使用 png_read_rows 来读取我需要的部分的问题。但这就是我卡住的地方,我不确定该怎么做。

另外,如果您想知道为什么我不只是将图像拆分为 gimp/photoshop/paint 或其他什么,那是因为我不控制它们并且在运行时下载它们。

我在这里先向您的帮助表示感谢。

4

1 回答 1

4

您不必费心提取瓷砖。你可以告诉 OpenGL 只使用你给它的数据的一部分来初始化纹理。关键字是 glPixelStorei(GL_UNPACK...) 参数。假设您的输入图像具有尺寸img.widthimg.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)
于 2011-01-26T11:01:53.327 回答