0

我在 C# .NET 3.5 sp1 应用程序中有很多 OpenGL 渲染代码。一些代码可以在这个问题中找到。

大问题:代码根本无法在英特尔芯片组上运行,例如 915M 或 Q35。这些芯片组被指定为运行 opengl 1.4,我的代码都是 2 的幂等。我已经尝试更新到戴尔或英特尔的最新驱动程序,具体取决于机器。

有两种类型的崩溃故障:

  1. glActiveTextureARB 失败。915M 显然不包括在其扩展中。
  2. 着色器加载失败,即 glGenProgramsARB。

尝试在 XP 的 915M 或 Windows 7 的 Q35 上调用这些函数会导致死机或崩溃,这取决于机器目前的感觉。

还有一个更严重的故障,那就是显示器没有解决之前的问题,即渲染的显示器看起来像是在显示 8 位数据,而它应该显示 16。这发生在 Q35 芯片组、最新的戴尔驱动程序、运行 XP 上。

对此有什么想法吗?我正在考虑回到 glDrawPixels,因为即使速度很慢,它也可以工作。

编辑:更多代码!以下代码在带有 Q35 芯片组的 windows xp 和 windows 7 机器上都失败并出现 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) 查看有哪些扩展。您甚至可以在启动时在应用程序中执行此操作,并显示一个漂亮的消息框,告诉用户硬件不支持某些运行所需的扩展,而不仅仅是崩溃。

至于 8bit / 16bit 的问题,使用 LUMINANCE16 并不能真正保证会使用 16 位纹理,许多驱动程序使用 8 位纹理“模拟”这种格式而不告诉你。这用于提高兼容性,尽管它很烦人。

如果你想要真正的 16 位,请使用 8 位 LUIMNANCE_ALPHA,它应该在几乎任何地方都得到支持,并将两个 8 位组件打包到着色器内的单个数字中。

于 2012-02-08T10:23:32.167 回答