Текстуры не работают в opengl / Tao для C # на чипсетах Intel - PullRequest
0 голосов
/ 16 июля 2009

У меня много кода рендеринга OpenGl в приложении C # .NET 3.5 sp1. Часть кода можно найти в этом вопросе .

Огромная проблема: код не работает на чипсетах Intel, таких как 915M или Q35. Эти наборы микросхем специально предназначены для работы с OpenGL 1.4, и мой код обладает великолепной степенью двойки и так далее. Я пытался обновить драйверы Dell или Intel до последних версий, в зависимости от компьютера.

Существует два типа сбоев:

  1. Сбой на glActiveTextureARB. 915M, по-видимому, не включает это в свои расширения.
  2. Сбой при загрузке шейдера, а именно glGenProgramsARB.

Попытка вызова этих функций на 915M в XP или Q35 на Windows 7 вызывает зависание или сбой, в зависимости от того, что машина чувствует в данный момент.

Есть еще один худший сбой, и это то, что дисплей не исправляет предыдущий вопрос, то есть визуализированный дисплей выглядит так, как будто он показывает 8-битные данные, когда должен показывать 16. Это происходит на чипсете Q35, последних драйверах dell, под управлением XP.

Есть мысли по этому поводу? Я подумываю вернуться к glDrawPixels, потому что, несмотря на то, что он медленный, он работает.

РЕДАКТИРОВАТЬ: больше кода! Следующий код завершается с ошибкой GL_INVALID_VALUE на обоих компьютерах с Windows XP и Windows 7 с чипсетом Q35:

    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();

1 Ответ

0 голосов
/ 08 февраля 2012

Приветствия

к сожалению, вы ничего не можете сделать с сбоями, похоже, что рассматриваемые расширения не поддерживаются на этих чипсетах. Ваше приложение не совместимо с ними, конец истории. Просто чтобы убедиться, используйте glGetString (GL_EXTENSIONS), чтобы увидеть, какие есть расширения. Вы даже можете сделать это в своем приложении при запуске и отобразить красивое окно сообщения, сообщающее пользователю, что некоторые расширения, которые требуются для запуска, не поддерживаются аппаратным обеспечением, а не просто аварийно завершают работу.

Что касается 8-битного / 16-битного вопроса, использование LUMINANCE16 на самом деле не гарантирует, что будет использоваться 16-битная текстура, многие драйверы «эмулируют» этот формат, используя 8-битные текстуры, не сообщая вам. Это используется для улучшения совместимости, как это ни раздражает.

Если вам нужен истинный 16 бит, используйте 8 бит LUIMNANCE_ALPHA, который должен поддерживаться практически везде, и упакуйте два 8 битных компонента в одно число внутри шейдера.

...