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

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

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


« : 23-02-2009 22:50 » 

Начал учится выводить текст на экран по книге Станислава Горнакова "DirectX 9: Уроки программирования на С++".
У него в главе одни ошибки я их поправил как писали в интернете всё равно ошибки.

У меня есть ещё книга Алена Торна "Графика в формате DirectX 9: Поолное руководство по использованию 3D-пространства", но там к сожалению нет главы посвещённой выводу текста.

Что же я не так сделал?

Прикрепляю архив Text.rar с двумя файлами:
1. Text_Original.cpp текст кода из книги (в интернете говорят там много всего неправельно)
2. Text.cpp текст кода из книги переделанный по совету из интернета и адаптирован под builder
3. error.jpg - PrintScreen ошибок

* test.rar (82.28 Кб - загружено 1014 раз.)
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #1 : 24-02-2009 15:40 » 

HFONT - это обычный апишный фонт, может просто достать  контекста HDC да рисовать текст как обычно ? Улыбаюсь Должна быть где то функция для достатия контекста
Записан

RXL
Технический
Администратор

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

WWW
« Ответ #2 : 24-02-2009 16:15 » 

Леш, что там? Расскажи для ленивых, кому не хочется качать проект. Улыбаюсь
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #3 : 24-02-2009 17:48 » 

эхъ, знал бы я ещё, про что рассказывать Улыбаюсь

но вот прототип нашёл.
zuze, у тебя в Text_Original.cpp такая строка обламывается
   D3DXCreateFont(pDirect3DDevice, hFont, &pFont);
а параметры должны быть такие

        LPDIRECT3DDEVICE9       pDevice, // 3Dдевайс
        INT                     Height,
        UINT                    Width,
        UINT                    Weight,
        UINT                    MipLevels,
        BOOL                    Italic,
        DWORD                   CharSet,
        DWORD                   OutputPrecision,
        DWORD                   Quality,
        DWORD                   PitchAndFamily,
        LPCSTR                  pFaceName,
        LPD3DXFONT*             ppFont);

по аналогии с GDI-шной CreateFontIndirect ,

typedef struct tagLOGFONT {
  LONG lfHeight;
  LONG lfWidth;
  LONG lfEscapement;
  LONG lfOrientation;
  LONG lfWeight;
  BYTE lfItalic;
  BYTE lfUnderline;
  BYTE lfStrikeOut;
  BYTE lfCharSet;
  BYTE lfOutPrecision;
  BYTE lfClipPrecision;
  BYTE lfQuality;
  BYTE lfPitchAndFamily;
  TCHAR lfFaceName[LF_FACESIZE];
} LOGFONT, *PLOGFONT;

zuze, найди описание структуры  LOGFONT, цитировать из мсдн там много
Записан

zuze
Опытный

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


« Ответ #4 : 24-02-2009 21:32 » 

Да строка

Код:
D3DXCreateFont(pDirect3DDevice, hFont, &pFont);

не подходит, так как такая строка используется в DirectX 9.0b, а у меня DirectX 9.0c
Записан
zuze
Опытный

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


« Ответ #5 : 24-02-2009 22:07 » 

Странно у меня DirectX 9.0c, а функция D3DXCreateFont содержин не 12, а 3 параметра.

Это я узнал из того что компилятор начал выдавать ошибки с надписью HFONT.

Надеюсь я заполню структуру HFONT правельно и текст наконец-то начнёт выводится на экран.

Прикрепляю файл с ошибками их стало намного меньше.

* error.JPG (52.25 Кб - загружено 1065 раз.)
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #6 : 25-02-2009 04:26 » 

HFONT - это не структура, а хендл

лучше покажи строчку, на которую ругается, а также текст ругани
Записан

zuze
Опытный

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


« Ответ #7 : 25-02-2009 07:59 » 

Вот код

Код:
// Глобальные переменные
LPD3DXFONT pFont = NULL;//указатель на интефейс, отвечающий за работу со шрифтом
RECT myRect;            //переменная, которая будет задавать область вывода на экран

void MyTextOut(char *TextString, long x1, long y1, long x2, long y2, D3DCOLOR TextColor)
{
   // инициализация шрифта
   if(pFont == NULL)
     D3DXCreateFont(pDirect3DDevice, 20, 0, FW_NORMAL, 1, false, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, ANTIALIASED_QUALITY, DEFAULT_PITCH | FF_DONTCARE, TEXT("Times New Roman"), &pFont);
   // координаты прямоугольнка
   myRect.left   = x1;
   myRect.top    = y1;
   myRect.right  = x2;
   myRect.bottom = y2;
   // Вывод текста
   pFont->DrawText(TextString, -1,&myRect, DT_CENTER, TextColor);
}

Вот что выдаёт компилятор

C:\borland\bcc55\bin>bcc32 -tW -w- Text.cpp
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
Text.cpp:
ERROR E2034 Text.cpp 235: Cannot convert 'int' to 'HFONT__ *' in function MyTextOut(char *, long, long, long, long, unsigned long)
ERROR E2342 Text.cpp 235: Type mismatch in parameter 'hFont' (wanted 'HFONT__ *', got 'int') in function MyTextOut(char *, long, long, long, long, unsigned long)
ERROR E2227 Text.cpp 235: Extra parametr in call to __stdcall  D3DXCreateFont(IDirect3DDevice9, HFONT__ *, ID3DXFont **)  in function MyTextOut(char *, long, long, long, long, unsigned long)
*** 3 errors in Compile ***

C:\borland\bcc55\bin>

На всякий случай рикрепляю полный текст

* Text.cpp (16.99 Кб - загружено 1194 раз.)
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #8 : 25-02-2009 08:21 » 

