2016-10-16 12 views
1

この行はメモリにテクスチャを読み込み、画像に保存します:png ++を使用してopenGlにテクスチャを読み込む方法は?

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に入れるのですか?

私が間違って指定した引数はすべて無視してください。後で修正します。これはまったく動作しません。

答えて

1

OpenGLは、(実際にはどのライブラリでも動作するので)どのタイプのものを渡すかを事前に知ることができないので、生のバッファへの汎用のconst void*ポインタが必要であり、提供されたメタデータで正確に

png++ libraryの場合、イメージ、行、ピクセルをラップするので、抽象的なレイヤーをいくつか掘り下げる必要があります。

あなたがpng::imageインスタンスを持っているので、get_pixbuf()をあなたのピクセルタイプのためpng::row_traits専門を返しget_row(0)との最初の行への参照を取得することができ、そこからpng::pixbufインスタンスを返します。これにより、バッファの最初の行にアクセスすることができます。最後に、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。

+0

std :: string pathToPng = "dummy.png"; png :: image イメージ(pathToPng);png :: gray_pixel * buffer = 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 > :: :: row_type 'には' get_data 'という名前のメンバはありません png :: gray_pixel * buffer = image.get_pixbuf()。 get_row(0).get_data(); – drahnr

+0

ラインローディングでは何かが正しくないようです。 – drahnr

関連する問題