2009-07-16 54 views
0

我在C#.NET 3.5 sp1應用程序中有很多OpenGl渲染代碼。一些代碼可以在this question中找到。紋理不工作在opengl /陶英特爾芯片組上的C#

巨大的問題:代碼根本不在intel芯片組上運行,例如915M或Q35。這些芯片組專門用於運行opengl 1.4,我的代碼全部是功能強大的,等等。我嘗試更新從戴爾或英特爾的最新驅動程序,具體取決於機器。

有兩種類型的死機故障:

  1. 如果未能在glActiveTextureARB。 915M顯然不包括在其擴展中。
  2. 着色器加載失敗,即glGenProgramsARB。

試圖在XP中的915M或Windows 7上的Q35上調用這些函數會導致凍結或崩潰,具體取決於機器目前的感受。

還有一個更糟糕的失敗,那就是顯示器沒有修復上一個問題,即渲染的顯示器看起來應該顯示16時顯示8位數據。在Q35芯片組上出現這種情況,最新的dell驅動程序,運行XP。

對此有何看法?我正在考慮回到glDrawPixels,因爲即使這很慢,它也可以工作。

編輯:更多代碼!下面的代碼將失敗,並在同時獲得Windows的GL_INVALID_VALUE錯誤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(); 
+0

當你說「我的代碼是所有冪的兩個漂亮的等等」你的意思是,紋理是一個大小是2的冪? – Chris 2009-07-16 03:15:25

回答

0

乾杯,

可悲的是,你不能做的崩潰什麼,好像擴展有問題的芯片組不支持這些芯片組。您的應用與它們不兼容,故事結束。只要確保使用glGetString(GL_EXTENSIONS)來查看那裏有什麼擴展。您甚至可以在啓動時在應用程序中執行此操作,並顯示一個很好的消息框,告訴用戶需要運行的某些擴展不受硬件支持,而不是僅僅崩潰。

至於8bit/16bit的問題,使用LUMINANCE16並不能保證會使用16位紋理,但許多驅動程序使用8位紋理「模擬」這種格式而不告訴你。這被用來改善兼容性,因爲它很煩人。

如果你想真正的16位,使用8位LUIMNANCE_ALPHA應幾乎任何地方支載和包裝兩個8位組件內着色單號。