此行将纹理读入内存并将其存储在图像中:
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?
忽略我错误指定的任何其他参数,我稍后会修复它,这根本就不起作用。
答案 0 :(得分:1)
OpenGL不能提前知道任何人可能希望传递的类型(因为它几乎可以与任何库一起使用),因此它需要一个指向原始缓冲区的通用const void*
指针,并依赖它您可以使用提供的元数据准确描述它。
在png++ library的情况下,您需要在抽象中挖掘几层,因为它为您包装图像,行和像素。
由于您有一个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,没有行填充。