Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 [2] 3  Все   Вниз
  Печать  
Автор Тема: Вывод текста в DirectX 9  (Прочитано 96865 раз)
0 Пользователей и 15 Гостей смотрят эту тему.
Антон__
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #30 : 13-03-2009 21:20 » 

У меня не компилируется, для вывода текста требует спрайт.
Какие у тебя директ икс и студия?
Записан
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #31 : 13-03-2009 21:35 » 

DirectX 9 SDK
Microsoft Visual C++ 6
Записан
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #32 : 14-03-2009 06:08 » 

По ходу дело выяснился что у меня старый DirectX 9 SDK.
Это выяснилось на основании параметров функции DrawText у новой версии  DirectX 9 SDK параметры этой функции немного другие.

В связи с этим маленький вопросик
Как называется самая последняя версия DirectX из 9 серии?
Записан
Антон__
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #33 : 14-03-2009 06:18 » 

directx sdk november 2008
У меня такая.
Записан
Антон__
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #34 : 14-03-2009 06:20 » 

Так ли тебе нужен 3д текст?
Изучил бы ID3DXMesh или шейдеры.
Записан
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #35 : 14-03-2009 06:58 » 

C 3D текстом всё впорядке в книге Франк Луна - Введение в программирование трехмерных игр с DX9 всё хорошо по этому поводу написано, а вот про вращение 2D-текста/3D-текста ни слова, ID3DXMesh и шейдеры яещё до них не дошёл в изучении DirectX, но дойду. я делаю всё постепенно.
Записан
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #36 : 14-03-2009 07:10 » 

Прояснил этот вопрос самая последняя версия DirectX 9c SDK ноябрь 2008, более новые версии из 9 серии не придлагает скачать официальный сайт Microsoft.
Записан
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #37 : 14-03-2009 09:41 » 

Я стёр старый DirectX 9 SDK и установил DirectX 9c SDK ноябрь 2008, но он автоматически не прикрепился к Microsoft Visual C++ 6, как старый DirectX 9 SDK.

Компилятор выдаёт ошибку

Compiling...
text.cpp
C:\Progs\Programming\VC\MyProjects\text\text.cpp(4) : fatal error C1083: Cannot open include file: 'd3d9.h': No such file or directory
Error executing cl.exe.

text.exe - 1 error(s), 0 warning(s)

Я так понял в проекте нужно подключить папку include из состава DirectX 9c SDK ноябрь 2008, но как это сделать?


DirectX 9c SDK ноябрь 2008 установлен в C:\DXSDK\.
Записан
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #38 : 14-03-2009 11:01 » 

Настроил
1. Запускаем Microsoft Visual C++ 6
2. Tools->Options...->Derictories
3. Добавляем C:\DXSDK\INCLUDE
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #39 : 14-03-2009 11:03 » 

ещё в LIB надо путь прописать Улыбаюсь
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #40 : 14-03-2009 11:34 » 

Почему-то я либы люблю прорисывать так

Код:
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")

А в новой версии DirectX это не работает так как та либы ещё делятся на x64 и x86.

Код:
#pragma comment(lib, "x86\d3d9.lib")
#pragma comment(lib, "x86\d3dx9.lib")

Но это не работает.


Как правельно их подключить если можно через #pragma?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #41 : 14-03-2009 12:47 » 

так потому и надо путь прописать Отлично
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #42 : 14-03-2009 16:08 » new

Всё понял
1. Запускаем Microsoft Visual C++ 6
2. Tools->Options...->Derictories
3. Выбираем Library files
4. Добавляем C:\DXSDK\LIB\X86
Записан
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #43 : 14-03-2009 17:13 » 

Так как у меня новый DirectX 9c SDK ноябрь 2008 функцию вывода текста пришлось переписать.

Было так

