2

ディスクからロードされた画像から 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. 私は何が欠けていますか?

4

4 に答える 4

4

ARGB データをテクスチャに直接ロードする方法はわかりませんが、CPU でスウィズルを実行するよりも優れた回避策があります。代わりに GPU で非常に効果的に行うことができます。

  1. ARGB データを一時的な RGBA テクスチャにロードします。
  2. 単純なピクセル シェーダーを使用して、ターゲット テクスチャにレンダリングしながら、このテクスチャでフルスクリーン クワッドを描画します。
  3. GPU パイプラインを停止する必要はなく、他のリソースの読み込みを続行します。

ピクセル シェーダーの例:

#version 130
uniform sampler2DRect unit_in;
void main() {
    gl_FragColor = texture( unit_in, gl_FragCoord.xy ).gbar;
}
于 2011-02-10T16:32:26.640 に答える
1

OpenGLでレンダリングしていますよね?簡単な方法で行いたい場合は、ピクセル シェーダーにリアルタイムで色を入れ替えさせることができます。これは、グラフィックス カードにとってはまったく問題ありません。グラフィックス カードは、はるかに複雑なことを行うように作られています :)。

次のようなシェーダーを使用できます。

uniform sampler2D image;
void main()
{
    gl_FragColor = texture2D(image, gl_FragCoord.xy).gbar;
}

シェーダーについてよくわからない場合は、http ://www.lighthouse3d.com/opengl/glsl/ を読んでください。

于 2011-02-10T17:08:03.460 に答える