Белые текстуры OpenGL на другом ПК - PullRequest
2 голосов
/ 12 марта 2011

Я сделал эту маленькую игру, используя SDL + OpenGL. Игра отлично работает на моем ПК, но на компьютере друга он просто получает белые коробки и пустой экран.

Я подумал, что это может быть проблемой из-за того, что мои текстуры не имеют степени 2 в измерениях. Я не могу изменить размеры текстуры, поэтому после некоторого поиска я обнаружил, что использование GL_ARB_texture_non_power_of_two каким-то образом вызовет (?) Текстуры npot. Но, к моему удивлению, на моем компьютере появляются белые коробки и прочее, и они даже не исчезают у моих друзей. Я не могу понять, в чем проблема. Любая помощь будет принята с благодарностью.

Код:

   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);

Ответы [ 3 ]

1 голос
/ 13 марта 2011

Не используйте GL_ARB_texture_non_power_of_two вместо GL_TEXTURE_2D.Просто проверьте, поддерживается ли расширение, затем отправьте текстуры NPOT, используя glTexImage (GL_TEXTURE_2D, w, h, ...).

Вызовите glGetError (), чтобы увидеть, если вы получаете ошибку.Вы должны это сделать, поскольку GL_ARB _... npot не является допустимым значением, как вы его используете.

GL_ARB_NPOT также используется для 1D и 3D текстур.

1 голос
/ 12 марта 2011

Видеокарта вашего друга может не поддерживать не-мощь двух текстур, поэтому вывод по-прежнему неправильный, несмотря на использование расширения GL_ARB_texture_non_power_of_two.

Если ваша игра зависит от определенных расширений OpenGL для правильного отображения, вам следует проверить эти расширения при запуске и сообщить пользователю, что он не может запустить игру, если его оборудованию не хватает функций.

0 голосов
/ 13 марта 2011

В дополнение к ARB_texture_non_power_of_two есть еще одно расширение: GL_ARB_texture_rectangle; довольно старый, он поддерживается графическими процессорами целую вечность. Используя это ваш код будет выглядеть как

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.

...