Код:
void MyTextOut(char *TextString, long x1, long y1, long x2, long y2, D3DCOLOR TextColor)
{   
   RECT myRect;            //переменная, которая будет задавать область вывода на экран
   LOGFONT lf;

   ZeroMemory(&lf, sizeof(LOGFONT));
   lf.lfHeight    = 25;    // в логических единицах
   lf.lfWidth     = 12;    // в логических единицах
   lf.lfWeight    = 500;   // насыщенность, диапазон 0(тонкий) - 1000(жирный)
   lf.lfItalic    = false;
   lf.lfUnderline = false;
   lf.lfStrikeOut = false;
   lf.lfCharSet   = DEFAULT_CHARSET;
   lstrcpy(lf.lfFaceName, "Times New Roman"); // гарнитура шрифта

   D3DXCreateFontIndirect(pDirect3DDevice, &lf, &pFont);
   
   // координаты прямоугольнка
   myRect.left   = x1;
   myRect.top    = y1;
   myRect.right  = x2;
   myRect.bottom = y2;
   // Вывод текста
   pFont->DrawText(TextString, -1,&myRect, DT_CENTER, TextColor);
}

А стало так

Код:
void MyTextOut(char *TextString, long x1, long y1, long x2, long y2, D3DCOLOR TextColor)
{   
   RECT myRect;            //переменная, которая будет задавать область вывода на экран
   D3DXFONT_DESCA lf;
   
   ZeroMemory(&lf, sizeof(D3DXFONT_DESCA));
   lf.Height    = 25;    // в логических единицах
   lf.Width     = 12;    // в логических единицах
   lf.Weight    = 500;   // насыщенность, диапазон 0(тонкий) - 1000(жирный)
   lf.Italic    = false;
   lf.CharSet   = DEFAULT_CHARSET;
   lstrcpy(lf.FaceName, "Times New Roman"); // гарнитура шрифта

   D3DXCreateFontIndirect(pDirect3DDevice, &lf, &pFont);

   
   // координаты прямоугольнка
   myRect.left   = x1;
   myRect.top    = y1;
   myRect.right  = x2;
   myRect.bottom = y2;
   // Вывод текста
   pFont->DrawText(NULL, TextString, -1,&myRect, DT_CENTER, TextColor);
}

Но почемуто у меня программа стала пожирать ресурсы компьютера?

Для большего понимания проблемы прикрепляю файл

* text2.cpp (14.81 Кб - загружено 1348 раз.)
Записан
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #44 : 14-03-2009 17:25 » 

Есть мысль что я создаю шрифт на каждом выводе текста, а достаточно создать один раз, вот наверное из-за этого ресурсы компьютера и пожирает моя программа.

Если в этом дело, то как это поправить?
Записан
Антон__
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #45 : 14-03-2009 20:40 » 

А в чём проблема?
Взять и создать его один раз.
Записан
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #46 : 14-03-2009 20:41 » 

Если заменить

Код:
 D3DXCreateFontIndirect(pDirect3DDevice, &lf, &pFont);

На

Код:
if (pFont == NULL)
     D3DXCreateFontIndirect(pDirect3DDevice, &lf, &pFont);

То программа перестаёт "жрать" ресурсы компьютера.
Записан
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #47 : 14-03-2009 20:42 » 

Я правельно сделал или нет?
Записан
Антон__
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #48 : 15-03-2009 07:10 » 

Правильно.
Я тоже так делаю, когда мне лень выносить создание чего-то в отдельную функцию.Ага
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #49 : 15-03-2009 07:26 » 

Когда лень - рулят классы )
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #50 : 15-03-2009 09:49 » 

Я тоже буду пробовать сделать как класс, но в конце изучения основных аспектов DirectX, я не стал делать в виде классов сразу всеголишь по одной причине в книгах которые есть у меня все примеры без классов и я не хотел примеры переделывать под классы.

Так как с выводом текста разобрался приступаю к вращению текста.
Записан
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #51 : 15-03-2009 12:57 » 

Вот нашёл пример в DirectX 9c ноябрь 2008 который называется Text3D и находится ...\Samples\C++\Direct3D\Text3D\

Открыл файл text3d.cpp и там для вращения нашёл следующие фрагменты кода
Конешно у меня текст 2D, а в примере 3D, но я думаю это не принципиально

Код:
// Глобальные переменные
D3DXMATRIXA16               g_matObj1;
D3DXMATRIXA16               g_matObj2;

// Прототип функции
void CALLBACK OnFrameMove( double fTime, float fElapsedTime, void* pUserContext );

INT WINAPI wWinMain( HINSTANCE, HINSTANCE, LPWSTR, int )
{
       ...
       ...
       ...
       DXUTSetCallbackFrameMove( OnFrameMove );
       ...
       ...
       ...
}

