Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.01.2016, 18:13   #1
X-Key
Пользователь
 
Регистрация: 03.10.2012
Сообщений: 33
По умолчанию Реализация растрового шрифта.

Всем привет! Вообщем начал писать рендерер на OpenGL.
Написал небольшой GUI: реализовал кнопки включая обработку их состояний и панель. Движки никогда не писал (писал, но переписывал раз 5), и каждый раз когда берусь за что-то новое - велосипедю, ибо опыта мало и приходится изобретать то что уже сделали до меня (так даже интереснее).

Теперь ближе к делу )

Написал я функцию для вывода (слов, цифр) и столкнулся с проблемкой.
Как правильнее проверять и указывать что надо рисовать?
Я, конечно, понимаю, вопрос быть может примитивный, но я сделал так (О БОЖЕ!) Мне не нравится такой подход, за сим пришел сюда за пинком в нужном направлении, вообщем подскажите как лучше это реализовать.

Вот что я нагородил...
Код:
void Label::PrintText (char* string, int Ten, int Unit)
{
	OrthoMode (0, 0, _widthScreen, _heightScreen);
	glDisable (GL_DEPTH_TEST);

	glBindTexture (GL_TEXTURE_2D, _idTextureFont);

	int lenght = 0; // расстояние между буквами
	
	while (*string)
	{
		
		if (*string == 'A')
		{
			glBegin (GL_QUADS);
			glTexCoord2f (0.103f, 0.255f);   glVertex2f (_CoordinateVertex[0].x + lenght, _CoordinateVertex[0].y);
			glTexCoord2f (0.103f, 0.375);   glVertex2f (_CoordinateVertex[1].x + lenght, _CoordinateVertex[1].y);
			glTexCoord2f (0.195f, 0.375f);   glVertex2f (_CoordinateVertex[2].x + lenght, _CoordinateVertex[2].y);
			glTexCoord2f (0.195f, 0.255f);   glVertex2f (_CoordinateVertex[3].x + lenght, _CoordinateVertex[3].y);
			glEnd ();
		}

		if (*string == 'B')
		{
			glBegin (GL_QUADS);
			glTexCoord2f (0.203f, 0.255f);   glVertex2f (_CoordinateVertex[0].x + lenght, _CoordinateVertex[0].y);
			glTexCoord2f (0.203f, 0.375);   glVertex2f (_CoordinateVertex[1].x + lenght, _CoordinateVertex[1].y);
			glTexCoord2f (0.298f, 0.375f);   glVertex2f (_CoordinateVertex[2].x + lenght, _CoordinateVertex[2].y);
			glTexCoord2f (0.298f, 0.255f);   glVertex2f (_CoordinateVertex[3].x + lenght, _CoordinateVertex[3].y);
			glEnd ();
		}
И так далее...
                 lenght += 28;
		*string++;
	}
PerspectiveMode ();
}
Но так проверять каждую букву... каждый кадр...(хотя фпс выдает 900 с хвостиком).
Если для каждой буквы хранить её координаты на текстуре в двумерном массиве то строчек меньше будет. Но мне этот подход не нравится: в одной функции 256 if тогда получается. Или так везде и делают проверку?

Последний раз редактировалось X-Key; 05.01.2016 в 18:16.
X-Key вне форума Ответить с цитированием
Старый 05.01.2016, 19:10   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Координаты каждой буквы - в массив.
В итоге массив из массивов для всех букв.
Потом все загоняем в list.

http://www.songho.ca/opengl/gl_displaylist.html
http://www.glprogramming.com/red/chapter07.html

Только что будете делать с уникодом?
waleri вне форума Ответить с цитированием
Старый 05.01.2016, 19:14   #3
X-Key
Пользователь
 
Регистрация: 03.10.2012
Сообщений: 33
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Только что будете делать с уникодом?
Если честно, об этом пока не задумывался. Есть мысли?
X-Key вне форума Ответить с цитированием
Старый 05.01.2016, 20:44   #4
X-Key
Пользователь
 
Регистрация: 03.10.2012
Сообщений: 33
По умолчанию

Ну, вообщем, конвертируем строку в int. Эти индексы применить как элементы массива позиций нужной буквы на атласе.
Например:
Код:
int lenght = 28;
	while (*string)
	{
		int index = (int)*string;

		glTexCoord2f (upos_min[index], vpos_min[index]);  glVertex2f (_CoordinateVertex[0].x + lenght, _CoordinateVertex[0].y); 
		glTexCoord2f (upos_min[index], vpos_max[index]);  glVertex2f (_CoordinateVertex[1].x + lenght, _CoordinateVertex[1].y); 
		glTexCoord2f (upos_max[index],  vpos_max[index]);  glVertex2f (_CoordinateVertex[2].x + lenght, _CoordinateVertex[2].y); 
		glTexCoord2f (upos_max[index],  vpos_min[index]);  glVertex2f (_CoordinateVertex[3].x + lenght, _CoordinateVertex[3].y);

	*string++;
	}
X-Key вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Алгоритм точного поворота растрового изображения Prosolver Gamedev - cоздание игр: Unity, OpenGL, DirectX 22 06.07.2016 18:47
Смена шрифта Станислав Д C# (си шарп) 1 25.12.2013 10:38
загрузка растрового изображения Serg16361898 Помощь студентам 0 01.06.2010 20:15
размер шрифта varelik Общие вопросы Delphi 10 16.09.2009 13:58
Размер шрифта Gorychev HTML и CSS 6 25.05.2008 11:42