Почему моя текстура неправильно отображается в моем приложении OpenGL? - PullRequest
1 голос
/ 12 августа 2011

Я работаю с SDL и OpenGL, создавая довольно простое приложение. Я создал базовую функцию рендеринга текста, которая отображает сгенерированную текстуру в квад для каждого персонажа. Эта текстура визуализируется из растрового изображения каждого символа.

Растровое изображение довольно маленькое, около 800x16 пикселей. Он работает абсолютно нормально на моем настольном компьютере и ноутбуке, как в виртуальной машине, так и вне ее (а также в Windows и Linux).

Теперь я пытаюсь сделать это на другом компьютере, и текст становится искаженным - кажется, что компьютер не может справиться с очень простой вещью, подобной этой. Чтобы узнать, связано ли это с операционной системой, я установил VirtualBox и проверил его на виртуальной машине - но результат еще хуже! Вместо рендеринга чего-либо (хотя и искаженного), он просто отображает простой белый прямоугольник.

Почему это происходит, и есть ли способ ее решить?


Некоторый код - как я инициализирую текстуру:

glGenTextures(1, &fontRef);
glBindTexture(GL_TEXTURE_2D, iFont);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, FNT_IMG_W, FNT_IMG_H, 0,
             GL_RGB, GL_UNSIGNED_BYTE, MY_FONT);

Выше MY_FONT - массив без знака (дамп необработанного изображения из GIMP). Когда я рисую персонажа:

GLfloat ix = c * (GLfloat) FNT_CHAR_W;
// We just map each corner of the texture to a new vertex.
glTexCoord2d(ix,              FNT_CHAR_H); glVertex3d(x,          y,          0);
glTexCoord2d(ix + FNT_CHAR_W, FNT_CHAR_H); glVertex3d(x + iCharW, y,          0);
glTexCoord2d(ix + FNT_CHAR_W, 0);          glVertex3d(x + iCharW, y + iCharH, 0);
glTexCoord2d(ix,              0);          glVertex3d(x,          y + iCharH, 0);

1 Ответ

2 голосов
/ 12 августа 2011

Мне кажется, что видеокарта компьютера, на котором вы работаете, поддерживает только мощность двух текстур (т.е. 16, 32, 64 ...).800x16 определенно не будет работать на такой карте gfx.

вы можете использовать glGet с ARB_texture_non_power_of_two , чтобы проверить, поддерживает ли карта gfx это.

Или используйте GLEW, чтобы сделать эту проверку для вас.

...