【问题标题】:How to load texture into openGl using png++?如何使用 png++ 将纹理加载到 openGl 中?
【发布时间】:2017-02-25 19:25:12
【问题描述】:

这行代码会将纹理读入内存并将其存储在图像中:

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?

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

【问题讨论】:

    标签: c++ opengl libpng


    【解决方案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,没有行填充。

    【讨论】:

    • std::string pathToPng = "dummy.png"; png::image<:gray_pixel> 图像(pathToPng); png::gray_pixel* 缓冲区 = image.get_pixbuf().get_row(0).get_data(); ../src/a.cpp: 在函数'int main(int, const char**)'中: ../src/a.cpp:101:65: 错误: 'png::basic_pixel_buffer, png::row_traits<:vector char> > >::row_type' 没有名为 'get_data' 的成员 png::gray_pixel* buffer = image.get_pixbuf().get_row(0) .get_data();
    • 线路加载似乎有些不对劲。
    • GL_ABGR 是否正确?我找不到它,GL_BGRA 已定义,但它是另一个序列排序。我错过了一个标题? (仅适用于 GLFW 和 GLEW)
    • GL_ABGR 定义在 GL_EXT_abgr 扩展中,这是普遍支持的,但您可能必须启用它。
    猜你喜欢
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-11
    • 2020-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多