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