zuze
Опытный
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 раз.)
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #1 : 24-02-2009 15:40 » |
|
HFONT - это обычный апишный фонт, может просто достать контекста HDC да рисовать текст как обычно ? Должна быть где то функция для достатия контекста
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #2 : 24-02-2009 16:15 » |
|
Леш, что там? Расскажи для ленивых, кому не хочется качать проект.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
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
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #4 : 24-02-2009 21:32 » |
|
Да строка D3DXCreateFont(pDirect3DDevice, hFont, &pFont); не подходит, так как такая строка используется в DirectX 9.0b, а у меня DirectX 9.0c
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #5 : 24-02-2009 22:07 » |
|
Странно у меня DirectX 9.0c, а функция D3DXCreateFont содержин не 12, а 3 параметра.
Это я узнал из того что компилятор начал выдавать ошибки с надписью HFONT.
Надеюсь я заполню структуру HFONT правельно и текст наконец-то начнёт выводится на экран.
Прикрепляю файл с ошибками их стало намного меньше.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #6 : 25-02-2009 04:26 » |
|
HFONT - это не структура, а хендл
лучше покажи строчку, на которую ругается, а также текст ругани
|
|
|
Записан
|
|
|
|
zuze
Опытный
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 раз.)
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #8 : 25-02-2009 08:21 » |
|
Type mismatch in parameter 'hFont' (wanted 'HFONT__ *', got 'int')
почему то ругань на указатель , почему - не понимаю ((. может привести насильно - (HFONT*)&pFont
|
|
|
Записан
|
|
|
|
zuze
Опытный
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
Опытный
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
Опытный
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
Опытный
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 »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #13 : 26-02-2009 16:55 » |
|
zuze, что значит - плохие файлы DirectX 9 ? Качай с мелкософтовского сайта SDK - и вперёд
|
|
|
Записан
|
|
|
|
zuze
Опытный
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
Опытный
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 »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #16 : 27-02-2009 05:08 » |
|
Как правельно компилировать и создавать исполняемый файл на Visual C++ 6 в командной строке?
зачем тебе командная строка ? Прямо в среде всё делай , для релиза выбери Release режим
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #17 : 27-02-2009 14:00 » |
|
Вот у меня тут вопросик в тему возник Вот есть строка // Вывод текста pFont->DrawText(TextString, -1,&myRect, DT_CENTER, TextColor);
Второй параметр говорит о том чтобы длинну строки вычисляла функция DrawText автоматически. А если сюда вбить точное значение размера длины строки будет ли программа работать намного быстрее или это не принципиально?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #18 : 28-02-2009 09:29 » |
|
при работе с HDC размер строки определяется при помощи GetTextExtentPoint, потом в прямоугольнике выводится текст. То есть, это всё равно что два раза текст напечатали, только первый раз не вывели на экран. Думаю, тут то же самое
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #19 : 28-02-2009 09:56 » |
|
Я имел ввиду слудующие, покажу на примере.TextString = "Hello"; длина строки 5 и я делаю так pFont->DrawText(TextString, 5, &myRect, DT_CENTER, TextColor);
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #20 : 28-02-2009 10:06 » |
|
pFont->DrawText(TextString, ::strlen(TextString), &myRect, DT_CENTER, TextColor);
думаю, при -1 там та же функция вызовется
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #21 : 28-02-2009 11:33 » |
|
А если тупо в место ::strlen(TextString) написать 5 будет ли намного быстрее или нет? Ведь тогда не вычисляется длина, а она заложенна как константа.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #22 : 28-02-2009 13:19 » |
|
zuze, это негибко, и лазейка для вирусов.
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #23 : 28-02-2009 14:30 » |
|
Если текст меняется, а следовательно и его длина, то это конешно плохо ставить значение длины текста в виде константы, это как ты сказал негибко и лазейка для вирусов (основанные на переполнение буфера), но если текст не меняется, а следовательно и его длина, то я думаю можно задать длину текста в виде константы и скорость выполнения программы будет быстрее.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #24 : 28-02-2009 17:07 » |
|
если и будет быстрее, то настолько незаметно, что оно не стоит того (особенно на фоне ухудшения безопасности и устойчивости программы)
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #25 : 28-02-2009 17:33 » |
|
Вот это я и хотел узнать, я наверно плохо объяснил по этому мы так долго и проковырялись с этим очень маленьким вопросом.
Теперь всё понятно.
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #26 : 28-02-2009 17:39 » |
|
Если можешь Алексей1153++ посмотри пожалуйста мою тему "Несколько вопросов по поводу Visual C++" в разделе "...>Программирование > С/С++ > WinAPI & Visual C++" и дай пожалуйста ответ на вопросы я в этой теме не мог задать эти вопросы так как они не потеме, хотя один третьий вопрос уже был в этой теме и я пока на него ответа не получил. Я пока не получил там ни одного ответа.
Заранее спасибо!!!
|
|
|
Записан
|
|
|
|
zuze
Опытный
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 раз.)
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #28 : 13-03-2009 10:01 » |
|
наверное, нужно напечатать текст на полигоне и вращать полигон Как - не знаю
|
|
|
Записан
|
|
|
|
Антон__
|
|
« Ответ #29 : 13-03-2009 21:09 » |
|
А зачем ты каждый раз создаёшь шрифт? Достаточно создать один раз и потом только Font->DrawText(TextString, -1,&myRect, DT_CENTER, TextColor);
|
|
|
Записан
|
|
|
|
Антон__
|
|
« Ответ #30 : 13-03-2009 21:20 » |
|
У меня не компилируется, для вывода текста требует спрайт. Какие у тебя директ икс и студия?
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #31 : 13-03-2009 21:35 » |
|
DirectX 9 SDK Microsoft Visual C++ 6
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #32 : 14-03-2009 06:08 » |
|
По ходу дело выяснился что у меня старый DirectX 9 SDK. Это выяснилось на основании параметров функции DrawText у новой версии DirectX 9 SDK параметры этой функции немного другие.
В связи с этим маленький вопросик Как называется самая последняя версия DirectX из 9 серии?
|
|
|
Записан
|
|
|
|
Антон__
|
|
« Ответ #33 : 14-03-2009 06:18 » |
|
directx sdk november 2008 У меня такая.
|
|
|
Записан
|
|
|
|
Антон__
|
|
« Ответ #34 : 14-03-2009 06:20 » |
|
Так ли тебе нужен 3д текст? Изучил бы ID3DXMesh или шейдеры.
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #35 : 14-03-2009 06:58 » |
|
C 3D текстом всё впорядке в книге Франк Луна - Введение в программирование трехмерных игр с DX9 всё хорошо по этому поводу написано, а вот про вращение 2D-текста/3D-текста ни слова, ID3DXMesh и шейдеры яещё до них не дошёл в изучении DirectX, но дойду. я делаю всё постепенно.
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #36 : 14-03-2009 07:10 » |
|
Прояснил этот вопрос самая последняя версия DirectX 9c SDK ноябрь 2008, более новые версии из 9 серии не придлагает скачать официальный сайт Microsoft.
|
|
|
Записан
|
|
|
|
zuze
Опытный
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
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #38 : 14-03-2009 11:01 » |
|
Настроил 1. Запускаем Microsoft Visual C++ 6 2. Tools->Options...->Derictories 3. Добавляем C:\DXSDK\INCLUDE
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #39 : 14-03-2009 11:03 » |
|
ещё в LIB надо путь прописать
|
|
|
Записан
|
|
|
|
zuze
Опытный
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?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #41 : 14-03-2009 12:47 » |
|
так потому и надо путь прописать
|
|
|
Записан
|
|
|
|
zuze
Опытный
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
Опытный
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); }
Но почемуто у меня программа стала пожирать ресурсы компьютера?Для большего понимания проблемы прикрепляю файл
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #44 : 14-03-2009 17:25 » |
|
Есть мысль что я создаю шрифт на каждом выводе текста, а достаточно создать один раз, вот наверное из-за этого ресурсы компьютера и пожирает моя программа.
Если в этом дело, то как это поправить?
|
|
|
Записан
|
|
|
|
Антон__
|
|
« Ответ #45 : 14-03-2009 20:40 » |
|
А в чём проблема? Взять и создать его один раз.
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #46 : 14-03-2009 20:41 » |
|
Если заменить D3DXCreateFontIndirect(pDirect3DDevice, &lf, &pFont); Наif (pFont == NULL) D3DXCreateFontIndirect(pDirect3DDevice, &lf, &pFont);
То программа перестаёт "жрать" ресурсы компьютера.
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #47 : 14-03-2009 20:42 » |
|
Я правельно сделал или нет?
|
|
|
Записан
|
|
|
|
Антон__
|
|
« Ответ #48 : 15-03-2009 07:10 » |
|
Правильно. Я тоже так делаю, когда мне лень выносить создание чего-то в отдельную функцию.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #49 : 15-03-2009 07:26 » |
|
Когда лень - рулят классы )
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #50 : 15-03-2009 09:49 » |
|
Я тоже буду пробовать сделать как класс, но в конце изучения основных аспектов DirectX, я не стал делать в виде классов сразу всеголишь по одной причине в книгах которые есть у меня все примеры без классов и я не хотел примеры переделывать под классы.
Так как с выводом текста разобрался приступаю к вращению текста.
|
|
|
Записан
|
|
|
|
zuze
Опытный
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 запускается один раз при включении программы (В этом я не уверен) Такое ощущение что сначала сделали код скомпилировали и получили исполняемый файл, а затем убрали из фала с кодом строчки, или я тупой и не понимаю этот код.
|
|
|
Записан
|
|
|
|
Антон__
|
|
« Ответ #52 : 15-03-2009 15:14 » |
|
Так это DXUT - просто надстройка над директ иксом. Делаешь нужные функции(рисование кадра, обработка событий и т.д.) и передаёшь куда-то указатели на эти функции. А дальше DXUT сам всё обрабатывает:)
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #53 : 15-03-2009 20:38 » |
|
Я думал DXUT.h это стандартный заголовочный файл DirectX-a, а оказывается нет, это собственная разработка для примера и в примерах этого файла нет, так что будем другие примеры искать для вращения текста.
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #54 : 15-03-2009 22:46 » |
|
Нашёл в примерах этот файл и другии которые нужны для клмпиляции, оказалось они лежат в другой папке, но в этих примерах так всё запутанно. Буду искать пример в другом месте.
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #55 : 17-03-2009 22:38 » |
|
Оказалось
Чтобы вращать текст нужно сделать вывод текста через Mesh или Sprite (текстура с текстом на полигоне).
В примере из DirectX 9c ноябрь 2008 используется Mesh.
Я разделы DirewcX Mesh и Sprite (текстура с текстом на полигоне) ещё не проходил, как пройду так сразу выложу код для вращения текста, а пока я прерываюсь с вращением текста.
|
|
« Последнее редактирование: 18-03-2009 04:50 от zuze »
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #56 : 18-03-2009 17:12 » |
|
Решил вывести на экран 3D-текст, для этой цели использую Meshvoid 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. Текст выводится, но его не видно из-за двух вращающихся кубов . Для лучшего понимания прелагаю полный код
|
|
« Последнее редактирование: 18-03-2009 18:23 от zuze »
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #57 : 18-03-2009 20:24 » |
|
В моём коде по мимо вывода 3D-текста, есть ещё вращение двух кубом с освещением. Я подумал может они закрывают текст и что же я увидел когда я убрал из кода всё что относится к кубам.
В место слова "Hello" отображается "He", нижния координата левой стороны буквы 'Н' начинается от центра окна, а верхний правый кусочек буквы 'е' выходит за экран.
Пока не знаю как поправить, думаю, буду рад за помощь.
|
|
|
Записан
|
|
|
|
zuze
Опытный
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", нижния координата левой стороны буквы 'Н' начинается от центра окна, а верхний правый кусочек буквы 'е' выходит за экран.
|
|
|
Записан
|
|
|
|
Антон__
|
|
« Ответ #59 : 19-03-2009 11:08 » |
|
zuze, Код в студию. Какую мировую матрицу ставишь?
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #60 : 19-03-2009 11:32 » |
|
Может надо отдельно делать функции для создания текста, вывода текста и освобождение памяти?
А вот и кодх
|
|
|
Записан
|
|
|
|
Антон__
|
|
« Ответ #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
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #62 : 19-03-2009 23:36 » |
|
Я так понял текст выезжает за экран из-за того что я не задал структуру которая задаёт прямоугольник в который выводится текст. Я ещё раз переписал функцию для создания шрифта и вывода текста на экран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(); } Эту функцию вызываю в функции рендеринга такMyTextOut(TEXT("Hello"), 10, 10, 800, 800, D3DCOLOR_ARGB(150,0,150,14)); Компилируется без ошибок, но при запуске программы выскакивает окно Ошибка приложения с двумя кнопками ОК и Отмена и с текстом Инструкция по адресу "0x0040140a" обратилась к памяти по адресу "0x00000000". Память не может быть "read". "ОК" -- завершение приложения "Отмена" -- отладка приложенияЧто же я не так сделал?Помогите пожалуйста разобраться.
|
|
|
Записан
|
|
|
|
Антон__
|
|
« Ответ #63 : 20-03-2009 07:48 » |
|
Что такое "TEXT("Hello")"?
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #64 : 20-03-2009 07:52 » |
|
"TEXT("Hello")" - это приобоазование типа, но это не нужно можно так "Hello".
|
|
|
Записан
|
|
|
|
zuze
Опытный
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
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #66 : 20-03-2009 08:04 » |
|
Задать цвет это легко SetTextColor(hdc, RGB(255,0,255)); А вот функцию для задания вывода текста в координатах заданными экземпляром структуры RECT я не знаю, если бы я знал тогда можно воспользоватся функцией вывода Text->DrawSubset(0);
|
|
|
Записан
|
|
|
|
zuze
Опытный
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
Опытный
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; }
Но почему-то этот код компилируется без ошибок, а при запуске происходит ошибка такаяПочему эта ошибка происходит?Помогите пожалуйста разобраться.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #69 : 11-06-2009 03:42 » |
|
zuze, ну так же ведь русским по серому написано - пытаешься по адресу 0 прочитать данные. Наверное, где то пустой указатель используешь ? В отладчике поймай место ошибки - это делается легко, без точек останова запусти в режиме отладки, а в момент ошибки выбери из диалога "повторить"
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #70 : 11-06-2009 04:11 » |
|
Я сделал, как Вы сказали. Нажал "Отмена" и перешёл в режим отладки и запустил заново. Кроме вот этогоНет ничего, не понятно, на какую строчку информация указывает.
|
|
|
Записан
|
|
|
|
zuze
Опытный
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
Опытный
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
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #73 : 15-06-2009 09:16 » |
|
Исправил, теперь текст нормально выводится.В функции void Matrix(void) в место строки D3DXVECTOR3(0.0f, 0.0f, 10.0f) надо написать D3DXVECTOR3(0.0f, 0.0f, -10.0f)
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #74 : 15-06-2009 10:09 » |
|
zuze, молодец, что не сдаёшься, несмотря на отсутствие помощников
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #75 : 15-06-2009 14:05 » |
|
Спасибо за поддержку Алексей1153++.В коде надо ещё изменитьУ меня было так// Создание шрифта CreateD3DXTextMesh("Hello", pText3DMesh);
А я исправил на этоif (pText3DMesh == NULL) // Создание шрифта CreateD3DXTextMesh("Hello", pText3DMesh);
Если не исправлять, то создаваться текст будет каждый раз в цикле отрисовки, а так он создаётся один раз.
|
|
« Последнее редактирование: 15-06-2009 14:08 от zuze »
|
Записан
|
|
|
|
zuze
Опытный
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
Опытный
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
Опытный
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(); } } } ... ... ...
|
|
|
Записан
|
|
|
|
|