![]() |
Модераторы: Rickert, Alexeis, BorisVorontsov |
![]() ![]() ![]() |
|
maxfox |
|
|||
Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 29.7.2009 Репутация: нет Всего: нет |
Всем доброго времени суток.
Подскажите пожалуйста, есть ли возможность использования openGL или DirectX в CLR - проектах Visual Studio. Для инициализации, к примеру OpenGL, ему нужен дескриптрор окна, на котором он будет рисовать, типа HDC. когда я писал инициализацию в Delphi - то там всё было нормально: form1.Handle - возвращал этот дескриптор. а тот же аналог в С++ Form1::Handle - выдаёт дескриптор типа IntPtr - и ничего не работает.. Это сообщение отредактировал(а) maxfox - 29.7.2009, 20:59 |
|||
|
||||
NightmareZ |
|
|||
![]() [хакер] ![]() ![]() Профиль Группа: Участник Сообщений: 699 Регистрация: 10.8.2006 Репутация: нет Всего: 13 |
-------------------- NightmareZ.net - мой блог и сайт, мои проекты и прочий трэш Ely-Art.ru - наша маленькая домашняя арт-студия mugcraft.ru - кружки на любой вкус |
|||
|
||||
maxfox |
|
|||
Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 29.7.2009 Репутация: нет Всего: нет |
к сожалению, компилятор ругается на эту строку 1>Компоновка... 1>openGL1.obj : error LNK2028: ссылка на неразрешенную лексему (0A000019) "extern "C" struct HDC__ * __stdcall GetDC(struct HWND__ *)" (?GetDC@@$$J14YGPAUHDC__@@PAUHWND__@@@Z) в функции "private: void __clrcall openGL1::Form1::button1_Click(class System::Object ^,class System::EventArgs ^)" (?button1_Click@Form1@openGL1@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z) 1>openGL1.obj : error LNK2019: ссылка на неразрешенный внешний символ "extern "C" struct HDC__ * __stdcall GetDC(struct HWND__ *)" (?GetDC@@$$J14YGPAUHDC__@@PAUHWND__@@@Z) в функции "private: void __clrcall openGL1::Form1::button1_Click(class System::Object ^,class System::EventArgs ^)" (?button1_Click@Form1@openGL1@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z) 1>E:\Projects\zz_Programs VS\tests\openGL1\Debug\openGL1.exe : fatal error LNK1120: 2 неразрешенных внешних элементов я сначала пробовал писать код в конструкторе формы, после InitializeComponent();. но было тоже самое. Потом попробовал сделать инициализацию от кнопки, когда форма уже создана, но это ничего не дало.. |
|||
|
||||
NightmareZ |
|
|||
![]() [хакер] ![]() ![]() Профиль Группа: Участник Сообщений: 699 Регистрация: 10.8.2006 Репутация: нет Всего: 13 |
Ну, дык, блин, прилинкуй user32.lib -------------------- NightmareZ.net - мой блог и сайт, мои проекты и прочий трэш Ely-Art.ru - наша маленькая домашняя арт-студия mugcraft.ru - кружки на любой вкус |
|||
|
||||
maxfox |
|
|||
Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 29.7.2009 Репутация: нет Всего: нет |
спасибо за подсказку. теперь функция работает.
![]() теперь ошибок не выдаёт, но инициализация не проходит ![]() вот код инициализации:
функция SetPixelFormat срабарывает успешно, т.к. в bResult - выводится TRUE А вот создание контекста не проходит: wglCreateContext - пишет, что результат равет NULL может, кто знает -с чем это может быть связано?? |
|||
|
||||
explorer |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 104 Регистрация: 26.2.2008 Репутация: нет Всего: 2 |
Под отладчиком пробовали смотреть? Особенно интересно было бы посмотреть на значения nPxFormat (он не должен быть 0), и на адреса hDC и pdf, начиная вот с этой строки: nPxFormat= ChoosePixelFormat(hDC,&pfd).
Так же посмотрите, что возвращает GetLastError(). После создания контекста не хватает вызова wglMakeCurrent(hDC, hRC), но это уже скорее дальнейшие возможны епроблемы, чем те, что уже существуют. Имеется подозрение, что wglCreateContext "портит" структурку PixelFormat. Какую версию OpenGL32.dll используете? Ту, что шла вместе с Windows, или сторонюю? Так же попробуйте обновить драйвера на более свежие. И, возможно, видеокарта не держит выбранный формат. Например, для драйверов, идущих вместе с Windows, StencilBufferBit = 0, а не 8. Это сообщение отредактировал(а) explorer - 24.8.2009, 15:23 --------------------
|
|||
|
||||
maxfox |
|
|||
Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 29.7.2009 Репутация: нет Всего: нет |
nPxFormat -равен 10. Пробовал изменять значения структуры pfd, т.к драйвера не менял. они родные от Висты. - значение изменилось на 8. но, в общем не 0.
GetLastError после отработки функции wglCreateContext выдаёт число номер 87. - что с этим делать я не знаю. ( GetLastError ранее не юзал ) адреса hDC и pdf не знаю, как посмотреть. Но значение myHwnd до приведения от типа IntPtr , было равно 198376. - а вообще, оно меняется при каждой компиляции.. ошибка № 87, судя по справке:ERROR_INVALID_PARAMETER - неверный параметр. Получается, что переменная hDC (имеет тип HDC) - неверна... неправильно получена?? Это сообщение отредактировал(а) maxfox - 24.8.2009, 17:30 |
|||
|
||||
explorer |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 104 Регистрация: 26.2.2008 Репутация: нет Всего: 2 |
Вы ничего не написали про hRC. Какого она типа? Возможно, проблема именно в ней. В любом случае, чтобы не гадать, попробуем взять работающий пример (из уроков NeHe).
Переменные должны быть объявлены так:
Структура формата пикселя определяется так:
Далее идёт получение необходимых указателей и данных:
Попробуйте сделать у себя точно такую же инициализацию. Если все заработает, попробуйте выставить в объявлении структуры формата пикселя нужные вам параметры. Если контекст не удасться выбрать или установить, значит ваша видеокарта не поддерживает такие параметры. Предположительно, проблема могла возникнуть из-за глубин буферов. --------------------
|
||||||
|
|||||||
maxfox |
|
||||||||||||
Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 29.7.2009 Репутация: нет Всего: нет |
на сколько я помню, эти уроки для MFC-среды, или даже под API... но на самом деле я на основе схожих примеров и пытаюсь реализовать всё в CLR.
да. переменные я объявил именно так. Пробовал объявлять их и внутри класса формы, и как глобальные переменные - всё без изменений.
таким образом я тоже пытался.(попытался и снова) - без изменений.
ну и здесь, собственно, ошибиться трудно. Единственное, на что я грешу, что у меня контекст устройства получается неверно...
-это очень сомнительно по нескольким причинам. Во первых, не верится ,что GF8600GT не может поддерживать эти "скромные" параметры. А во вторых, я установил Borland C++builder, 6, и там написал аналогичный код - контекст был получен, и всё заработало. Это, кстати, и убедило меня во мнении, что в VisualStudio я просто не правильно получаю контекст устройства.
здесь Form1::Handle - имеет тип IntPtr, и без приведения. как я понимаю, не обойтись. То бишь, на второй строчке кода, этот контекст теряется....Побовал все возможные формы приведения(какие знал), но ничего не помогает. Всё то же. Сторка hRC=wglCreateContext(hDC); // здесь пытаемся получить контекст для "рисования" - не проходит.... ![]() |
||||||||||||
|
|||||||||||||
explorer |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 104 Регистрация: 26.2.2008 Репутация: нет Всего: 2 |
Попробуйте SetPixelFormat выполнить после получения контекста, т.е. после злосчастной wglCreateContext.
Еще можно сделать так: в ppp у вас лежит нужный handle в виде IntPtr. Передавайте этот IntPtr в GetDC. Существуют перегруженные версии GetDC, получающие и возвращающие IntPtr (сам использую именно такие). Потом получившийся результат преобразуйте в нужному типу и передавайте в ChoosePixelFormat и SetPixelFormat, а уже в wglCreateContext передавайте тот IntPtr, который был получен от GetDC. В теории, оба они (IntPtr и преобразованный от него указатель) обязаны указывать на один и тот же адрес. --------------------
|
|||
|
||||
maxfox |
|
|||
Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 29.7.2009 Репутация: нет Всего: нет |
не подскажешь, в какой библиотеке искать эти перегруженные функции? файл справки по этому поводу молчит... |
|||
|
||||
explorer |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 104 Регистрация: 26.2.2008 Репутация: нет Всего: 2 |
GetDC, ReleaseDC - это user32.dll, wglCreateContext и wglMakeCurrent - opengl32.dll.
Возможно, есть что-то и для ChoosePixelFormat и SetPixelFormat, но это может быть в Gdi32.dll. Если нужно, могу скинуть часть фреймворка Tao, в котором описываются все возможные импортированные функции. --------------------
|
|||
|
||||
maxfox |
|
||||||||
Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 29.7.2009 Репутация: нет Всего: нет |
уффф. слава богу, человек на www.gamedev.ru помог.
всё оказалось просто. - по каким то причинам студия хочет, чтобы инициализация openGL начиналась со строки
это собственно всё!! если сокращённо, то последовательность инициализации такая:
п.с. кроме того, когда я копался, увидел интересное приведение. Таким образом, строку:
можно написать так:
- будет таботать и так, и так. В общем - ура! Спасибо всем!! |
||||||||
|
|||||||||
NightmareZ |
|
|||
![]() [хакер] ![]() ![]() Профиль Группа: Участник Сообщений: 699 Регистрация: 10.8.2006 Репутация: нет Всего: 13 |
Мне кажется, что что-то тут не так.... -------------------- NightmareZ.net - мой блог и сайт, мои проекты и прочий трэш Ely-Art.ru - наша маленькая домашняя арт-студия mugcraft.ru - кружки на любой вкус |
|||
|
||||
![]() ![]() ![]() |
Вы можете найти полезным что... | |
|
|
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |