2011-01-26 83 views
2

我试图使用libpng将图片拆分成不同的块。原因是我无法在我目前正在使用的硬件上加载大于512x512的纹理。我之前用SDL和SDL_Image的混合来完成此任务。我基本上使用SDL_BlitSurface中的srcrect参数来复制图像的一部分,然后将其转换为OpenGL纹理。将它与一个水平方向的简单循环结合起来,然后垂直地获得一个纹理数组,每个纹理的最大值为512x512。然后,这只是把它们放在正确位置的问题。使用libpng将图片“拆分”为片段

现在,我没有奢侈的使用SDL,所以我想通过libpng直接做到这一点是可能的。基于一些谷歌搜索,我认为它只是使用png_read_rows来读取我需要的部分。但这就是我被困住的地方,我不确定如何去做。另外,如果你想知道为什么我不把图像分割成gimp/photoshop/paint或者其他什么,那是因为我不控制它们,而是在运行时下载它们。

感谢您的帮助提前。

回答

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)