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);