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

How to load texture into openGl using png++?

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

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() returns pixbuf。如何将图像中的像素数据导入 openGL?

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

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

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

因为你有一个 png::image 实例,get_pixbuf() 将 return 你一个 png::pixbuf 实例,你可以从中获得对第一行的引用 get_row(0),其中 return 是您的像素类型的 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,没有行填充。