2009-07-16 4 views
0

C# .NET 3.5 sp1 응용 프로그램에 OpenGl 렌더링 코드가 많이 있습니다. 일부 코드는 this question에서 찾을 수 있습니다.텍스처가 OpenGL/Tao에서 작동하지 않습니다. C# for 인텔 칩셋

거대한 문제 : 코드가 915M 또는 Q35와 같은 인텔 칩셋에서 전혀 실행되지 않습니다. 이 칩셋은 OpenGL 1.4를 실행하기위한 spec이며, 내 코드는 모두 2의 강력 함입니다. 컴퓨터에 따라 Dell 또는 Intel에서 최신 드라이버로 업데이트를 시도했습니다. glActiveTextureARB에 실패

  1. :

    는 충돌 실패의 두 가지 유형이 있습니다. 915M은 그 확장에 분명히 포함하지 않습니다.

  2. 쉐이더 로딩에 실패했습니다. 즉 glGenProgramsARB입니다. 기계가 순간 같은 느낌이 무엇에 따라 동결 또는 충돌하거나 Windows에서 7 원인을 XP 또는 Q35에서 915M에 이러한 함수를 호출하려고

.

또 다른 최악의 경우가 있습니다. 디스플레이가 이전 질문을 수정하지 못한다는 것입니다. 즉, 렌더링 된 디스플레이가 16 비트를 표시해야 할 때 8 비트 데이터를 표시하는 것처럼 보입니다. Q35 칩셋, 최신 Dell 드라이버에서 발생합니다. , XP를 실행 중이다.

이 문제에 대한 의견이 있으십니까? glDrawPixels로 돌아가는 것을 고려 중입니다. 느린 동안에도 작동합니다.

편집 : 더 많은 코드! 이 확장 것 같아, 당신은 충돌에 대해 아무것도 할 수 없습니다 슬프게도

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의 강력 함"이라고 말하면 텍스처의 크기가 2의 거듭 제곱임을 의미합니까? – Chris

+0

예. 이 코드는 분명히 2의 거듭 제곱이 아니므로 이제는 깨닫습니다. d' oh ... – mmr

+0

하지만이 코드는 2의 거듭 제곱으로 작동하지 않습니다. – mmr

답변

0

건배,

: 다음 코드는 Q35 칩셋 윈도우 7 컴퓨터를 XP 윈도우 모두에 GL_INVALID_VALUE 오류로 실패 문제의 칩셋은 해당 칩셋에서 지원되지 않습니다. 앱이 스토리와 호환되지 않습니다. 확실하게 glGetString (GL_EXTENSIONS)을 사용하여 어떤 확장이 있는지 확인하십시오. 시작시 응용 프로그램에서이 작업을 수행 할 수도 있고, 실행하는 데 필요한 일부 확장 프로그램이 하드웨어에 의해 지원되지 않는다는 것을 알리는 멋진 메시지 상자를 표시 할 수 있습니다.

8 비트/16 비트 질문의 경우 LUMINANCE16을 사용하더라도 16 비트 텍스처가 실제로 사용될 것이라고 보장 할 수는 없지만 많은 드라이버는 사용자에게 알려주지 않고 8 비트 텍스처를 사용하여이 형식을 "에뮬레이션"합니다. 이것은 호환성을 향상시키는 데 사용됩니다.

사실 16 비트를 원하면 8 비트 LUIMNANCE_ALPHA를 사용하십시오.이 비트는 거의 어디에서나 지원되어야하며 두 개의 8 비트 구성 요소를 셰이더 내부의 단일 숫자로 패킹해야합니다.

관련 문제