//--------------------------------------------------------------------------------------
// This callback function will be called once at the beginning of every frame. This is the
// best location for your application to handle updates to the scene, but is not
// intended to contain actual rendering calls, which should instead be placed in the
// OnFrameRender callback. 
//--------------------------------------------------------------------------------------
void CALLBACK OnFrameMove( double fTime, float fElapsedTime, void* pUserContext )
{
    // Setup five rotation matrices (for rotating text strings)
    D3DXVECTOR3 vAxis1( 1.0f,2.0f,0.0f );
    D3DXVECTOR3 vAxis2( 1.0f,0.0f,0.0f );
    D3DXMatrixRotationAxis( &g_matObj1, &vAxis1, ( float )fTime / 2.0f );
    D3DXMatrixRotationAxis( &g_matObj2, &vAxis2, ( float )fTime );

    D3DXMATRIX mScale;
    D3DXMatrixScaling( &mScale, 0.5f, 0.5f, 0.5f );
    g_matObj2 *= mScale;

    // Add some translational values to the matrices
    g_matObj1._41 = 1.0f;   g_matObj1._42 = 6.0f;   g_matObj1._43 = 20.0f;
    g_matObj2._41 = -4.0f;  g_matObj2._42 = -1.0f;  g_matObj2._43 = 0.0f;
}

Не могу понять как эти куски кода заставляют вертется текст.
Хотя когда запускаешь исполняемый файл текст прекрасно вертится (исполняемый файл находится ...\Samples\C++\Direct3D\Bin\x86\Text3D.exe)

Что мне непонятно (это сразу бросилось в глаза):
1. fTime ни где не инициализированна.
2. В строке DXUTSetCallbackFrameMove( OnFrameMove ); почему функции OnFrameMove не передаются параметры хотя они у неё есть.
3. Почему вертится постоянно текст ведь функция DXUTSetCallbackFrameMove запускается один раз при включении программы (В этом я не уверен)

Такое ощущение что сначала сделали код скомпилировали и получили исполняемый файл, а затем убрали из фала с кодом строчки, или я тупой и не понимаю этот код.
Записан
Антон__
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #52 : 15-03-2009 15:14 » 

Так это DXUT - просто надстройка над директ иксом.
Делаешь нужные функции(рисование кадра, обработка событий и т.д.) и передаёшь куда-то указатели на эти функции.
А дальше DXUT сам всё обрабатывает:)
Записан
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #53 : 15-03-2009 20:38 » 

Я думал DXUT.h это стандартный заголовочный файл DirectX-a, а оказывается нет, это собственная разработка для примера и в примерах этого файла нет, так что будем другие примеры искать для вращения текста.
Записан
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #54 : 15-03-2009 22:46 » 

Нашёл в примерах этот файл и другии которые нужны для клмпиляции, оказалось они лежат в другой папке, но в этих примерах так всё запутанно.
Буду искать пример в другом месте.
Записан
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #55 : 17-03-2009 22:38 » 

Оказалось

Чтобы вращать текст нужно сделать вывод текста через Mesh или Sprite (текстура с текстом на полигоне).

В примере из DirectX 9c ноябрь 2008 используется Mesh.

Я разделы DirewcX Mesh и Sprite (текстура с текстом на полигоне) ещё не проходил, как пройду так сразу выложу код для вращения текста, а пока я прерываюсь с вращением текста.
« Последнее редактирование: 18-03-2009 04:50 от zuze » Записан
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #56 : 18-03-2009 17:12 » 

Решил вывести на экран 3D-текст, для этой цели использую Mesh

