2010-12-05 11 views
0

これまで、私はC#のOpenGLを使用するプログラムを変換し、自宅のコンピュータで完全に(しかも高速に)実行されていることを発見しました。しかし、私は2つの問題があります。まず、グラフィックスカードからテクスチャを解放するために使用するコードは実行時にメモリアクセス違反例外を発生させます。第二に、ほとんどのグラフィックスは他のマシンでは動作しませんが、私のものです。OpenGLテクスチャ品質の問題

偶然、私はいくつかのグラフィックスを8ビットPNGに変換しました(他はすべて32ビットです)。これらは他のマシンでも正常に動作します。これを認識して、私は画像をロードするときに品質を調整しようとしました。私の試みは失敗しました(これはもう少し前ですが、ビットマップをフォーマットしてからGDIを使用してテクスチャを描画し、低品質版を作成することが大部分であったと思います)。 .NETにビットマップを取って品質をうまく変える方法はありますか?このコードは以下の通りです。私はそれが過去にStack Overflowで見つけたものに大部分基づいていたが、私のニーズにはまったく合致しなかったことを思い出します。 'img'は.NET Image、 'd'は整数ディメンションで、イメージが正方形であることを保証するために使用します。

uint[] output = new uint[1]; 

Bitmap bMap = new Bitmap(img, new Size(d, d)); 

System.Drawing.Imaging.BitmapData bMapData; 
Rectangle rect = new Rectangle(0, 0, bMap.Width, bMap.Height); 

bMapData = bMap.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadOnly, bMap.PixelFormat); 

gl.glGenTextures(1, output); 
gl.glBindTexture(gl.GL_TEXTURE_2D, output[0]); 
gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, gl.GL_NEAREST); 

gl.glTexParameteri(gl.GL_TEXTURE_2D,gl.GL_TEXTURE_MIN_FILTER, gl.GL_NEAREST); 
gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_WRAP_S, gl.GL_CLAMP); 
gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_WRAP_T, gl.GL_CLAMP); 
gl.glPixelStorei(gl.GL_UNPACK_ALIGNMENT, 1); 
if (use16bitTextureLimit) 
gl.glTexImage2D(gl.GL_TEXTURE_2D, 0, gl.GL_RGBA_FLOAT16_ATI, bMap.Width, bMap.Height, 0, gl.GL_BGRA, gl.GL_UNSIGNED_BYTE, bMapData.Scan0); 
else 
gl.glTexImage2D(gl.GL_TEXTURE_2D, 0, gl.GL_RGBA, bMap.Width, bMap.Height, 0, gl.GL_BGRA, gl.GL_UNSIGNED_BYTE, bMapData.Scan0); 

bMap.UnlockBits(bMapData); 
bMap.Dispose(); 

return output; 

「use16bitTextureLimit」

はブール値である、と私はむしろ16ビットの品質を低下させるのコードを望んだが、私は何の違いに気づいたやりなさい。これは動作し、グラフィックスカードはまだそれが好きではない可能性があります。私は8ビットPNgを使用する方法の兆候を見つけることができませんでした。 これは、レンダリング時に使用するuint配列(テクスチャアドレスとして)を返す関数内にあります。欠陥のあるテクスチャ処分には、単に gl.glDeleteTextures(1, imgsGL[i]);が含まれます。imgGLはユニット配列の配列です。

このように、一部のコンピュータではレンダリングは問題ありません。テクスチャの削除によって、すべてのシステムで実行時エラーが発生します(ただし、ネットブック以外の場所ではテクスチャを作成できません。問題)。

誰でも関連性のある情報を提供できれば、それは素晴らしいことです。私はプログラムで何日も過ごしましたが、それほどうまくいかないグラフィックスカードとの互換性をより高くしたいと思っています。

答えて

0

glTexImage2Dの呼び出しによってバッファオーバーランが発生すると、通常は発生す​​るアクセス違反の種類が発生します。アンパックに関連するすべてのglPixelStoreパラメータが、のフォーマットパラメータ(2番目のもの)が、指定したデータのタイプとサイズと一致することを再確認してください。私はこの種のbgを非常によく知っています。そして、私がそれに遭遇するたびに、私が通常行う最初のチェックです。

テクスチャが表示されない場合:テクスチャのサイズが実際には2の累乗であることを確認しましたか?Cでマクロを使用すると、2の累乗のテストはこのように書くことができます(これは、

#define ISPOW2(x) (x && !((x) & ((x) - 1))) 

テクスチャ画像が正方形である必要はありませんが、整数のビットのうちの1つだけが設定されています。よくある誤解ですが、実際には各次元が2の累乗であることを確認するだけです。16×128の画像は完全にうまくいきます。

内部フォーマットをGL_RGBA_FLOAT16_ATIに変更すると、おそらく品質が向上しますが、GL_RGBAはドライバが適合しているものに強制する可能性があるため、確かなことはありません。これはベンダー特有のフォーマットなので、私はそれを無視します。 ARB形式にはすべての種類があり、半分の浮動小数点形式(FLOAT16_ATI)もあります。

+0

はい、「d」ディメンションも2の累乗として計算されます。投稿のおかげで、私はそれを試してみます。私はOpenGLの専門家ではありませんが、前に友人に荷物を確認してもらいました - 私は彼にあなたのアドバイスを与え、今回は問題を診断するのに役立つかどうか確認します。 – VisualMelon

関連する問題