рендеринг текста SDL_TTF на openGL Red Square вместо текста
-
27-10-2019 - |
Вопрос
Я пытался визуализировать текст в окне 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) можно адресовать, загружая новые данные текстуры только при изменении текста и не используя glTexImage2D, а glTexSubImage2D (конечно, если размеры текстуры изменяются, это должно быть glTexImage2D).
ИЗМЕНИТЬ, обнаружил еще одну возможную проблему, но сначала исправьте проблему с указателем.
Убедитесь, что вы используете режим текстурной среды GL_REPLACE или GL_MODULATE. При использовании GL_DECAL или GL_BLEND вы получите красный текст на красном квадрате.
В моей предыдущей публикации произошла утечка памяти о функции, и через некоторое время программа вылетела ... Я улучшил это, разделив загрузку и отображение текстуры:
Первая функция должна быть вызвана перед циклом SDL. Она загружает текстовую строку в память:
Каждая загруженная строка должна иметь свой параметр txtNum
родовое словоВторой отображает строку, которая должна вызываться в цикле SDL:
родовое слово