Код:
void MyTextOut(char *TextString)

     // Получение дескриптора контекста устройства
     HDC hdc = CreateCompatibleDC(0);
   
     // Обявление переменную которая является экземпляром структуры
     LOGFONT lf;
     // Очищаем экземпляр структуры
     ZeroMemory(&lf, sizeof(LOGFONT));
 
     // Заполняем экземпляр структуры
     lf.lfHeight    = 25;    // в логических единицах
     lf.lfWidth     = 12;    // в логических единицах
     lf.lfWeight    = 500;   // насыщенность, диапазон 0(тонкий) - 1000(жирный)
     lf.lfItalic    = false; // false - означает курсив
     lf.lfUnderline = false; // false - означает подчеркивание
     lf.lfStrikeOut = false; // false - перечеркнутый шрифт
     lf.lfCharSet   = DEFAULT_CHARSET; // Номер набора символов шрифта - таблицы кодировки
     lstrcpy(lf.lfFaceName, "Times New Roman"); // гарнитура шрифта

     HFONT hFont;      // Дискриптор создаваемого шрифта
     HFONT hFontOld; // Дескриптор старого шрифта

     // Создаём объект HFONT на основе заполненной стрктуры
     hFont = CreateFontIndirect(&lf);
     // Делаем данный шрифт текущим шрифтом
     hFontOld = (HFONT)SelectObject(hdc, hFont);

     // Указател на Меш
     LPD3DXMESH Text = NULL;
     // Создание трехмерной сетки, представляющую строку текста
     D3DXCreateText(pDirect3DDevice, hdc, TextString, 0.001f, 0.4f, &Text, 0, 0);

     // Вывод текста
     Text->DrawSubset(0);

     // Восстанавление бывшего до этого шрифта
     SelectObject(hdc, hFontOld);
     // Освобождение памяти указателя на шрифт
     DeleteObject(hFont);
     // Освобождение памяти дискриптора контекста устройства
     DeleteDC(hdc);
     // Освобождение памяти указателя на меш
     if (Text != NULL)
      Text->Release();
}

Но текст почему-то не выводится.

Помогите пожалуйста разобраться?

У меня по этому поводу две мысли:

1. Надо задать цвет текста.
2. Текст выводится, но его не видно из-за двух вращающихся кубов .

Для лучшего понимания прелагаю полный код

* text2.cpp (15.45 Кб - загружено 1383 раз.)
« Последнее редактирование: 18-03-2009 18:23 от zuze » Записан
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #57 : 18-03-2009 20:24 » 

В моём коде по мимо вывода 3D-текста, есть ещё вращение двух кубом с освещением.
Я подумал может они закрывают текст и что же я увидел когда я убрал из кода всё что относится к кубам.

В место слова "Hello" отображается "He", нижния координата левой стороны буквы 'Н' начинается от центра окна, а верхний правый кусочек буквы 'е' выходит за экран.

Пока не знаю как поправить, думаю, буду рад за помощь.
Записан
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #58 : 18-03-2009 21:31 » 

Так как структура LOGFONT использовалась раньше, а теперь в DirectX 9.0c SDK ноябрь 2008 используется структура D3DXFONT_DESCA, хотя иногда и компилятор наструктуру LOGFONT не ругается.

Я решил код вывода переписать

Код:
void MyTextOut(char *TextString)

     // Получение дескриптора контекста устройства
     HDC hdc = CreateCompatibleDC(0);
   
     HFONT hFont;      // Дискриптор создаваемого шрифта
     HFONT hFontOld; // Дескриптор старого шрифта

     hFont = CreateFont(0, 0, 0, 0, FW_NORMAL, 1, false, false, false, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, ANTIALIASED_QUALITY, DEFAULT_PITCH | FF_DONTCARE, 
                                     TEXT("Times New Roman"));

     // Делаем данный шрифт текущим шрифтом
     hFontOld = (HFONT)SelectObject(hdc, hFont);

     // Указател на Меш
     LPD3DXMESH Text = NULL;
     // Создание трехмерной сетки, представляющую строку текста
     D3DXCreateText(pDirect3DDevice, hdc, TextString, 0.001f, 0.4f, &Text, NULL, NULL);

     // Вывод текста
     Text->DrawSubset(0);

     // Восстанавление бывшего до этого шрифта
     SelectObject(hdc, hFontOld);
     // Освобождение памяти указателя на шрифт
     DeleteObject(hFont);
     // Освобождение памяти дискриптора контекста устройства
     DeleteDC(hdc);
     // Освобождение памяти указателя на меш
     if (Text != NULL)
      Text->Release();
}


Но всёравно текст выводится вот так
В место слова "Hello" отображается "He", нижния координата левой стороны буквы 'Н' начинается от центра окна, а верхний правый кусочек буквы 'е' выходит за экран.
Записан
Антон__
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #59 : 19-03-2009 11:08 » 

zuze,
Код в студию.Улыбаюсь
Какую мировую матрицу ставишь?
Записан
Страниц: 1 [2] 3  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines