如何使用png ++将纹理加载到openGl中?

时间:2016-10-16 21:35:09

标签: c++ opengl libpng

此行将纹理读入内存并将其存储在图像中:

png::image<png::rgba_pixel> image("texture.png");

然后该行应将其加载到openGL内存中:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image.get_width(), image.get_height(), 0, GL_ABGR, GL_UNSIGNED_BYTE, image.get_pixbuf());

但是,最后一个参数应该是const void*,但image.get_pixbuf()会返回pixbuf。如何将图像中的像素数据转换为openGL?

忽略我错误指定的任何其他参数,我稍后会修复它,这根本就不起作用。

1 个答案:

答案 0 :(得分:1)

OpenGL不能提前知道任何人可能希望传递的类型(因为它几乎可以与任何库一起使用),因此它需要一个指向原始缓冲区的通用const void*指针,并依赖它您可以使用提供的元数据准确描述它。

png++ library的情况下,您需要在抽象中挖掘几层,因为它为您包装图像,行和像素。

由于您有一个png::image个实例,get_pixbuf()会返回一个png::pixbuf个实例,您可以从中获取对get_row(0)的第一行的引用,该行返回您的像素类型的png::row_traits专精。这使您可以访问缓冲区的第一行,此时您最终可以使用get_data()方法请求原始缓冲区指针。 (这是第一行的第一个字节,因此指向连续缓冲区的开始。)

所以这样的事情应该可以解决问题:

const void* buffer = image.get_pixbuf().get_row(0).get_data();

glTexImage2D(GL_TEXTURE_2D,
             0,
             GL_RGBA,
             image.get_width(),
             image.get_height(),
             0,
             GL_ABGR,
             GL_UNSIGNED_BYTE,
             buffer);

假设您的图像数据是8位RGBA,没有行填充。