Цитата
Type mismatch in parameter 'hFont' (wanted 'HFONT__ *', got 'int')
почему то ругань на указатель , почему - не понимаю ((.

может привести насильно -

(HFONT*)&pFont
Записан

zuze
Опытный

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


« Ответ #9 : 25-02-2009 16:15 » 

Открыл посмотреть файл d3dx9core.h нашёл функцию D3DXCreateFont у неё три параметра

Вот код

Код:
#ifdef __cplusplus
extern "C" {
#endif //__cplusplus

HRESULT WINAPI
    D3DXCreateFont(
        LPDIRECT3DDEVICE9   pDevice,
        HFONT               hFont,
        LPD3DXFONT*         ppFont);

А во многих примерах в интернете это функция с 12 параметрами это очень странно.

Записан
zuze
Опытный

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


« Ответ #10 : 25-02-2009 16:39 » 

Побробовал сделать иначе, как написано в книге Франка Луны - Введение в программирование трехмерных игр с DX9

Код

Код:
// Глобальная переменная
LPD3DXFONT pFont = NULL;//указатель на интефейс, отвечающий за работу со шрифтом
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);
}

Возникает такая ошибка

C:\borland\bcc55\bin>bcc32 -tW -w- Text.cpp
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
Error: Unresolved external 'D3DXCreateFontIndirect' referenced from C:\BORLAND\BCC55\BIN\TEXT.OBJ

Что же опять не так?
Записан
zuze
Опытный

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


« Ответ #11 : 25-02-2009 22:45 » 

У меня подключено

Код:
#include <windows.h>
#include <d3d9.h>
#include <d3dx9.h>
#include <d3dx9core.h>
#include <math.h>

#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")


Думал не работает из-за того что не подключил gdi.

Добавил

Код:
#include  <wingdi.h>
#pragma comment(lib/psdk, "gdi32.lib")

Не помогло.

Я склоняюсь к тому что нужно подключить библиотеку вопрос какую?
Записан
zuze
Опытный

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


« Ответ #12 : 26-02-2009 10:07 » 

Я использовал файлы DirectX 9 с сайта www.clootie.ru, ту узнал что они плохие.

В связи с этим у меня два маленьких вопросика:

1. Действительно файлы DirectX 9 с сайта www.clootie.ru плохие?
2. Если у Microsoft-а компилятор похожий на Borland C++ 5.5 Builder [67МБ](т.е. такой-же маленький)?
« Последнее редактирование: 02-03-2009 18:35 от RXL » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #13 : 26-02-2009 16:55 » 

zuze, что значит - плохие файлы DirectX 9 ?

Качай с мелкософтовского сайта SDK - и вперёд Улыбаюсь
Записан

zuze
Опытный

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


« Ответ #14 : 26-02-2009 17:02 » 

Для того чтобы правельно работал настроил DirectX 9 для Borland надо сделать:

1. Установка компилятора Borland C++ 5.5
2. Установка DirectX 9 SDK
3. Изменить строчки в файле bcc32.cfg на эти
-I"c:\DXSDK\include";"c:\Borland\Bcc55\include"
-L"c:\DXSDK\lib";"c:\Borland\Bcc55\lib"
4. Изменить строчки в файле ilink32.cfg на эти
-L"c:\DXSDK\lib";"c:\Borland\Bcc55\lib"
5. Файлы из папки CBuilder_DX92_libs скопировать в c:\DXSDK\lib
(CBuilder_DX92_libs.zip можно скачать с сайта www.clootie.ru)
6. Файлы из папки Clootie_DX92_dlls скопировать в c:\windows\system32 и c:\DXSDK\lib
(Clootie_DX92_dlls.zip можно скачать с сайта www.clootie.ru)
7. Создание файла с расширением *.c или *.cpp

#ifndef _MSC_VER
#define sqrtf (float)sqrt
#endif

// в этом файле лежат все функции WinAPI
#include <windows.h>
// подключаем заголовочный файл DirectX 9 SDK
#include <d3d9.h>
// заголовочный файл с матричными функциями
#include <d3dx9.h>

#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")

void main(void)
{
     
}
8. Компиляция
bcc32 -tW -w- <имя файла>.cpp
Если не хотим видеть предупреждения, то ставим параметр  -w-
Создание Windows приложения -tW

Оригинальная статья на английском языке
http://www.sorgonet.com/modules.php?name=News&file=article&sid=117
« Последнее редактирование: 02-03-2009 18:35 от RXL » Записан
zuze
Опытный

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


« Ответ #15 : 27-02-2009 03:08 » 

Перешёл на Microsoft Visual C++ 6 и текст начал выводится как написано в книге  Франка Луны - "Введение в программирование трехмерных игр с DX9".

Обнаглела администрация сайта www.clootie.ru раздают некоректно работающие файлы, а люди мучаются.

Только я одного понять не могу зачем нужно при использовании функции timeGetTime​ подключать библиотеку
#pragma comment(lib, "winmm.lib"), а если не подключать библиотеку, то при запуске программы возникает ошибка text.obj : error LNK2001: unresolved external symbol __imp__​timeGetTime@0, я её в компиляторе borland не подключал она и так работала, да и во многих примерах для Microsoft Visual не написано про это.

Если кто знает поясните пожалуйста этот момент?

И ещё один маленький вопросик, извините если немного не в тему

Как правельно компилировать и создавать исполняемый файл на Visual C++ 6 в командной строке?
« Последнее редактирование: 02-03-2009 18:35 от RXL » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #16 : 27-02-2009 05:08 » 

Цитата
Как правельно компилировать и создавать исполняемый файл на Visual C++ 6 в командной строке?
зачем тебе командная строка ? Прямо в среде всё делай , для релиза выбери Release режим
Записан

zuze
Опытный

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


« Ответ #17 : 27-02-2009 14:00 » 

Вот у меня тут вопросик в тему возник

Вот есть строка

Код:

// Вывод текста
pFont->DrawText(TextString, -1,&myRect, DT_CENTER, TextColor);

Второй параметр говорит о том чтобы длинну строки вычисляла функция DrawText автоматически.

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

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


« Ответ #18 : 28-02-2009 09:29 » 

при работе с HDC размер строки определяется при помощи GetTextExtentPoint, потом в прямоугольнике выводится текст. То есть, это всё равно что два раза текст напечатали, только первый раз не вывели на экран. Думаю, тут то же самое
Записан

zuze
Опытный

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


« Ответ #19 : 28-02-2009 09:56 » 

Я имел ввиду слудующие, покажу на примере.
Код:
TextString = "Hello";
длина строки 5 и я делаю так
Код:
pFont->DrawText(TextString, 5, &myRect, DT_CENTER, TextColor);
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #20 : 28-02-2009 10:06 » 

pFont->DrawText(TextString, ::strlen(TextString), &myRect, DT_CENTER, TextColor);

думаю, при -1 там та же функция вызовется
Записан

zuze
Опытный

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


« Ответ #21 : 28-02-2009 11:33 » 

А если тупо в место ::strlen(TextString) написать 5 будет ли намного быстрее или нет?
Ведь тогда не вычисляется длина, а она заложенна как константа.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #22 : 28-02-2009 13:19 » 

zuze, это негибко, и лазейка для вирусов.
Записан

zuze
Опытный

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


« Ответ #23 : 28-02-2009 14:30 » 

Если текст меняется, а следовательно и его длина, то это конешно плохо ставить значение длины текста в виде константы, это как ты сказал негибко и лазейка для вирусов (основанные на переполнение буфера), но если текст не меняется, а следовательно и его длина, то я думаю можно задать длину текста в виде константы и скорость выполнения программы будет быстрее.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #24 : 28-02-2009 17:07 » 

если и будет быстрее, то настолько незаметно, что оно не стоит того (особенно на фоне ухудшения безопасности и устойчивости программы) Улыбаюсь
Записан

zuze
Опытный

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


« Ответ #25 : 28-02-2009 17:33 » 

Вот это я и хотел узнать, я наверно плохо объяснил по этому мы так долго и проковырялись с этим очень маленьким вопросом.

Теперь всё понятно.
Записан
zuze
Опытный

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


« Ответ #26 : 28-02-2009 17:39 » 

Если можешь Алексей1153++ посмотри пожалуйста мою тему "Несколько вопросов по поводу Visual C++" в разделе  "...>Программирование > С/С++ > WinAPI & Visual C++" и дай пожалуйста ответ на вопросы я в этой теме не мог задать эти вопросы так как они не потеме, хотя один третьий вопрос уже был в этой теме и я пока на него ответа не получил. Я пока не получил там ни одного ответа.

Заранее спасибо!!!
Записан
zuze
Опытный

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


« Ответ #27 : 13-03-2009 09:34 » 

Хотел вращать выводимый текст по оси X, но что то не получается.

Функция вывода текста на экран

Код:
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;            //переменная, которая будет задавать область вывода на экран
   LOGFONT lf;
   D3DXMATRIX MatrixWorld;

   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);

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

