ディスクからロードされた画像から OpenGL テクスチャを作成する Mac OS >= 10.6 用のアプリを作成しています。
まず、画像を NSImage に読み込みます。次に、画像から NSBitmapImageRep を取得し、glTexImage2D を使用してピクセル データをテクスチャに読み込みます。
RGB または RGBA 画像の場合、完全に機能します。RGB の 3 バイト/ピクセル、または RGBA の 4 バイトのいずれかを渡し、4 バイト/ピクセルの RGBA テクスチャを作成できます。
しかし、ARGB バイト順のように見える JPEG 画像 (Canon EOS 50D で撮影、どのようにインポートされたかは不明) をテスターに送ってもらいました。
このスレッドで投稿を見つけました: (http://www.cocoabuilder.com/archive/cocoa/12782-coregraphics-over-opengl.html) これは、GL_BGRA のフォーマット パラメータを glTexImage2D に指定し、 GL_UNSIGNED_INT_8_8_8_8_REV.
それは論理的で、うまくいくように思えますが、そうではありません。色の値は異なりますが、それでも間違っています。
ARGB 画像データを新しい RGBA バッファにシャッフルする「スウィズリング」(手動バイトスワッピング) コードを書きましたが、このバイトごとのスウィズリングは大きな画像では遅くなります。
また、この作業を「正しい方法」にする方法も理解したいと思います。
ARGB データを RGBA OpenGL テクスチャにロードするトリックは何ですか?
xxx への現在の呼び出しは次のようになります。
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, newWidth, newHeight, 0, format, GL_UNSIGNED_BYTE, pixelBuffer);
は RGB または RGBA のいずれかです。
私は使用してみました:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, newWidth, newHeight, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, pixelBuffer);
私の画像担当者が「アルファファースト」の順序であると報告したとき。
2 番目の質問として、ほとんどのグラフィック カードの「ネイティブ」フォーマットは GL_BGRA であることも読んだので、そのフォーマットでテクスチャを作成すると、テクスチャの描画が高速になります。テクスチャの描画速度は、テクスチャのロード速度よりも重要であるため、事前にデータを BGRA 形式に「スウィズリング」することには価値があります。GL_RGBA の「internalformat」を指定して、OpenGL に BGRA テクスチャを作成するように依頼しようとしましたが、完全に黒い画像になります。ドキュメントの私の解釈では、ソース形式と内部形式が異なる場合、glTexImage2D がデータを読み取るときにデータをバイト スワップすることを期待していますが、代わりに、「内部形式」を指定しようとすると、OpenGL エラー 0x500 (GL_INVALID_ENUM) が発生します。 GL_RGBA. 私は何が欠けていますか?