0

C#.NET3.5sp1アプリケーションにたくさんのOpenGlレンダリングコードがあります。コードの一部は、この質問にあります。

大きな問題:915MやQ35などのIntelチップセットでコードがまったく実行されていません。これらのチップセットはopengl1.4を実行するように仕様が定められており、私のコードはすべて2の累乗です。マシンに応じて、DellまたはIntelの最新のドライバにアップデートしてみました。

クラッシュの失敗には2つのタイプがあります。

  1. glActiveTextureARBで失敗します。915Mは、その拡張機能にそれを含まないようです。
  2. シェーダーの読み込みに失敗しました。つまり、glGenProgramsARBです。

XPの915MまたはWindows7のQ35でこれらの関数を呼び出そうとすると、マシンの現在の状態に応じて、フリーズまたはクラッシュが発生します。

もう1つの悪い障害があります。これは、ディスプレイが前の質問を修正していないことです。つまり、レンダリングされたディスプレイは、16を表示するはずのときに8ビットデータを表示しているように見えます。これは、XPを実行している最新のdellドライバーであるQ35チップセットで発生しています。

これについて何か考えはありますか?glDrawPixelsに戻ることを検討しています。それは遅いですが、機能するからです。

編集:より多くのコード!次のコードは、Q35チップセットを搭載したWindows XPWindows7マシンの両方でGL_INVALID_VALUEエラーで失敗します。

    const int mSize = 256;
    ushort[] theImage = new ushort[mSize * mSize];
...
 //datasetup
        int x, y, i = 0 ;
        for (x = 0; x < mSize; x++) {
            for (y = 0; y < mSize; y++) {
                theImage[(y * mSize) + x] =  (ushort)i++;
            }
        }
...
 //onpaint
        int theTexName;
        Gl.glGenTextures(1, out theTexName);
        Gl.glBindTexture(Gl.GL_TEXTURE_2D, theTexName);
        Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_LUMINANCE16, mSize, mSize,
            0, Gl.GL_LUMINANCE, Gl.GL_UNSIGNED_SHORT, theImage);
        Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR);
        Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
        //theMagBuffer = null;


        Gl.glDisable(Gl.GL_BLEND);


        Gl.glEnable(Gl.GL_TEXTURE_2D);
        Gl.glPolygonMode(Gl.GL_FRONT_AND_BACK, Gl.GL_FILL);
        Gl.glColor4d(1.0, 1.0, 1.0, 1.0);
        Gl.glPushMatrix();

        Gl.glBindTexture(Gl.GL_TEXTURE_2D, theTexName);
        Gl.glBegin(Gl.GL_QUADS);
        Gl.glTexCoord2f(0, 1);
        Gl.glVertex2f(0, mSize);
        Gl.glTexCoord2f(0, 0);
        Gl.glVertex2f(0, 0);
        Gl.glTexCoord2f(1, 0);
        Gl.glVertex2f(mSize, 0);
        Gl.glTexCoord2f(1, 1);
        Gl.glVertex2f(mSize, mSize);
        Gl.glEnd();

        Gl.glDisable(Gl.GL_TEXTURE_2D);
        Gl.glDisable(Gl.GL_FRAGMENT_PROGRAM_ARB);

        Gl.glPopMatrix();
        GetGLError("MAG");
        Gl.glFinish();
4

1 に答える 1

0

乾杯、

残念ながら、クラッシュについては何もできません。問題の拡張機能はこれらのチップセットではサポートされていないようです。あなたのアプリはそれらと互換性がありません、話の終わり。念のため、glGetString(GL_EXTENSIONS)を使用して、どの拡張機能があるかを確認してください。起動時にアプリケーションでそれを実行し、実行に必要な一部の拡張機能が単にクラッシュするのではなく、ハードウェアでサポートされていないことをユーザーに通知するメッセージボックスを表示することもできます。

8ビット/16ビットの質問に関しては、LUMINANCE16を使用しても、16ビットテクスチャが使用されることは実際には保証されません。多くのドライバは、8ビットテクスチャを使用してこの形式を「エミュレート」します。これは、互換性を向上させるために使用されますが、それ自体が煩わしいものです。

真の16ビットが必要な場合は、8ビットのLUIMNANCE_ALPHAを使用します。これは、ほとんどどこでもサポートされ、2つの8ビットコンポーネントをシェーダー内の1つの数値にパックします。

于 2012-02-08T10:23:32.167 に答える