Помогите пожалуйста понять, что нужно сделать чтобы текст начал вращатся?

На всякий случай пикрепляю полный код, необращайте внимание на то что у меня в коде описано кроме текста ещё вращение двух кубов с освещением.

* text.cpp (14.96 Кб - загружено 1281 раз.)
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #28 : 13-03-2009 10:01 » 

наверное, нужно напечатать текст на полигоне и вращать полигон Улыбаюсь Как - не знаю
Записан

Антон__
Помогающий

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

« Ответ #29 : 13-03-2009 21:09 » 

А зачем ты каждый раз создаёшь шрифт?
Достаточно создать один раз и потом только
Font->DrawText(TextString, -1,&myRect, DT_CENTER, TextColor);
Записан
Антон__
Помогающий

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 » 

Всё понял
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 Кб - загружено 1276 раз.)
Записан
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 Кб - загружено 1306 раз.)
« Последнее редактирование: 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,
Код в студию.Улыбаюсь
Какую мировую матрицу ставишь?
Записан
zuze
Опытный

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


« Ответ #60 : 19-03-2009 11:32 » 

Может надо отдельно делать функции для создания текста, вывода текста и освобождение памяти?

А вот и кодх

* text2.cpp (15.05 Кб - загружено 983 раз.)
Записан
Антон__
Помогающий

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

« Ответ #61 : 19-03-2009 17:07 » 

Матрицы надо устанавливать. Хотя бы мировую.
Код:
D3DXMATRIXA16 world, tr, rotX, rotY;
D3DXMatrixRotationX(&rotX, 0);
D3DXMatrixRotationY(&rotY, 0);
D3DXMatrixTranslation(&tr, -1.0,0.0,0.0);
world = tr * rotX * rotY;
pDirect3DDevice->SetTransform(D3DTS_WORLD, &world);
Цитата
Может надо отдельно делать функции для создания текста, вывода текста и освобождение памяти?
Для создания - стоит. А про удаление пока забудь:). Оно тебе не скоро понадобится.
При выходе из программы всё прекрасно освобождается и удаляется.
Записан
zuze
Опытный

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


« Ответ #62 : 19-03-2009 23:36 » 

Я так понял текст выезжает за экран из-за того что я не задал структуру которая задаёт прямоугольник в который выводится текст.

Я ещё раз переписал функцию для создания шрифта и вывода текста на экран

Код: (C++)
void MyTextOut(char *TextString, long x1, long y1, long x2, long y2, D3DCOLOR TextColor)
{  
     // Переменная, которая будет задавать область вывода на экран
     RECT myRect;
     // Получение дескриптора контекста устройства
     HDC hdc = CreateCompatibleDC(0);
   
       
     HFONT hFont;    // Дескриптор нового шрифта
     HFONT hFontOld; // Дескриптор старого шрифта
     LPD3DXFONT pFont = NULL;

     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);

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

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

Эту функцию вызываю в функции рендеринга так

Код: (C++)
MyTextOut(TEXT("Hello"), 10, 10, 800, 800, D3DCOLOR_ARGB(150,0,150,14));

Компилируется без ошибок, но при запуске программы выскакивает окно Ошибка приложения с двумя кнопками ОК и Отмена и с текстом Инструкция по адресу "0x0040140a" обратилась к памяти по адресу "0x00000000". Память не может быть "read".
"ОК" -- завершение приложения
"Отмена" -- отладка приложения


Что же я не так сделал?

Помогите пожалуйста разобраться.
Записан
Антон__
Помогающий

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

« Ответ #63 : 20-03-2009 07:48 » 

Что такое "TEXT("Hello")"?
Записан
zuze
Опытный

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


« Ответ #64 : 20-03-2009 07:52 » 

"TEXT("Hello")" - это приобоазование типа, но это не нужно можно так "Hello".
Записан
zuze
Опытный

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


« Ответ #65 : 20-03-2009 07:59 » 

Мне кажется ошибка из-за того что я в функции D3DXCreateText строку в mesh-е закидываю, а не pFont, следовательно pFont равен NULL и из за этого нельзя использовать строку
Код:
pFont->DrawText(NULL, TextString, -1, &myRect, DT_CENTER, TextColor);
а можно через mesh
Код:
Text->DrawSubset(0);
но к сожалению так я сделать не могу так как мне надо выводить текст определённого цвета и в координатак описанных экземпляром структуры RECT.

Что посоветуете для такого вывода?
« Последнее редактирование: 20-03-2009 08:02 от zuze » Записан
zuze
Опытный

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


« Ответ #66 : 20-03-2009 08:04 » 

Задать цвет это легко
Код:
SetTextColor(hdc, RGB(255,0,255));

А вот функцию для задания вывода текста в координатах заданными экземпляром структуры RECT я не знаю, если бы я знал тогда можно воспользоватся функцией вывода
Код:
Text->DrawSubset(0);

Записан
zuze
Опытный

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


« Ответ #67 : 21-03-2009 15:43 » 

Я попытался сделать вывод 3D-текста с помощью Mesh.
Смотрел в пример Text3D из DirectX 9.0c нояборь 2008, но этот пример немного усложнён, но всётаки часть кода я из этого примера смог понять и взять в свой код.

Вот то, что я сделал, но почему-то 3D-текст не выводится

