これまで、私は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はユニット配列の配列です。
このように、一部のコンピュータではレンダリングは問題ありません。テクスチャの削除によって、すべてのシステムで実行時エラーが発生します(ただし、ネットブック以外の場所ではテクスチャを作成できません。問題)。
誰でも関連性のある情報を提供できれば、それは素晴らしいことです。私はプログラムで何日も過ごしましたが、それほどうまくいかないグラフィックスカードとの互換性をより高くしたいと思っています。
はい、「d」ディメンションも2の累乗として計算されます。投稿のおかげで、私はそれを試してみます。私はOpenGLの専門家ではありませんが、前に友人に荷物を確認してもらいました - 私は彼にあなたのアドバイスを与え、今回は問題を診断するのに役立つかどうか確認します。 – VisualMelon