如何使用 png++ 将纹理加载到 openGl 中?
How to load texture into openGl using png++?
此行会将纹理读入内存并将其存储在图像中:
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()
returns pixbuf
。如何将图像中的像素数据导入 openGL?
忽略我错误指定的任何其他参数,我稍后会修复它,这是根本不起作用的。
OpenGL 无法提前知道任何人可能想要传入的类型(因为它几乎可以与任何库一起使用),因此它需要一个通用的 const void*
指针指向您的原始缓冲区,并依赖于请您使用提供的元数据准确描述它。
在 png++ library 的情况下,您需要在抽象中向下挖掘几层,因为它会为您包装图像、行和像素。
因为你有一个 png::image
实例,get_pixbuf()
将 return 你一个 png::pixbuf
实例,你可以从中获得对第一行的引用 get_row(0)
,其中 return 是您的像素类型的 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,没有行填充。
此行会将纹理读入内存并将其存储在图像中:
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()
returns pixbuf
。如何将图像中的像素数据导入 openGL?
忽略我错误指定的任何其他参数,我稍后会修复它,这是根本不起作用的。
OpenGL 无法提前知道任何人可能想要传入的类型(因为它几乎可以与任何库一起使用),因此它需要一个通用的 const void*
指针指向您的原始缓冲区,并依赖于请您使用提供的元数据准确描述它。
在 png++ library 的情况下,您需要在抽象中向下挖掘几层,因为它会为您包装图像、行和像素。
因为你有一个 png::image
实例,get_pixbuf()
将 return 你一个 png::pixbuf
实例,你可以从中获得对第一行的引用 get_row(0)
,其中 return 是您的像素类型的 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,没有行填充。