Код:
// Глобальная переменная
LPD3DXMESH Text3DMesh = NULL;
void RenderingDirect3D(void)
{
     ...
     ...
     ...
     // Создание шрифта
     CreateD3DXTextMesh("Hello", Text3DMesh);
     // Вывод текста
     if (Text3DMesh != NULL)
    Text3DMesh->DrawSubset(0);
     ...
     ...
     ...
}
HRESULT CreateD3DXTextMesh(char *TextString, LPD3DXMESH pMesh)

     HRESULT Net3DText;
     HFONT hFont;   // Дескриптор нового шрифта
     HFONT hFontOld;    // Дескриптор старого шрифта
     HDC hdc;
     LPD3DXMESH Text3DMeshNew = NULL; // Указател на Меш

     // Получение дескриптора контекста устройства
     hdc = CreateCompatibleDC(0);
   
     // Создание шрифта     
     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);
     
     // Создание трехмерной сетки, представляющую строку текста
     Net3DText = D3DXCreateText(pDirect3DDevice, hdc, TextString, 0.001f, 0.4f, &Text3DMeshNew, NULL, NULL);

     // Восстанавление бывшего до этого шрифта
     SelectObject(hdc, hFontOld);
     // Освобождение памяти указателя на шрифт
     DeleteObject(hFont);
     // Освобождение памяти дискриптора контекста устройства
     DeleteDC(hdc);
 
     if (SUCCEEDED(Net3DText))
        pMesh = Text3DMeshNew;
     
     return Net3DText;
}

Помогите пожалуйста понять, где я ошибся?
Записан
zuze
Опытный

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


« Ответ #68 : 11-06-2009 03:36 » 

В коде из ответа #67 в результате работы программы выводится пустое окно.

Для лучшего понимания привиду полный код, а не урезанный как в ответе #67

Код:
// в этом файле лежат все функции WinAPI
#include <windows.h>
// подключаем заголовочный файл DirectX 9 SDK
#include <d3d9.h>
#include <d3dx9.h>

#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")

LPDIRECT3D9 pDirect3D = NULL;
LPDIRECT3DDEVICE9 pDirect3DDevice = NULL;
LPDIRECT3DVERTEXBUFFER9 pBufferVertices = NULL;
LPDIRECT3DINDEXBUFFER9 pBufferIndexes = NULL;
LPDIRECT3DVERTEXBUFFER9 pBufferVertices1 = NULL;
LPDIRECT3DINDEXBUFFER9 pBufferIndexes1 = NULL;
LPD3DXFONT pFont = NULL; // указатель на интефейс, отвечающий за работу со шрифтом
LPD3DXMESH Text3DMesh = NULL;

#define D3DFVF_TRIANGLEVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL)

HINSTANCE hInstance;

// Функция обработки сообщений - прототип
LRESULT CALLBACK MainWinProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
// Функция инициализации Direct3D - прототип
HRESULT InitDirect3D(HWND hwnd);
// Функция рендеринга Direct3D - прототип
void RenderingDirect3D(void);
// Функция освобождения захваченных ресурсов - прототип
void DeleteDirect3D(void);
// Функция создания шрифта с помощью Mesh - прототип
HRESULT CreateD3DXTextMesh(char *TextString, LPD3DXMESH pMesh);

// Функция которая является входной точкой приложения
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow)
{
    WNDCLASSEX windowsclass;
    HWND hwnd;
    MSG msg;
    hInstance = hInst;

    windowsclass.cbSize = sizeof(WNDCLASSEX);
    windowsclass.style = CS_DBLCLKS|CS_OWNDC|CS_HREDRAW|CS_VREDRAW;
    windowsclass.lpfnWndProc = MainWinProc;
    windowsclass.cbClsExtra = 0;
    windowsclass.cbWndExtra = 0;
    windowsclass.hInstance = hInst;
    windowsclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    windowsclass.hCursor = LoadCursor(NULL, IDC_ARROW);
    windowsclass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
    windowsclass.lpszMenuName = NULL;
    windowsclass.lpszClassName = "WINDOWSCLASS";
    windowsclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

    if (!RegisterClassEx(&windowsclass))
        return 0;

    hwnd = CreateWindowEx(NULL, "WINDOWSCLASS", "Вывод 3D текста", WS_OVERLAPPEDWINDOW|WS_VISIBLE,
        0, 0, 770, 500, NULL, NULL, hInst, NULL);
    if (!hwnd)
        return 0;

    if (SUCCEEDED(InitDirect3D(hwnd)))
    {
       ShowWindow(hwnd, SW_SHOWDEFAULT);
       UpdateWindow(hwnd);

       ZeroMemory(&msg, sizeof(msg));
       while (msg.message != WM_QUIT)
       {
             if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
             {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
             }
             else
                RenderingDirect3D();
       }
    }
    return (int)msg.wParam;
}
// Функция обработки сообщений
LRESULT CALLBACK MainWinProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
    switch (msg)
    {
        // События Создания объектов
        case WM_CREATE:
        break;

        //Обработка сообщений от элементов управления
        case WM_COMMAND:
        break;

        //WM_PAINT - для рисования
        case WM_PAINT:
        break;

        // WM_DESTROY - для закрытия окна
        case WM_DESTROY:
                DeleteDirect3D();
                PostQuitMessage(0);
        break;
    }
    return (DefWindowProc(hwnd, msg, wparam, lparam));
}
// Функция инициализации Direct3D
HRESULT InitDirect3D(HWND hwnd)
{
    if (NULL == (pDirect3D = Direct3DCreate9(D3D_SDK_VERSION)))
        return E_FAIL;

    D3DDISPLAYMODE Display;
    if (FAILED(pDirect3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &Display)))
        return E_FAIL;

    D3DPRESENT_PARAMETERS Direct3DParameter;
    ZeroMemory(&Direct3DParameter, sizeof(Direct3DParameter));
    Direct3DParameter.Windowed = true;
    Direct3DParameter.SwapEffect = D3DSWAPEFFECT_DISCARD;
    Direct3DParameter.BackBufferFormat = Display.Format;
    // Включаем z-буфер
    Direct3DParameter.EnableAutoDepthStencil = TRUE;
    // Формат поверхности z-буфера
    Direct3DParameter.AutoDepthStencilFormat = D3DFMT_D16;

    if (FAILED(pDirect3D -> CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING,
        &Direct3DParameter, &pDirect3DDevice)))
        return E_FAIL;
    pDirect3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
    pDirect3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
    // Включаем z-буфер
    pDirect3DDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
    return S_OK;
}
// Функция рендеринга Direct3D
void RenderingDirect3D(void)
{
    if (pDirect3DDevice == NULL)
        return;

    pDirect3DDevice->Clear(0, NULL, D3DCLEAR_TARGET |  D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(172, 221, 101), 1.0f, 0);

    pDirect3DDevice->BeginScene();

    // Создание шрифта
    CreateD3DXTextMesh("Hello", Text3DMesh);
    // Вывод текста
    if (Text3DMesh != NULL)
       Text3DMesh->DrawSubset(0);

    pDirect3DDevice->EndScene();

    pDirect3DDevice->Present(NULL, NULL, NULL, NULL);
}
// Функция освобождения захваченных ресурсов
void DeleteDirect3D(void)
{
    if (pFont != NULL)
        pFont->Release();
    if (pBufferVertices != NULL)
        pBufferVertices->Release();
    if (pBufferIndexes != NULL)
        pBufferIndexes->Release();
    if (pDirect3DDevice != NULL)
        pDirect3DDevice->Release();
    if (pDirect3D != NULL)
        pDirect3D->Release();
    if (Text3DMesh != NULL)
      Text3DMesh->Release();
}
// Функция создания шрифта с помощью Mesh
HRESULT CreateD3DXTextMesh(char *TextString, LPD3DXMESH pMesh)

     HRESULT Net3DText;
     HFONT hFont;   // Дескриптор нового шрифта
     HFONT hFontOld;    // Дескриптор старого шрифта
     HDC hdc;
     LPD3DXMESH Text3DMeshNew = NULL; // Указател на Меш
     //D3DXMATERIAL *D3DXMeshMaterial = NULL;

     // Получение дескриптора контекста устройства
     hdc = CreateCompatibleDC(0);
   
     // Создание шрифта     
     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);
     
     // Создание трехмерной сетки, представляющую строку текста
     Net3DText = D3DXCreateText(pDirect3DDevice, hdc, TextString, 0.001f, 0.4f, &Text3DMeshNew, NULL, NULL);

     // Восстанавление бывшего до этого шрифта
     SelectObject(hdc, hFontOld);
     // Освобождение памяти указателя на шрифт
     DeleteObject(hFont);
     // Освобождение памяти дискриптора контекста устройства
     DeleteDC(hdc);
 
     if (SUCCEEDED(Net3DText))
        pMesh = Text3DMeshNew;
     
     return Net3DText;
}

