私は、Mac OS> = 10.6のために、ディスクから読み込まれた画像からOpenGLテクスチャを作成するアプリを書いています。ARGB NSImageからOpenGLテクスチャをスウィズルすることなくロードするにはどうすればいいですか?
まず、イメージを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)私は glTexImage2DにGL_BGRAのフォーマットパラメータを指定することを示唆しています、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"を指定してBGRAテクスチャを作成するようにOpenGLに依頼してみましたが、結果として完全に黒い画像になりました。私の解釈では、ソースと内部のフォーマットが違うとglTexImage2Dがデータをバイトスワップすることが予想されますが、代わりに "internalformat"を指定しようとするとOpenGLエラー0x500(GL_INVALID_ENUM)が出ますGL_RGBA。私は何が欠けていますか?
私のアプリは、固定パイプラインOpenGL(フラグメントシェーダーなし)を使って書かれています。私は今、iOS上でシェーダベースのプログラミングを行ってきましたが、Mac OSでそれに取り組んでいません。どのようにして、固定パイプラインのOpenGLと、私のうねりしかないフラグメントシェーダを混在させるのですか? –
私は長い間固定機能GLを使用していませんが、ピクセルシェーダをバインドしたことを思い出して、固定機能状態の一部をオーバーライドするだけです。このシェーダは、 〜にスウィズリングだけでなく、。 – kvark
私はnoob @kvarkです。例を共有してください。 – anuj