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

How to load texture into openGl using png++?

本文关键字:openGl 纹理 加载 何使用 png++      更新时间:2023-10-16

这一行将把纹理读入内存并存储在图像中:

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?

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

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

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

因为你有一个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,没有行填充。