У меня много кода рендеринга OpenGl в приложении C# .NET 3.5 sp1. Часть кода можно найти в этом вопросе.
Огромная проблема: код вообще не работает на чипсетах Intel, таких как 915M или Q35. Эти наборы микросхем рассчитаны на работу с opengl 1.4, а мой код полностью соответствует степени двойки и так далее. Я пытался установить последние версии драйверов от Dell или Intel, в зависимости от машины.
Существует два типа аварийных отказов:
- Ошибка glActiveTextureARB. 915M, по-видимому, не включает это в свои расширения.
- Сбой при загрузке шейдера, а именно 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();