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

У меня много кода рендеринга 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();

person mmr    schedule 16.07.2009    source источник
comment
Когда вы говорите, что мой код хорош в степени двойки и так далее, вы имеете в виду, что текстуры имеют размер, равный степени двойки?   -  person Chris    schedule 16.07.2009
comment
да. Теперь я понимаю, что этот код явно не соответствует степени двойки. д'о...   -  person mmr    schedule 16.07.2009
comment
Но, честно говоря, этот код не работает с включенной степенью двойки.   -  person mmr    schedule 16.07.2009
comment
Какой именно драйвер вы используете? используйте glGetString, чтобы понять это (с GL_VENDOR, GL_RENDERER и GL_VERSION)   -  person Bahbar    schedule 18.10.2009


Ответы (1)


Ваше здоровье,

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

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

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

person the swine    schedule 08.02.2012