Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > openGL/DirectX и CLR - среда |
Автор: maxfox 29.7.2009, 20:58 |
Всем доброго времени суток. Подскажите пожалуйста, есть ли возможность использования openGL или DirectX в CLR - проектах Visual Studio. Для инициализации, к примеру OpenGL, ему нужен дескриптрор окна, на котором он будет рисовать, типа HDC. когда я писал инициализацию в Delphi - то там всё было нормально: form1.Handle - возвращал этот дескриптор. а тот же аналог в С++ Form1::Handle - выдаёт дескриптор типа IntPtr - и ничего не работает.. |
Автор: NightmareZ 29.7.2009, 21:09 | ||
|
Автор: maxfox 30.7.2009, 14:25 | ||
к сожалению, компилятор ругается на эту строку 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 31.7.2009, 13:10 |
Ну, дык, блин, прилинкуй user32.lib |
Автор: maxfox 24.8.2009, 14:08 | ||
спасибо за подсказку. теперь функция работает.![]() теперь ошибок не выдаёт, но инициализация не проходит ![]() вот код инициализации:
функция SetPixelFormat срабарывает успешно, т.к. в bResult - выводится TRUE А вот создание контекста не проходит: wglCreateContext - пишет, что результат равет NULL может, кто знает -с чем это может быть связано?? |
Автор: explorer 24.8.2009, 15:13 |
Под отладчиком пробовали смотреть? Особенно интересно было бы посмотреть на значения nPxFormat (он не должен быть 0), и на адреса hDC и pdf, начиная вот с этой строки: nPxFormat= ChoosePixelFormat(hDC,&pfd). Так же посмотрите, что возвращает GetLastError(). После создания контекста не хватает вызова wglMakeCurrent(hDC, hRC), но это уже скорее дальнейшие возможны епроблемы, чем те, что уже существуют. Имеется подозрение, что wglCreateContext "портит" структурку PixelFormat. Какую версию OpenGL32.dll используете? Ту, что шла вместе с Windows, или сторонюю? Так же попробуйте обновить драйвера на более свежие. И, возможно, видеокарта не держит выбранный формат. Например, для драйверов, идущих вместе с Windows, StencilBufferBit = 0, а не 8. |
Автор: maxfox 24.8.2009, 17:22 |
nPxFormat -равен 10. Пробовал изменять значения структуры pfd, т.к драйвера не менял. они родные от Висты. - значение изменилось на 8. но, в общем не 0. GetLastError после отработки функции wglCreateContext выдаёт число номер 87. - что с этим делать я не знаю. ( GetLastError ранее не юзал ) адреса hDC и pdf не знаю, как посмотреть. Но значение myHwnd до приведения от типа IntPtr , было равно 198376. - а вообще, оно меняется при каждой компиляции.. ошибка № 87, судя по справке:ERROR_INVALID_PARAMETER - неверный параметр. Получается, что переменная hDC (имеет тип HDC) - неверна... неправильно получена?? |
Автор: explorer 25.8.2009, 09:19 | ||||||
Вы ничего не написали про hRC. Какого она типа? Возможно, проблема именно в ней. В любом случае, чтобы не гадать, попробуем взять работающий пример (из уроков NeHe). Переменные должны быть объявлены так:
Структура формата пикселя определяется так:
Далее идёт получение необходимых указателей и данных:
Попробуйте сделать у себя точно такую же инициализацию. Если все заработает, попробуйте выставить в объявлении структуры формата пикселя нужные вам параметры. Если контекст не удасться выбрать или установить, значит ваша видеокарта не поддерживает такие параметры. Предположительно, проблема могла возникнуть из-за глубин буферов. |
Автор: maxfox 25.8.2009, 14:12 | ||||||||||||
на сколько я помню, эти уроки для MFC-среды, или даже под API... но на самом деле я на основе схожих примеров и пытаюсь реализовать всё в CLR.
да. переменные я объявил именно так. Пробовал объявлять их и внутри класса формы, и как глобальные переменные - всё без изменений.
таким образом я тоже пытался.(попытался и снова) - без изменений.
ну и здесь, собственно, ошибиться трудно. Единственное, на что я грешу, что у меня контекст устройства получается неверно...
-это очень сомнительно по нескольким причинам. Во первых, не верится ,что GF8600GT не может поддерживать эти "скромные" параметры. А во вторых, я установил Borland C++builder, 6, и там написал аналогичный код - контекст был получен, и всё заработало. Это, кстати, и убедило меня во мнении, что в VisualStudio я просто не правильно получаю контекст устройства.
здесь Form1::Handle - имеет тип IntPtr, и без приведения. как я понимаю, не обойтись. То бишь, на второй строчке кода, этот контекст теряется....Побовал все возможные формы приведения(какие знал), но ничего не помогает. Всё то же. Сторка hRC=wglCreateContext(hDC); // здесь пытаемся получить контекст для "рисования" - не проходит.... ![]() |
Автор: explorer 25.8.2009, 15:08 |
Попробуйте SetPixelFormat выполнить после получения контекста, т.е. после злосчастной wglCreateContext. Еще можно сделать так: в ppp у вас лежит нужный handle в виде IntPtr. Передавайте этот IntPtr в GetDC. Существуют перегруженные версии GetDC, получающие и возвращающие IntPtr (сам использую именно такие). Потом получившийся результат преобразуйте в нужному типу и передавайте в ChoosePixelFormat и SetPixelFormat, а уже в wglCreateContext передавайте тот IntPtr, который был получен от GetDC. В теории, оба они (IntPtr и преобразованный от него указатель) обязаны указывать на один и тот же адрес. |
Автор: maxfox 25.8.2009, 18:17 | ||
не подскажешь, в какой библиотеке искать эти перегруженные функции? файл справки по этому поводу молчит... |
Автор: explorer 25.8.2009, 19:39 |
GetDC, ReleaseDC - это user32.dll, wglCreateContext и wglMakeCurrent - opengl32.dll. Возможно, есть что-то и для ChoosePixelFormat и SetPixelFormat, но это может быть в Gdi32.dll. Если нужно, могу скинуть часть фреймворка Tao, в котором описываются все возможные импортированные функции. |
Автор: maxfox 26.8.2009, 18:06 | ||||||||
уффф. слава богу, человек на www.gamedev.ru помог. всё оказалось просто. - по каким то причинам студия хочет, чтобы инициализация openGL начиналась со строки
это собственно всё!! если сокращённо, то последовательность инициализации такая:
п.с. кроме того, когда я копался, увидел интересное приведение. Таким образом, строку:
можно написать так:
- будет таботать и так, и так. В общем - ура! Спасибо всем!! |
Автор: NightmareZ 4.9.2009, 01:20 | ||
Мне кажется, что что-то тут не так.... |