这一行将把纹理读入内存并存储在图像中:
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,没有行填充。