рендеринг текста SDL_TTF на openGL Red Square вместо текста

StackOverflow https://stackoverflow.com/questions/7831568

Вопрос

Я пытался визуализировать текст в окне openGL с помощью SDL и библиотеки SDL_TTF в Windows XP, VS2010.
Версии:
SDL версии 1.2.14
SDL TTF для разработки 1.2.10
openGL (возраст версии не менее 2–3 лет).

Я успешно создал окно openGL, используя SDL / SDL_image, и могу без проблем отображать на нем линии / полигоны.

Однако, переходя к тексту, кажется, что в моей текущей программе есть какой-то недостаток, я получаю следующий результат, пытаясь этот код здесь

введите описание изображения здесь

для тех, кто не хочет вставлять бин, здесь представлены только важные сегменты кода:

родовое слово

сегмент 2:

родовое слово

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


РЕДАКТИРОВАТЬ:

Я заметил, что использование
генеракодисетагкод
TTF_RenderUTF8_Shaded

Выдает исключение с нулевым указателем, что означает ошибку в самой функции отрисовки текста (я подозреваю), я не знаю, как это означает, что TTF_RenderUTF8_Solid возвращает красный квадрат, но я подозреваю, что все проблемы связаны с этим.

Это было полезно?

Решение

Я думаю, что проблема в функциях glEnable(GL_TEXTURE_2D) и glDisable(GL_TEXTURE_2D), которые должны вызываться каждый раз, когда текст отображается на экране. И, возможно, также неправильное преобразование цвета между поверхностью SDL и GL. Я объединил create_texture и drawText в единую функцию, которая правильно отображает текст.Это код:

родовое слово

снимок экрана

Я инициализирую OpenGL следующим образом:

родовое слово

Другие советы

Я думаю, вам следует просто добавить glEnable (GL_BLEND), потому что код для текстовой поверхности говорит TTF_RenderUTF8_Blended (fntCourier, text, clrFg), и вам нужно включить возможности смешивания opengl.

ИЗМЕНИТЬ

Хорошо, я наконец нашел время, чтобы пропустить ваш код через компилятор. Самое главное, компилятор с генерирующим кодом кода, чтобы предупреждения превращались в ошибки

родовое слово

Я не увидел этого первым, потому что это что-то вроде кода C-coder 101 и довольно неожиданно: Вы не должны возвращать указатели на локальные переменные! . Как только функция выходит за пределы области видимости, возвращаемый указатель будет указывать только на чушь. Почему вы вообще возвращаете указатель? Просто верните целое число:

родовое слово

Из-за этого вы также не собираетесь потом удалять текстуру. Вы загружаете его в OpenGL, но затем теряете ссылку на него.


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

  1. скоро закончится нехватка текстурной памяти
  2. значительно замедлить его

(1) можно решить, не создавая новое имя текстуры при каждой перерисовке

(2) можно адресовать, загружая новые данные текстуры только при изменении текста и не используя glTexImage2D, а glTexSubImage2D (конечно, если размеры текстуры изменяются, это должно быть glTexImage2D).


ИЗМЕНИТЬ, обнаружил еще одну возможную проблему, но сначала исправьте проблему с указателем.

Убедитесь, что вы используете режим текстурной среды GL_REPLACE или GL_MODULATE. При использовании GL_DECAL или GL_BLEND вы получите красный текст на красном квадрате.

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

Первая функция должна быть вызвана перед циклом SDL. Она загружает текстовую строку в память:

Каждая загруженная строка должна иметь свой параметр txtNum

родовое слово

Второй отображает строку, которая должна вызываться в цикле SDL:

родовое слово

введите описание изображения здесь

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top