Я так понял код не выводит текст так как я не задал материал для mesh.

Я попытался задать материал для Mesh вот код

Код:
// в этом файле лежат все функции WinAPI
#include <windows.h>
// подключаем заголовочный файл DirectX 9 SDK
#include <d3d9.h>
#include <d3dx9.h>
#include <d3dx9mesh.h>

#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")

LPDIRECT3D9 pDirect3D = NULL;
LPDIRECT3DDEVICE9 pDirect3DDevice = NULL;
LPDIRECT3DVERTEXBUFFER9 pBufferVertices = NULL;
LPDIRECT3DINDEXBUFFER9 pBufferIndexes = NULL;
LPDIRECT3DVERTEXBUFFER9 pBufferVertices1 = NULL;
LPDIRECT3DINDEXBUFFER9 pBufferIndexes1 = NULL;
LPD3DXFONT pFont = NULL; // указатель на интефейс, отвечающий за работу со шрифтом
LPD3DXMESH Text3DMesh = NULL;
LPD3DXBUFFER pMeshMaterialBuffer = NULL; // буфер для материала
D3DMATERIAL9 *pMeshMaterial = NULL;

#define D3DFVF_TRIANGLEVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL)

HINSTANCE hInstance;

// Функция обработки сообщений - прототип
LRESULT CALLBACK MainWinProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
// Функция инициализации Direct3D - прототип
HRESULT InitDirect3D(HWND hwnd);
// Функция рендеринга Direct3D - прототип
void RenderingDirect3D(void);
// Функция освобождения захваченных ресурсов - прототип
void DeleteDirect3D(void);
// Функция создания шрифта с помощью Mesh - прототип
HRESULT CreateD3DXTextMesh(char *TextString, LPD3DXMESH pMesh);

// Функция которая является входной точкой приложения
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow)
{
    WNDCLASSEX windowsclass;
    HWND hwnd;
    MSG msg;
    hInstance = hInst;

    windowsclass.cbSize = sizeof(WNDCLASSEX);
    windowsclass.style = CS_DBLCLKS|CS_OWNDC|CS_HREDRAW|CS_VREDRAW;
    windowsclass.lpfnWndProc = MainWinProc;
    windowsclass.cbClsExtra = 0;
    windowsclass.cbWndExtra = 0;
    windowsclass.hInstance = hInst;
    windowsclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    windowsclass.hCursor = LoadCursor(NULL, IDC_ARROW);
    windowsclass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
    windowsclass.lpszMenuName = NULL;
    windowsclass.lpszClassName = "WINDOWSCLASS";
    windowsclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

    if (!RegisterClassEx(&windowsclass))
        return 0;

    hwnd = CreateWindowEx(NULL, "WINDOWSCLASS", "Вывод 3D текста", WS_OVERLAPPEDWINDOW|WS_VISIBLE,
        0, 0, 770, 500, NULL, NULL, hInst, NULL);
    if (!hwnd)
        return 0;

    if (SUCCEEDED(InitDirect3D(hwnd)))
    {
       ShowWindow(hwnd, SW_SHOWDEFAULT);
       UpdateWindow(hwnd);

       ZeroMemory(&msg, sizeof(msg));
       while (msg.message != WM_QUIT)
       {
             if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
             {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
             }
             else
                RenderingDirect3D();
       }
    }
    return (int)msg.wParam;
}
// Функция обработки сообщений
LRESULT CALLBACK MainWinProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
    switch (msg)
    {
        // События Создания объектов
        case WM_CREATE:
        break;

        //Обработка сообщений от элементов управления
        case WM_COMMAND:
        break;

        //WM_PAINT - для рисования
        case WM_PAINT:
        break;

        // WM_DESTROY - для закрытия окна
       case WM_DESTROY:
               DeleteDirect3D();
               PostQuitMessage(0);
        break;
    }
    return (DefWindowProc(hwnd, msg, wparam, lparam));
}
// Функция инициализации Direct3D
HRESULT InitDirect3D(HWND hwnd)
{
    if (NULL == (pDirect3D = Direct3DCreate9(D3D_SDK_VERSION)))
        return E_FAIL;

    D3DDISPLAYMODE Display;
    if (FAILED(pDirect3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &Display)))
        return E_FAIL;

    D3DPRESENT_PARAMETERS Direct3DParameter;
    ZeroMemory(&Direct3DParameter, sizeof(Direct3DParameter));
    Direct3DParameter.Windowed = true;
    Direct3DParameter.SwapEffect = D3DSWAPEFFECT_DISCARD;
    Direct3DParameter.BackBufferFormat = Display.Format;
    // Включаем z-буфер
    Direct3DParameter.EnableAutoDepthStencil = TRUE;
    // Формат поверхности z-буфера
