2009-07-16 7 views
0

J'ai beaucoup de code de rendu OpenGl dans une application C# .NET 3.5 sp1. Une partie du code peut être trouvée dans this question.Les textures ne fonctionnent pas dans opengl/Tao pour C# sur les chipsets Intel

Énorme problème: Le code ne fonctionne pas du tout sur les chipsets Intel, comme le 915M ou le Q35. Ces chipsets sont spec'd pour courir 1.4 ouvert, et mon code est tout-puissant de deux et ainsi de suite. J'ai essayé de mettre à jour les derniers pilotes de Dell ou d'Intel, selon la machine.

Il existe deux types de défaillances de l'accident:

  1. A défaut sur glActiveTextureARB. 915M ne l'inclut apparemment pas dans ses extensions.
  2. A défaut de chargement de shader, à savoir glGenProgramsARB.

Si vous essayez d'appeler ces fonctions sur le 915M sous XP ou sur le Q35 sur Windows 7, cela provoque un gel ou un blocage, selon la configuration actuelle de la machine.

Un autre problème est encore plus grave: l'affichage ne corrige pas la question précédente, c'est-à-dire que l'affichage affiche des données 8 bits alors qu'il devrait apparaître 16. Cela se produit sur le chipset Q35 , en cours d'exécution XP.

Des commentaires à ce sujet? Je pense retourner à glDrawPixels, car même si c'est lent, ça fonctionne.

EDIT: plus de code! Le code suivant échoue avec une erreur de GL_INVALID_VALUE à la fois un windows xp a windows 7 machine avec le chipset 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(); 
+0

Quand vous dites "mon code est tout pouvoir de deux gentil et ainsi de suite" voulez-vous dire que les textures sont une taille qui est une puissance de 2? – Chris

+0

oui. Ce code n'est clairement pas conforme à la puissance de deux, je réalise maintenant. d'oh ... – mmr

+0

Mais, pour être juste, ce code ne fonctionne pas avec la puissance de deux activé. – mmr

Répondre

0

Cheers,

malheureusement, vous ne pouvez rien faire sur les accidents, il semble que les extensions en question ne sont pas pris en charge sur ces chipsets. Votre application n'est pas compatible avec eux, fin de l'histoire. Juste pour être sûr, utilisez glGetString (GL_EXTENSIONS) pour voir quelles extensions sont là. Vous pouvez même le faire dans votre application au démarrage et afficher une belle boîte de message indiquant à l'utilisateur que certaines extensions requises pour l'exécution ne sont pas prises en charge par le matériel, au lieu de se bloquer. Comme pour la question 8bit/16bit, l'utilisation de LUMINANCE16 ne garantit pas réellement l'utilisation de la texture 16 bits, beaucoup de pilotes "émulent" ce format en utilisant des textures 8 bits sans vous le dire. Ceci est utilisé pour améliorer la compatibilité, aussi ennuyeux soit-il. Si vous voulez un vrai 16 bits, utilisez LUIMNANCE_ALPHA 8 bits qui devrait être supporté à peu près n'importe où et emballez les deux composants de 8 bits à un seul nombre dans le shader.

Questions connexes