2011-03-12 2 views
2

저는 SDL + OpenGL을 사용하여이 작은 게임을 만들었습니다. 게임은 내 PC에서 잘 돌아가지만 친구의 PC에서는 흰색 상자와 빈 화면이 나타납니다. 다른 PC의 OpenGL 흰색 텍스처

나는 때문에 내 텍스처 차원이 아닌 전원 것에는 문제가 될 줄 알았는데. 나는 텍스쳐 크기를 바꿀 수 없다. 그래서 어떤 검색을 한 후에, GL_ARB_texture_non_power_of_two을 사용하면 (?) npot 텍스처가 강제로 생성된다는 것을 알게되었다. 하지만 놀랍게도 흰색 상자와 물건이 내 PC에 나타나고 친구들에게도 사라지지 않습니다. 문제가 무엇인지 이해할 수 없습니다. 어떤 도움이라도 대단히 감사하겠습니다.

코드 :

numColors = images[i]->format->BytesPerPixel; 
    if (numColors == 4) 
    { 
     if (images[i]->format->Rmask == 0x000000FF) 
      textureFormat = GL_RGBA; 
     else 
      textureFormat = GL_BGRA; 
    } 
    else if (numColors == 3) 
    { 
     if (images[i]->format->Rmask == 0x000000FF) 
      textureFormat = GL_RGBA; 
     else 
      textureFormat = GL_BGRA; 
    } 
    glPixelStorei(GL_UNPACK_ALIGNMENT,4); 
    glGenTextures(1, &textures[i]); 
    glBindTexture(GL_ARB_texture_non_power_of_two, textures[i]); 
    glTexParameteri(GL_ARB_texture_non_power_of_two,GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameteri(GL_ARB_texture_non_power_of_two,GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexImage2D(GL_ARB_texture_non_power_of_two, 0, numColors, images[i]->w, images[i]->h, 0, textureFormat, GL_UNSIGNED_BYTE, images[i]->pixels); 
+0

화이트 박스 PC가 NPOT 텍스처를 지원합니까? 그 확장은 단지 – Macke

+0

미안하지만, 나는 너를 못 봤어 .. – tf61

+0

죄송합니다, 키보드를 발견. NPOT은 사용자가 활성화 할 수있는 것이 아니라 GPU가 지원하는 (또는하지 않는) 것입니다. 그래서 NPOT가 ​​오작동하는 GPU의 확장 문자열에 나열되어 있습니까? – Macke

답변

1

친구의 비디오 카드에 따라서 출력이 여전히 GL_ARB_texture_non_power_of_two 확장을 사용에도 불구하고 잘못, 두 개의 텍스처의 비 전력을 지원하지 않을 수 있습니다.

게임이 특정의 OpenGL 확장이 제대로 표시하기에, 당신이 시작하고 자신의 하드웨어 기능을 부족한 경우 경기를 실행할 수 없습니다 사용자에게있는 사람들 확장 확인해야합니다 의존합니다.

+0

기능은 드라이버에 달려 있다고 생각합니다. Intel G31 칩셋 (GMA3100 IGP)을 장착 한 두 시스템 모두에서 게임이 훌륭하게 작동하는 것을 보았 기 때문에 나는 그것을 묻습니다. – tf61

+0

확장을 검사하려면 :'glGetString (GL_EXTENSIONS)'를 호출하면 응용 프로그램이 런타임에 구문 분석 할 수있는 확장명의 공백으로 구분 된 문자열이 반환됩니다. – Yuri

+0

드라이버 업데이트가 도움이되지 않습니다. – tf61

1

는 GL_ARB_texture_non_power_of_two 대신 GL_TEXTURE_2D을 사용하지 마십시오. 확장 기능이 지원되는지 확인한 다음 glTexImage (GL_TEXTURE_2D, w, h, ...)를 사용하여 NPOT 텍스처를 보냅니다. 당신이 오류가 발생하는 경우

통화 glGetError의()는 확인합니다. GL_ARB _... npot는 사용하는 값이 아니기 때문에 그렇게해야합니다.

GL_ARB_NPOT 또한 1D와 3D 텍스처에 사용됩니다.

+0

흠 .. 그게 내 PC가 NPOT 텍스처를 지원한다면, 나는 GL_ARB를 사용하지 말아야한다는 것을 의미한다. 괜찮아. 친구의 PC에서이 작업을 수행하기위한 제안 사항을 제안 할 수 있습니까? 그것이 완전히 NPOT가 ​​아니라면 SFML이 npot 텍스처를 그릴 수 있다고 생각합니까? – tf61

+0

@ tf61 : SFML? .. – Macke

+0

SFML (sfml-dev.org) 라이브러리에 대해 이야기하고 있습니다. – tf61

0

또한 다른 확장자도있다 ARB_texture_non_power_of_two합니다 : GL_ARB_texture_rectangle; 상당히 오래된 GPU에서 여러 해 동안 지원되었습니다. 코드가 BTW

glPixelStorei(GL_UNPACK_ALIGNMENT,4); 
glGenTextures(1, &textures[i]); 
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, textures[i]); 
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, numColors, images[i]->w, images[i]->h, 0, textureFormat, GL_UNSIGNED_BYTE, images[i]->pixels); 

처럼 보일 것이라고 사용 : GL_ARB_texture_non_power_of_two는 확장자 이름이 아닌 텍스처 대상으로 사용할 수있는 유효한 토큰입니다; OpenGL이 GL_INVALID_ENUM 오류를 발행 했어야합니다.

+1

GL_TEXTURE_RECTANGLE은 정수가 아닌 정규화 된 texcoord를 사용합니다 (예 : 0 ... float로 0..1 대신 너비). 하지만 효과가있을 수 있습니다. – Macke

+0

@ 맥 : 오, 맞아. 나는 그 세부 사항을 언급하는 것을 잊었다. – datenwolf

+0

OpenGL Extensions 뷰어에서 내 그래픽 칩셋이 텍스처 사각형을 지원하는 것으로 보이지만 사용할 때 선언되지 않은 식별자 오류가 발생합니다. – tf61