Direct3DParameter.AutoDepthStencilFormat = D3DFMT_D16;

    if (FAILED(pDirect3D -> CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING,
        &Direct3DParameter, &pDirect3DDevice)))
        return E_FAIL;
    pDirect3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
    pDirect3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
    // Включаем z-буфер
    pDirect3DDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
    return S_OK;
}
// Функция рендеринга Direct3D
void RenderingDirect3D(void)
{
    if (pDirect3DDevice == NULL)
        return;

    pDirect3DDevice->Clear(0, NULL, D3DCLEAR_TARGET |  D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(172, 221, 101), 1.0f, 0);

    pDirect3DDevice->BeginScene();

    // Создание шрифта
    CreateD3DXTextMesh("Hello", Text3DMesh);
    // Вывод текста
    if (Text3DMesh != NULL)
    {
       pDirect3DDevice->SetMaterial(&pMeshMaterial[0]);
       Text3DMesh->DrawSubset(0);
    }

    pDirect3DDevice->EndScene();

    pDirect3DDevice->Present(NULL, NULL, NULL, NULL);
}
// Функция освобождения захваченных ресурсов
void DeleteDirect3D(void)
{
    if (pFont != NULL)
      pFont->Release();
    if (pBufferVertices != NULL)
        pBufferVertices->Release();
    if (pBufferIndexes != NULL)
        pBufferIndexes->Release();
    if (pDirect3DDevice != NULL)
        pDirect3DDevice->Release();
    if (pDirect3D != NULL)
        pDirect3D->Release();
    if (Text3DMesh != NULL)
        Text3DMesh->Release();
    if (pMeshMaterialBuffer != NULL)
        pMeshMaterialBuffer->Release();
    if (pMeshMaterial != NULL)
        pMeshMaterial = NULL;
}
// Функция создания шрифта с помощью Mesh
HRESULT CreateD3DXTextMesh(char *TextString, LPD3DXMESH pMesh)

     HRESULT Net3DText;
     HFONT hFont;   // Дескриптор нового шрифта
     HFONT hFontOld;    // Дескриптор старого шрифта
     HDC hdc;
     LPD3DXMESH Text3DMeshNew = NULL; // Указател на Меш
     D3DXMATERIAL *D3DXMeshMaterial = NULL;

     // Получение дескриптора контекста устройства
     hdc = CreateCompatibleDC(0);
   
     // Создание шрифта     
     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);
     
     // Создание трехмерной сетки, представляющую строку текста
     Net3DText = D3DXCreateText(pDirect3DDevice, hdc, TextString, 0.001f, 0.4f, &Text3DMeshNew, NULL, NULL);

     D3DXMeshMaterial = reinterpret_cast<D3DXMATERIAL *>(pMeshMaterialBuffer->GetBufferPointer());
     pMeshMaterial = new D3DMATERIAL9[1];

     // Копируем материал
     pMeshMaterial[0] = D3DXMeshMaterial[0].MatD3D;

     // Фоновую составляющую делаем такой же, как и диффузную
     pMeshMaterial[0].Ambient = pMeshMaterial[0].Diffuse;

     // Восстанавление бывшего до этого шрифта
     SelectObject(hdc, hFontOld);
     // Освобождение памяти указателя на шрифт
     DeleteObject(hFont);
     // Освобождение памяти дискриптора контекста устройства
     DeleteDC(hdc);
 
     if (SUCCEEDED(Net3DText))
        pMesh = Text3DMeshNew;
     
     return Net3DText;
}

Но почему-то этот код компилируется без ошибок, а при запуске происходит ошибка такая



Почему эта ошибка происходит?

Помогите пожалуйста разобраться.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #69 : 11-06-2009 03:42 » 

zuze, ну так же ведь русским по серому написано - пытаешься по адресу 0 прочитать данные. Наверное, где то пустой указатель используешь ? В отладчике поймай место ошибки - это делается легко, без точек останова запусти в режиме отладки, а в момент ошибки выбери из диалога "повторить"
Записан

zuze
Опытный

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


« Ответ #70 : 11-06-2009 04:11 » 

Я сделал, как Вы сказали. Нажал "Отмена" и перешёл в режим отладки и запустил заново.

Кроме вот этого



Нет ничего, не понятно, на какую строчку информация указывает.
Записан
zuze
Опытный

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


« Ответ #71 : 12-06-2009 11:43 » 

Переправил на этот код

Код:
// в этом файле лежат все функции WinAPI
#include <windows.h>
// подключаем заголовочный файл DirectX 9 SDK
#include <d3d9.h>
#include <d3dx9.h>

#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")

LPDIRECT3D9 pDirect3D = NULL;
LPDIRECT3DDEVICE9 pDirect3DDevice = NULL;
LPD3DXMESH pText3DMesh = NULL;

#define D3DFVF_TRIANGLEVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL)

HINSTANCE hInstance;

// Функция обработки сообщений - прототип
LRESULT CALLBACK MainWinProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
// Функция инициализации Direct3D - прототип
HRESULT InitDirect3D(HWND hwnd);
// Функция рендеринга Direct3D - прототип
void RenderingDirect3D(void);
// Функция освобождения захваченных ресурсов - прототип
void DeleteDirect3D(void);
// Функция создания шрифта с помощью Mesh - прототип
void CreateD3DXTextMesh(char *TextString, LPD3DXMESH pMesh);

// Функция которая является входной точкой приложения
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow)
{
    WNDCLASSEX windowsclass;
    HWND hwnd;
    MSG msg;
    hInstance = hInst;

    windowsclass.cbSize = sizeof(WNDCLASSEX);
    windowsclass.style = CS_DBLCLKS|CS_OWNDC|CS_HREDRAW|CS_VREDRAW;
    windowsclass.lpfnWndProc = MainWinProc;
    windowsclass.cbClsExtra = 0;
    windowsclass.cbWndExtra = 0;
    windowsclass.hInstance = hInst;
    windowsclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    windowsclass.hCursor = LoadCursor(NULL, IDC_ARROW);
    windowsclass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
    windowsclass.lpszMenuName = NULL;
    windowsclass.lpszClassName = "WINDOWSCLASS";
    windowsclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

    if (!RegisterClassEx(&windowsclass))
        return 0;

    hwnd = CreateWindowEx(NULL, "WINDOWSCLASS", "Вывод 3D текста", WS_OVERLAPPEDWINDOW|WS_VISIBLE,
        0, 0, 770, 500, NULL, NULL, hInst, NULL);
    if (!hwnd)
        return 0;

    if (SUCCEEDED(InitDirect3D(hwnd)))
    {
       ShowWindow(hwnd, SW_SHOWDEFAULT);
       UpdateWindow(hwnd);

       ZeroMemory(&msg, sizeof(msg));
       while (msg.message != WM_QUIT)
       {
             if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
             {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
             }
             else
                RenderingDirect3D();
       }
    }
    return (int)msg.wParam;
}
// Функция обработки сообщений
LRESULT CALLBACK MainWinProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
    switch (msg)
    {
        // События Создания объектов
        case WM_CREATE:
        break;

        //Обработка сообщений от элементов управления
        case WM_COMMAND:
        break;

        //WM_PAINT - для рисования
        case WM_PAINT:
        break;

        // WM_DESTROY - для закрытия окна
        case WM_DESTROY:
                DeleteDirect3D();
                PostQuitMessage(0);
        break;
    }
    return (DefWindowProc(hwnd, msg, wparam, lparam));
}
// Функция инициализации Direct3D
HRESULT InitDirect3D(HWND hwnd)
{
    if (NULL == (pDirect3D = Direct3DCreate9(D3D_SDK_VERSION)))
        return E_FAIL;

    D3DDISPLAYMODE Display;
    if (FAILED(pDirect3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &Display)))
        return E_FAIL;

    D3DPRESENT_PARAMETERS Direct3DParameter;
    ZeroMemory(&Direct3DParameter, sizeof(Direct3DParameter));
    Direct3DParameter.Windowed = true;
    Direct3DParameter.SwapEffect = D3DSWAPEFFECT_DISCARD;
    Direct3DParameter.BackBufferFormat = Display.Format;
    // Включаем z-буфер
    Direct3DParameter.EnableAutoDepthStencil = TRUE;
    // Формат поверхности z-буфера
