PMG

Форумы по созданию игр
Текущее время: 26 апр 2024 02:57

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
 Заголовок сообщения: Растровые шрифты
СообщениеДобавлено: 10 июл 2007 11:59 
Не в сети
Новичок
Аватара пользователя

Зарегистрирован: 10 июл 2007 11:43
Сообщения: 5
Откуда: Тула
Мне нужно делать подписи к объектам, какнть попроще и побыстрее, и ГЛАВНОЕ на РУССКОМ ЯЗЫКЕ.
Я пользую C#, Tao Framework, но OpenGl ведь везде одинаковый.
Наверное можно конкретизировать вопрос так... Как вытащить из Ansi кодировки русские буквы.
PS: Очень хотелось бы увидеть рабочий примерчик :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 10 июл 2007 12:51 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Забиваешь в текстуру шрифт и вводишь. У NeHe много про это уроков.

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 10 июл 2007 12:58 
Не в сети
Новичок
Аватара пользователя

Зарегистрирован: 10 июл 2007 11:43
Сообщения: 5
Откуда: Тула
Как я понял самый простой вариант описан в 13 уроке. Я хочу так, если это возможно, но там берется 96 символов, в которые русские буквы не входят.
Может это у кого получилось.
Хотя возможно я чего то недопонимаю или это не самый простой способ?

_________________
Миг осознания своей ограниченности, есть проблеск гения!!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 11 июл 2007 08:47 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
base = glGenLists(256); // Выделим место для 256 символов ( НОВОЕ )

wglUseFontBitmaps(hDC, 0, 255, base); // Построить 256 символов ( НОВОЕ )

glListBase(base); // Задать базу символа ( НОВОЕ )

А так ты прав, надо бы мне подшаманить этот урок, для адаптации на русский язык.

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 11 июл 2007 14:33 
Не в сети
Новичок
Аватара пользователя

Зарегистрирован: 10 июл 2007 11:43
Сообщения: 5
Откуда: Тула
Ну вроде я так сделал, но не помогает.
Что я делаю:
В инициализации Запускаю BuildFont()
Код:
private static void BuildFont()
        {
            IntPtr font;                                           // Windows Font ID
            IntPtr oldfont;                                       // Used For Good House Keeping
            fontbase = Gl.glGenLists(256);               // Storage For 256Characters

            font = Gdi.CreateFont(                           // Create The Font
                -24,                                                  // Height Of Font
                0,                                                     // Width Of Font
                0,                                                     // Angle Of Escapement
                0,                                                     // Orientation Angle
                Gdi.FW_BOLD,                                   // Font Weight
                false,                                                // Italic
                false,                                                // Underline
                false,                                                // Strikeout
                Gdi.ANSI_CHARSET,                          // Character Set Identifier
                Gdi.OUT_TT_PRECIS,                         // Output Precision
                Gdi.CLIP_DEFAULT_PRECIS,               // Clipping Precision
                Gdi.ANTIALIASED_QUALITY,               // Output Quality
                Gdi.FF_DONTCARE | Gdi.DEFAULT_PITCH,                            // Family And Pitch
                "Arial");                                            // Font Name

            IntPtr hDC = Wgl.wglGetCurrentDC();    //Я добавил эту строчку
            oldfont = Gdi.SelectObject(hDC, font);  // Selects The Font We Want
            Wgl.wglUseFontBitmaps(hDC, 0, 255, fontbase);  // Builds 256 Characters             Gdi.SelectObject(hDC, oldfont);        // Selects The Font We Want
            Gdi.DeleteObject(font);                           // Delete The Font
        }
Потом внутри создания сцены вызываю
Код:
            Gl.glRasterPos3d(10, 15, 30);
            glPrint("Waw Привет 1221");
