2011-02-11 12 views
9

下の画像で3つの背景がある:黒、白&グレーWindowsとOS XのOpenGLアルファブレンドの違いは何ですか?

それぞれに3つのバーがある:黒 - >透明、白 - >透明、および色 - >透明

私が使用していglBlendFuncは(GL_SRC_ALPHA、GL_ONE_MINUS_SRC_ALPHA);すべての頂点の色は1,1,1,0です。

欠陥は、白い背景の白い背景に実際に見えます。

Windows XP(および他のウィンドウの味)では、完全に機能し、完全に白くなります。 Macではしかし、私は真ん中に灰色になる!

なぜこのようなことが起こりますか、白を白に混ぜると、なぜ暗くなりますか?

Windowsでは

、OpenGLのバージョンについては関係するように見えるdoesntの:更新情報が

Screenshot

http://dl.dropbox.com/u/9410632/mac-colorbad.png @

のスクリーンショットフルサイズです。 2.0から3.2まで、すべて動作します。 私は今、私の前にMacを持っています。それは2.1です。

グラデーションはテクスチャで保持され、すべての頂点は1,1,1,1(白色rgb、完全アルファ)に着色されています。背景は1x1ピクセルのテクスチャ(勾配で塗りつぶした)で、頂点は必要に応じてフルアルファで塗りつぶします。

アトラスはglTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_BGRA, GL_UNSIGNED_BYTE, data);で作成されています。自分で作ったARGB ddsファイルから来ています。

私もすべてがtrivally簡単なシェーダを使用して描画されることに注意してください:アルファ制服は今1.0

に設定されている

 
uniform sampler2D tex1; 
uniform float alpha; 

void main() { 
    gl_FragColor = gl_Color * texture2D(tex1, gl_TexCoord[0].st) * vec4(1.0, 1.0, 1.0, alpha); 
} 

白のグラデーションではなかったので、私はそれを変更しようとしませんでしたテクスチャですが、左のものは白と不透明の4つの頂点だけで、右のものは1,1,1,0です。

私は今トリプルテクスチャをチェックしており、アルファ1.0 - > 0.0のアルファを変えて白いだけです。

私はこれがデフォルトの問題かもしれないと思っています。 OpenGLやドライバのバージョンは、物事を別々に初期化するかもしれません。

例えば、私は最近誰もがGL_TEXTURE_2D glEnabledをデフォルトで持っているが、インテルGME965は持っていないことを発見しました。

溶液を

まず、もう少し背景を発見しました。このプログラムは実際には.NET(OS XのMonoを使用)で書かれており、私が書いているDDSファイルは24ビットPNGファイルのディレクトリをできるだけ小さなテクスチャに圧縮して自動的に生成されるアトラスです。 System.Drawing.Bitmapを使用してこれらのPNGをロードし、レイアウトを決定した後、より大きなビットマップにレンダリングします。そのポストレイアウトのビットマップはロックされ(バイトになるように)、それらは私が書いたコードでDDSに書き出されます。

バーバーのアドバイスを読んだとき、私は記憶の中のテクスチャをチェックしました。彼らは確かに異なっていました!ロードされた私のDDSは、OpenGLの設定ではなく、犯人のようです。今日は、2つのプラットフォーム(バイト比較のためのバイトを使用して)でDDSファイル自体をチェックアウトしましたが、実際には異なっていました。 WTV(http://developer.nvidia.com/object/windows_texture_viewer.html)を使用してDDSファイルを読み込むと、それらは同じように見えます。ただし、WTVを使用すると、各チャンネル(R G B A)をオフにすることができます。私がAlphaチャンネルを切り替えたとき、窓で私は本当に見栄えの悪い画像を見ました。アルファはアンチエイリアスされていないエッジにつながりませんので、恐ろしく見えます。 OSX DDSでアルファチャンネルをオフにしたとき、うまく見えました!

MonoのPNGローダーが事前に乗っているため、すべての問題が発生しています。私はそれらのチケット(https://bugzilla.novell.com/show_bug.cgi?id=679242)を入力し、libpngを使用して直接切り替えました。

ありがとうございました!

+0

レンダリングサーフェスのフォーマットは何ですか?特にSRGBに関して?白い白は私に困ってしまった。 – Bahbar

+1

バーはテクスチャを使用して、または色補間を使用して描かれていますか? – rotoglup

+0

頂点は1,1,1,0?黒、白、灰色の背景があっても? –

答えて

1

ddsローダーを確認してください。 John Bartholomewがロード時に話していた事前乗算を、1つのプラットフォーム上でのみ行っている可能性があります。

確認する簡単な方法は、データがglTexImage呼び出しでテクスチャにロードされているのを見ることです。そのデータは完全に統一されていますか?

+0

ok、私は問題を発見し、あなたはそれを釘付け。 –

2

これは、暗闇の中で少し刺しますが、ピクセル転送モードをチェックします(または明示的に設定します)。

出力は、事前に乗算されたアルファでテクスチャを使用していたが、次に設定したブレンドモードを使用していた場合に期待される結果になります。テクスチャがアップロードされたときに、ピクセル転送モードを設定してカラーチャンネルにアルファを掛けることがありました。

ブレンドモードをglBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)に設定したときに、Macの結果が正しいかどうか(テクスチャあり)を確認することもできます。

+0

それが圧縮されていないDDSだ、私は使用してそれをロードしています: 'glTexImage2D(GL_TEXTURE_2D、0、GL_RGBA、H、0、W、GL_BGRA、GL_UNSIGNED_BYTE、データ);' 私はそれをpremultiplyingないよ..私はディスクからDDSファイルを読み込み、上記の呼び出しに非ヘッダ部分を渡します。 OpenGLを呼び出すと、負荷が事前に乗算されている可能性があります。 –

+0

私はGL _ * _ SCALEとGL _ * _ BIASの値を印刷しました。両者はウィンドウとマックで同じです(スケールは1、バイアスは0)ので、そうではありません。 GL_SRC_ALPHAの代わりにGL_ONEブレンドモードを使用すると、白が正しく表示されますが、すべての暗いオーバーレイが中断します。 –

+0

ピクセル転送中に適用されるカラーマトリックスがあります(または、OpenGLのバージョンと拡張機能によって異なる場合があります)。 'glMatrixMode(GL_COLOR);でクリアしてみてください。 glTextIdentity(); ' –

関連する問題