2011-01-26 8 views
2

イメージを別のチャンクに分割するためにlibpngを使用しようとしています。理由は私が現在作業しているハードウェアに512x512より大きいテクスチャをロードできないためです。以前はSDLとSDL_Imageが混在していました。私は基本的にSDL_BlitSurfaceのsrcrect引数を使って画像の一部だけをコピーし、それをOpenGLテクスチャに変換しました。これを単純なループで水平方向に結合した後、垂直方向に512x512のテクスチャ配列を得ることができました。それから、それらを正しい位置にレンダリングするだけの問題でした。libpngを使用してイメージをセグメントに分割する

現在、私はSDLを使用する贅沢はありません。したがって、私はlibpng経由でこれを直接行うことができると考えました。いくつかのグーグルーグに基づいて、私はそれがちょうど必要な部分を読むためにpng_read_rowsを使うことの問題だと思う。しかし、それは私が立ち往生しているところです、私はそれをどうやって行うのか正確には分かりません。

また、私がgimp/photoshop/paintなどの画像を分割しない理由を知りたければ、私はそれらを制御せず、実行時にそれらをダウンロードしているからです。

ご協力ありがとうございます。

答えて

4

タイルの抽出を混乱させる必要はありません。 OpenGLに、テクスチャを初期化するために与えたデータの一部だけを使用するように指示することができます。キーワードはglPixelStorei(GL_UNPACK ...)のパラメータです。入力画像のサイズがimg.widthimg.heightで、RGBピクセルに4バイト、つまり1ピクセルごとに1バイトのパディングがあり、サブピクチャが、subimg.off_ysubimg.widthsubimg.heightで定義されているとします。次に、このように読み込むことができます:

glPixelStorei(GL_UNPACK_ROW_LENGTH, img.width) 
glPixelStorei(GL_UNPACK_SKIP_PIXELS, subimg.off_x) 
glPixelStorei(GL_UNPACK_SKIP_ROWS, subimg.off_y) 
glPixelStorei(GL_UNPACK_ALIGNMENT, 1) 
glTexImage2D(GL_TEXTURE_2D, GL_RGB, 0, 
      subimg.width, subimg.height, 0, 
      GL_RGBA, GL_UNSIGNED_BYTE, pixeldata) 
関連する問題