где
Код:
private static void glPrint(string text)
        {
            if (text == null || text.Length == 0)
            {                              // If There's No Text
                return;                                                         // Do Nothing
            }
            Gl.glPushAttrib(Gl.GL_LIST_BIT);                       // Pushes The Display List Bits
            Gl.glListBase(fontbase);                                    // Sets The Base Character
            // .NET -- we can't just pass text, we need to convert
            byte[] textbytes = new byte[text.Length];
            for (int i = 0; i < text.Length; i++) textbytes[i] = (byte)text[i];
            Gl.glCallLists(text.Length, Gl.GL_UNSIGNED_BYTE, textbytes);        // Draws The Display List Text
            Gl.glPopAttrib();                                                   // Pops The Display List Bits
        }

В результате я получаю "Waw @825В 1221"

Вот такие пироги :(
В качестве базового кода я взял урок 13 NeHe, который поставлялся с Tao framewok. Я старался как можно меньше делать изменений. Вот А русских букв я так и не увидел(((

Наверное прийдется делать свою текстуру, а очень не хочется :cry:

_________________
Миг осознания своей ограниченности, есть проблеск гения!!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 11 июл 2007 16:08 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Это из-за unicode: или из-за ANSI_CHARSET или из-за string.
У тебя strting не в unicode?
А шрифт генерируется в unicode? По пробуй OEM_CHARSET.

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 11 июл 2007 17:16 
Не в сети
Новичок
Аватара пользователя

Зарегистрирован: 10 июл 2007 11:43
Сообщения: 5
Откуда: Тула
Ага точно string в Unicod кодировке :)
OEM_CHARSET поставил.
Наверное теперь снова нужно изменить количество символов
Делаю
base = glGenLists(1104);
wglUseFontBitmaps(hDC, 0,1103, base);
glListBase(base);

и.....))) Весь текст исчезает совсем. Непонятно????
1103- Unicod буквы 'я' (Если я не ошибаюсь)
если оставить Все как было, то весь русский текст пропадает, а английский выводится без ошибок.

_________________
Миг осознания своей ограниченности, есть проблеск гения!!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 11 июл 2007 18:23 
Не в сети
Опытный
Аватара пользователя

Зарегистрирован: 11 авг 2004 17:00
Сообщения: 283
Откуда: Москва
Надо ставить RUSSIAN_CHARSET или DEFAULT_CHARSET.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 12 июл 2007 10:54 
Не в сети
Новичок
Аватара пользователя

Зарегистрирован: 10 июл 2007 11:43
Сообщения: 5
Откуда: Тула
Я попробовал OEM_CHARSET, RUSSIAN_CHARSET, DEFAULT_CHARSET

результат - одинаковый в массиве textbytes в функции glPrint();
Русскому алфавиту соответствуют значения 1040-1103

В общем я нашел решение:
fontbase = Gl.glGenLists(257);
Wgl.wglUseFontBitmaps(hDC, 0, 256, fontbase);

Код:
        public void glPrint(double x, double y, double z, string text)
        {
            Gl.glRasterPos3d(x, y, z);
            if (text == null || text.Length == 0)
            {
                return;
            }
            Gl.glPushAttrib(Gl.GL_LIST_BIT);
            Gl.glListBase(fontbase);
            byte[] textbytes = new byte[text.Length];
            for (int i = 0; i < text.Length; i++)
            {
                textbytes[i] = (byte)text[i];

                if (text[i] > 1039 && text[i] < 1104)
                {
                    textbytes[i] = (byte)(text[i] + 176);
                }
                else
                {
                    textbytes[i] = (byte)text[i];
                }
            }
            Gl.glCallLists(text.Length, Gl.GL_UNSIGNED_BYTE, textbytes);
            Gl.glPopAttrib();
        }



Работает, но как то это грубо :shock:
А так всем спасибо за помощь. :oops: Без вас я бы не разобрался.

_________________
Миг осознания своей ограниченности, есть проблеск гения!!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 12 авг 2007 13:28 
Не в сети
Любитель

Зарегистрирован: 12 авг 2007 13:19
Сообщения: 20
Лучше попробуй библиотеку FTGL (freetype+opengl). Она работает с юникодом, делаешь просто Font->Print(L"текст"); и радуешься жизни =)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 117


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB