簡體   English   中英

如何使用 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()返回pixbuf 如何將圖像中的像素數據獲取到 openGL 中?

忽略我錯誤指定的任何其他參數,稍后我會修復它,這是一個根本不起作用的參數。

OpenGL 無法提前知道任何人可能想要傳入的類型(因為它幾乎可以與任何庫一起使用),因此它需要一個指向原始緩沖區的通用const void*指針,並依靠您來准確地描述它提供的元數據。

png++ 庫的情況下,您需要在抽象中挖掘幾層,因為它為您包裝圖像、行和像素。

由於您有一個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,沒有行填充。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM