C++ 如何使用png++;?

C++ 如何使用png++;?,c++,opengl,libpng,C++,Opengl,Libpng,此行将把纹理读入内存并存储在图像中: png::image<png::rgba_pixel> image("texture.png"); 但是,最后一个参数应该是const void*,但是image.get\u pixbuf()返回pixbuf。如何将图像中的像素数据导入openGL 忽略我错误指定的任何其他参数,我稍后会修复它,这是一个根本不起作用的参数。OpenGL无法提前知道任何人可能希望传入的类型(因为它可以处理几乎任何库),因此它需要一个指向原始缓冲区的通用const

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

png::image<png::rgba_pixel> image("texture.png");
但是,最后一个参数应该是
const void*
,但是
image.get\u pixbuf()
返回
pixbuf
。如何将图像中的像素数据导入openGL


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

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

在的情况下,您需要在抽象中深入挖掘几层,因为它为您包装了图像、行和像素

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

所以,像这样的事情应该可以做到:

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,没有行填充。

std::string pathToPng=“dummy.png”;png::图像图像(pathToPng);png::gray_pixel*buffer=image.get_pixbuf().get_行(0.get_数据())/src/a.cpp:在函数“int main(int,const char**)”中:../src/a.cpp:101:65:错误:“png::basic_pixel_buffer::row_type”没有名为“get_data”的成员png::gray_pixel*buffer=image.get_pixbuf().get_row(0).get_data();似乎线路加载不太正确。GL_ABGR正确吗?我找不到它,GL_BGRA被定义为tho,但它是另一个序列排序。我丢了一个头球?(仅适用于GLFW和GLEW)
GL_ABGR
GL_EXT_ABGR
扩展中定义,该扩展受到普遍支持,但您可能必须启用它。
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);