Создание 3D текстового редактора на C ++ - PullRequest
5 голосов
/ 04 апреля 2011

В настоящее время я хочу написать текстовый редактор для Linux-систем, который выполняет определенную подсветку текста / шрифта, которая включает рендеринг opengl.У кого-нибудь есть предложения для библиотеки рендеринга графики c ++, которая хорошо работает с linux (в частности, с ubuntu на данный момент)?

И советы, с чего начать рендеринг трехмерного текста, очень приветствуются!: Просто уточнить рендеринг 3D-текста является строгим требованием проекта.

Ответы [ 5 ]

9 голосов
/ 11 апреля 2011

Существует всего три способа сделать это на уровне OpenGL:

Растровые шрифты.

Используйте glBitmap или glDrawPixels, чтобы нарисовать прямоугольный пучок пикселей на экране. Недостатки выполнения этого много: Данные, описывающие каждый символ, отправляются с вашего ЦП на видеокарту каждый кадр - и для каждого символа в кадре. Это может привести к значительной пропускной способности.
Базовая реализация OpenGL почти наверняка должна каким-то образом «пролистывать» данные изображения на своем пути между процессором и кадровым буфером.
Многие 3D графические чипы вообще не предназначены для рисования растровых изображений. В этом случае программный драйвер OpenGL должен подождать, пока аппаратное обеспечение 3D полностью не завершит рисование, прежде чем оно сможет войти, чтобы разделить пиксели непосредственно в буфере кадров. Пока программное обеспечение не завершит работу, аппаратное обеспечение будет бездействовать.
Растровые изображения и рисованные пиксели должны быть выровнены параллельно краям экрана, поэтому поворот текста невозможен.
Масштабирование растровых изображений и рисованных пикселей невозможно.
Есть одно существенное преимущество для растровых шрифтов - это то, что в программных реализациях OpenGL они, вероятно, будут БЫСТРЕЕ, чем другие подходы ... обратная ситуация на 3D-оборудовании.

Геометрические шрифты. Нарисуйте символы шрифта, используя геометрические примитивы - линии, треугольники, что угодно. Недостатками этого являются:
Количество треугольников, необходимое для рисования некоторых символов, может быть очень большим, особенно если вы хотите, чтобы они хорошо выглядели. Это может быть плохо для производительности.
Разработка шрифтов сложна и дорога.
Использование шрифтов с цветными границами, тенями и т. Д. Усугубляет две другие проблемы.

Преимущества: Геометрические шрифты можно масштабировать, поворачивать, скручивать, трансформировать, выдавливать.
Вы можете использовать модные модели освещения, картирование окружающей среды, текстурирование и т. Д.
При использовании в трехмерном мире вы можете выполнять обнаружение столкновений с ними.
Геометрические шрифты хорошо масштабируются. У них нет плохих артефактов с псевдонимами, и они не становятся «размытыми» при увеличении.

Текстурные шрифты. Как правило, весь шрифт хранится в одной или двух больших картах текстур, и каждая буква рисуется как один четырехугольник. Недостатки:
Размер карты текстуры, которая вам нужна, может быть достаточно большим - особенно если вам нужны прописные и строчные буквы - и / или если вы хотите, чтобы шрифт выглядел хорошо при больших размерах точек. Это особенно проблема на оборудовании, которое поддерживает только ограниченные размеры текстурных карт (например, 3Dfx Voodoo может отображать карты размером только до 256x256)
Если вы используете MIPmapping, то масштабирование шрифта делает его нечетким. Если вы не используете MIPmapping, это будет выглядеть ужасно алиасно.

Преимущества:
Общность - вы можете использовать произвольное полноцветное изображение для каждой буквы шрифта. Текстурные шрифты можно вращать и масштабировать, хотя они всегда выглядят «плоскими».
Легко конвертировать другие виды шрифтов в карты текстур.
Вы можете нарисовать их в 3D-сцене, и они будут освещены правильно.
SPEED! Текстурированные шрифты требуют, чтобы на аппаратное обеспечение приходилось только один четырехугольник для каждого письма. Это, вероятно, на порядок быстрее, чем растровые или геометрические шрифты. Поскольку низкоуровневое трехмерное оборудование оптимизировано для рисования простых текстурированных многоугольников, скорость также повышается, потому что вы находитесь на «быстром пути» через средство визуализации. (CAVEAT: на программных OpenGL текстурные шрифты будут S-L-O-W.

Ссылки на некоторые бесплатные библиотеки шрифтов:

6 голосов
/ 04 апреля 2011
4 голосов
/ 04 апреля 2011

Я использую FTGL , который основывается на freetype .Чтобы создать трехмерный экструдированный текст, я делаю следующие вызовы:

#include <FTGL/ftgl.h>
#include <FTGL/FTFont.h>
...
FTFont* font = new FTExtrudeFont("path_to_Fonts/COOPBL.ttf");
font->Depth(.5);    // Text is half as 'deep' as it is tall
font->FaceSize(1);  // GL unit sized text
...
FTBBox bounds = font->BBox("Text");
glEnable(GL_NORMALIZE); // Because we're scaling
glPushMatrix();
glScaled(.02,.02,.02);
glTranslated(-(bounds.Upper().X() - bounds.Lower().X())/2.0,yy,zz); // Center the text
font->Render("Text");
glPopMatrix();
glDisable(GL_NORMALIZE);
1 голос
/ 13 апреля 2011

Я рекомендую вам QT, который является основой KDE или GTk + для GNOME. Оба они поддерживают OPENGL и текст. С QT вы можете создавать расширенную графику (QGraphicsView), включая анимацию ... Посмотрите демонстрационное приложение QT.

0 голосов
/ 04 апреля 2011

Хорошим началом будет урок NeHe OpenGL 14.

http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=14

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...