Direct3DParameter.AutoDepthStencilFormat = D3DFMT_D16;

    if (FAILED(pDirect3D -> CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING,
        &Direct3DParameter, &pDirect3DDevice)))
        return E_FAIL;
    pDirect3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
    pDirect3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
    // Включаем z-буфер
    pDirect3DDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
    return S_OK;
}
// Функция рендеринга Direct3D
void RenderingDirect3D(void)
{
    if (pDirect3DDevice == NULL)
        return;

    pDirect3DDevice->Clear(0, NULL, D3DCLEAR_TARGET |  D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(172, 221, 101), 1.0f, 0);

    pDirect3DDevice->BeginScene();

    // Создание шрифта
    CreateD3DXTextMesh("Hello", pText3DMesh);
    // Вывод текста
    if (pText3DMesh)
       pText3DMesh->DrawSubset(0);

    pDirect3DDevice->EndScene();

    pDirect3DDevice->Present(NULL, NULL, NULL, NULL);
}
// Функция освобождения захваченных ресурсов
void DeleteDirect3D(void)
{
    if (pDirect3DDevice != NULL)
        pDirect3DDevice->Release();
    if (pDirect3D != NULL)
        pDirect3D->Release();
    if (pText3DMesh != NULL)
        pText3DMesh->Release();
}
// Функция создания шрифта с помощью Mesh
void CreateD3DXTextMesh(char *TextString, LPD3DXMESH pMesh)
{  
     HFONT hFont;   // Дескриптор нового шрифта
     HFONT hFontOld;    // Дескриптор старого шрифта
     HDC hdc;
  
     // Создание шрифта    
     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"));

     // Получение дескриптора контекста устройства
     hdc = CreateCompatibleDC(NULL);

     // Делаем данный шрифт текущим шрифтом
     hFontOld = (HFONT)SelectObject(hdc, hFont);
    
     // Создание трехмерной сетки, представляющую строку текста
     D3DXCreateText(pDirect3DDevice, hdc, TextString, 0.01f, 0.4f, &pText3DMesh, NULL, NULL);

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

Я пытаюсь вывести слово "Hello", но почему-то полностью видно букву 'H' и частично буква 'e' все остальные буквы выходят за правую грань окна программы включая кусочек от буквы 'e'.

Почему так происходит?

Ведь в примерах, не используются ни какие матрицы для сдвига текста, а текст у них весь влезает.

Помогите пожалуйста разобраться.
« Последнее редактирование: 13-06-2009 05:15 от zuze » Записан
zuze
Опытный

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


« Ответ #72 : 15-06-2009 07:55 » 

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

Вот код функции в дополнении к прошлому коду

Код:
// Установка матриц преобоазования
void Matrix(void)
{
    // Матрица вида
    D3DXMATRIX MatrixView;
    //матрица проекции
    D3DXMATRIX MatrixProjection;
    D3DXMATRIX MatrixTranslation;

    D3DXMatrixTranslation(&MatrixTranslation, 0.0f, 0.0f, 0.0f);                       // положение текста
    pDirect3DDevice->SetTransform(D3DTS_WORLD, &MatrixTranslation);

    // Изменяем видовую матрицу
    D3DXMatrixLookAtLH(&MatrixView,      // полученная в итоге видовая матрица
        &D3DXVECTOR3(0.0f, 0.0f, 10.0f), // точка, из которой смотрим
        &D3DXVECTOR3(0.0f, 0.0f, 0.0f),  // куда смотрим
        &D3DXVECTOR3(0.0f, 1.0f, 0.0f)); // направление верха
    // Устанавливаем видовую матрицу
    pDirect3DDevice->SetTransform(D3DTS_VIEW, &MatrixView);
    // Изменяем матрицу проекции
    D3DXMatrixPerspectiveFovLH(&MatrixProjection, // полученная итоговая матрица проекции
        D3DX_PI/4,                                // поле зрения в направлении оси Y в радианах
        1.54f,                                    // соотношения сторон экрана 770/500=1.54
        10.0f,                                    // передний план отсечения сцены
        200.0f);                                  // задний план отсечения сцены
    // Устанавливаем матрицу проекции
    pDirect3DDevice->SetTransform(D3DTS_PROJECTION, &MatrixProjection);
}

Только текст у меня почему-то выводится зеркально.

Почему текст выводится так и как это поправить?
Записан
zuze
Опытный

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


« Ответ #73 : 15-06-2009 09:16 » 

Исправил, теперь текст нормально выводится.

В функции

Код:
void Matrix(void)

в место строки

Код:
D3DXVECTOR3(0.0f, 0.0f, 10.0f)

надо написать

Код:
D3DXVECTOR3(0.0f, 0.0f, -10.0f)
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #74 : 15-06-2009 10:09 » 

zuze, молодец, что не сдаёшься, несмотря на отсутствие помощников Улыбаюсь
Записан

zuze
Опытный

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


« Ответ #75 : 15-06-2009 14:05 » 

Спасибо за поддержку Алексей1153++.

В коде надо ещё изменить

У меня было так

Код:
// Создание шрифта
CreateD3DXTextMesh("Hello", pText3DMesh);


А я исправил на это

Код:
if (pText3DMesh == NULL)
   // Создание шрифта
   CreateD3DXTextMesh("Hello", pText3DMesh);

Если не исправлять, то создаваться текст будет каждый раз в цикле отрисовки, а так он создаётся один раз.
« Последнее редактирование: 15-06-2009 14:08 от zuze » Записан
zuze
Опытный

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


« Ответ #76 : 15-06-2009 14:20 » 

Я же вывод текста задумывал делать с помощью Mesh, чтобы вращать его.

И по этому привожу пример, что нужно сделать, чтобы текст вращался, а для этого достаточно чуть-чуть изменить функцию void Matrix(void)

Код:
// Глобальная переменная
DWORD OneTick = 0;

// Установка матриц преобоазования
void Matrix(void)
{
    // Матрица вида
    D3DXMATRIX MatrixView;
    //матрица проекции
    D3DXMATRIX MatrixProjection;
    D3DXMATRIX MatrixWorld;
    D3DXMATRIX MatrixTranslation;
    D3DXMATRIX MatrixRotation;

    float BeginAngle;
    float rps;
    UINT iTime;
    float fAngle;

    BeginAngle = D3DX_PI/4.0f;
    rps = 0.5f;
    iTime = GetTickCount();

    if(!OneTick)
        OneTick = iTime;
    fAngle = BeginAngle + (iTime -  OneTick) * (D3DX_PI * 2.0f * rps / 1000.0f);
   
    D3DXMatrixRotationX(&MatrixRotation, fAngle);                                      // поворот текста
    D3DXMatrixTranslation(&MatrixTranslation, 0.0f, 0.0f, 0.0f);                       // положение текста
    D3DXMatrixMultiply(&MatrixWorld, &MatrixRotation, &MatrixTranslation);
    pDirect3DDevice->SetTransform(D3DTS_WORLD, &MatrixWorld);

    // Изменяем видовую матрицу
    D3DXMatrixLookAtLH(&MatrixView,      // полученная в итоге видовая матрица
        &D3DXVECTOR3(0.0f, 0.0f, -10.0f), // точка, из которой смотрим
        &D3DXVECTOR3(0.0f, 0.0f, 0.0f),  // куда смотрим
        &D3DXVECTOR3(0.0f, 1.0f, 0.0f)); // направление верха
    // Устанавливаем видовую матрицу
    pDirect3DDevice->SetTransform(D3DTS_VIEW, &MatrixView);
    // Изменяем матрицу проекции
    D3DXMatrixPerspectiveFovLH(&MatrixProjection, // полученная итоговая матрица проекции
        D3DX_PI/4,                                // поле зрения в направлении оси Y в радианах
        1.54f,                                    // соотношения сторон экрана 770/500=1.54
        10.0f,                                    // передний план отсечения сцены
        200.0f);                                  // задний план отсечения сцены
    // Устанавливаем матрицу проекции
    pDirect3DDevice->SetTransform(D3DTS_PROJECTION, &MatrixProjection);
}
Записан
zuze
Опытный

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


« Ответ #77 : 15-06-2009 15:45 » 

Ну и с последним вопросом разобрался как менять цвет у текста, также как и в коде с кубами, но что бы люди не лазили и не искали привиду сдесь код этой функции

Код:
// Функция установки освещения и материалов
void LightMaterial(void)
{
// Создаём материал
D3DMATERIAL9 Material;
// Создаём освещение
D3DLIGHT9 Light;
D3DXVECTOR3 VectorDir;

// Обнуляем память под материал
ZeroMemory(&Material, sizeof(D3DMATERIAL9));
            // Задаём цвета для диффузного и цвета подсветки
Material.Diffuse.r = Material.Ambient.r = 0.5f;
Material.Diffuse.g = Material.Ambient.g = 1.0f;
Material.Diffuse.b = Material.Ambient.b = 0.0f;
Material.Diffuse.a = Material.Ambient.a = 1.0f;
// Устанавливаем материал
pDirect3DDevice->SetMaterial(&Material);
// Обнуляем память под освещение
ZeroMemory(&Light, sizeof(D3DLIGHT9));
            // Тип света
Light.Type = D3DLIGHT_DIRECTIONAL;
// Количество красного в свете
Light.Diffuse.r = 1.0f;
Light.Diffuse.g = 1.0f;
Light.Diffuse.b = 1.0f;
// Максимальное расстояние действия источника света
Light.Range = 1000.0f;
// Вектор, задающий направление света
VectorDir = D3DXVECTOR3(1.0f, 0.0f, 0.0f);

// Нормализуем вектор VectorDir и записываем в свойства
            // направления Light
D3DXVec3Normalize((D3DXVECTOR3*)&Light.Direction, &VectorDir);
// Устанавливаем свет
pDirect3DDevice->SetLight(0, &Light);
// Включаем свет с соответсвующим индексом
pDirect3DDevice->LightEnable(0, TRUE);
// Устанавливаем параметры рендеринга, включая освещение
pDirect3DDevice->SetRenderState(D3DRS_LIGHTING, TRUE);
// Устанавливаем параметры рендеринга, включая окружающее
            // освещение
pDirect3DDevice->SetRenderState(D3DRS_AMBIENT, 0);
}

А вставляется эта функция для выполнения в код перед функцией Matrix();.

Всё я закончил с этим и перехажу текстурам и мультитекстурированию, а затем буду возращатся к загрузки формата X с помощью mesh, так как в них указываются текстуры.
Записан
zuze
Опытный

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


« Ответ #78 : 16-06-2009 06:41 » 

Так как всё равно каждый раз приходится сверять, то можно сделать ещё лучше.

Написать функцию такую.

Код:
// Функция инициализации объекта (в данном случае только создаёт текст)
HRESULT InitObject(void)
{
              CreateD3DXTextMesh("Hello", pText3DMesh);
              return S_OK;
}

А из функции void RenderingDirect3D(void) удалить строчки

Код:

if (pText3DMesh == NULL)
   CreateD3DXTextMesh("Hello", pText3DMesh);

И на последок модифицировать вот этот кусок кода из функции int WINAPI WinMain(HINSTANCE hInst,   HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow)

Код:
...
...
...
if (SUCCEEDED(InitDirect3D(hwnd)))
{
   ShowWindow(hwnd, SW_SHOWDEFAULT);
   UpdateWindow(hwnd);

   ZeroMemory(&msg, sizeof(msg));
   while (msg.message != WM_QUIT)
   {
           if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
           {
             TranslateMessage(&msg);
             DispatchMessage(&msg);
           }
           else
             RenderingDirect3D();
   }
}
...
...
...

На этот

Код:
...
...
...
if (SUCCEEDED(InitDirect3D(hwnd)))
{
       if (SUCCEEDED(InitObject()))
       {
           ShowWindow(hwnd, SW_SHOWDEFAULT);
           UpdateWindow(hwnd);

           ZeroMemory(&msg, sizeof(msg));
           while (msg.message != WM_QUIT)
           {
                 if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
     {
                    TranslateMessage(&msg);
                    DispatchMessage(&msg);
     }
                 else
                    RenderingDirect3D();
          }
      }
}
...
...
...
Записан
Страниц: 1 2 3 [Все]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines