Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> openGL/DirectX и CLR - среда, дружат ли они??? 
V
    Опции темы
maxfox
Дата 29.7.2009, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 29.7.2009

Репутация: нет
Всего: нет



Всем доброго времени суток.
Подскажите пожалуйста, есть ли возможность использования openGL или DirectX  в CLR - проектах Visual Studio.
 Для инициализации, к примеру OpenGL, ему нужен дескриптрор окна, на котором он будет рисовать, типа HDC.
когда я писал инициализацию в Delphi - то там всё было нормально: form1.Handle - возвращал этот дескриптор. 
а тот же аналог в С++ Form1::Handle - выдаёт дескриптор типа IntPtr - и ничего не работает..


Это сообщение отредактировал(а) maxfox - 29.7.2009, 20:59
PM MAIL   Вверх
NightmareZ
Дата 29.7.2009, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


[хакер]
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 10.8.2006

Репутация: нет
Всего: 13



Код

HWND hWnd = (HWND)Handle.ToPointer();
HDC dc = GetDC(hWnd);



--------------------
NightmareZ.net - мой блог и сайт, мои проекты и прочий трэш
Ely-Art.ru - наша маленькая домашняя арт-студия
mugcraft.ru - кружки на любой вкус
PM WWW ICQ Skype GTalk AOL YIM   Вверх
maxfox
Дата 30.7.2009, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 29.7.2009

Репутация: нет
Всего: нет



Цитата

HDC dc = GetDC(hWnd);

к сожалению, компилятор ругается на эту строку

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();. но было тоже самое. Потом попробовал сделать инициализацию от кнопки, когда форма уже создана, но это ничего не дало..
PM MAIL   Вверх
NightmareZ
Дата 31.7.2009, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


[хакер]
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 10.8.2006

Репутация: нет
Всего: 13



Цитата(maxfox @  30.7.2009,  14:25 Найти цитируемый пост)
к сожалению, компилятор ругается на эту строку

Ну, дык, блин, прилинкуй user32.lib


--------------------
NightmareZ.net - мой блог и сайт, мои проекты и прочий трэш
Ely-Art.ru - наша маленькая домашняя арт-студия
mugcraft.ru - кружки на любой вкус
PM WWW ICQ Skype GTalk AOL YIM   Вверх
maxfox
Дата 24.8.2009, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 29.7.2009

Репутация: нет
Всего: нет



спасибо за подсказку. теперь функция работает.smile

теперь ошибок не выдаёт, но инициализация не проходит  smile 
вот код инициализации:
Код

                        IntPtr ppp;
            ppp=panel1->Handle;
            //ppp = Form1::Handle;                            //пробовал и форму, и панель, на форме...
            myHwnd =(HWND)ppp.ToPointer();

            hDC= GetDC(myHwnd); //создаем контекст устройства
            
            
            PIXELFORMATDESCRIPTOR pfd; //структура для описания формата пикселей
            memset(&pfd,0,sizeof(PIXELFORMATDESCRIPTOR)); //для начала за-полняем все значения структуры нулями
            pfd.nSize=sizeof(PIXELFORMATDESCRIPTOR); //размер структуры, ус-танавливаем равным размеру типа PIXELFORMATDESCRIPTOR
            pfd.nVersion=1;        //номер версии, для работы с OpenGL ставим 1
            pfd.dwFlags = PFD_DRAW_TO_WINDOW |           //рисовать в окне
                PFD_SUPPORT_OPENGL |                   //поддержка OpenGL
                PFD_DOUBLEBUFFER;                       //двойная буферизация
            pfd.iPixelType=PFD_TYPE_RGBA;    //режим для отображения цветов – цветовая  модель RGBA
            pfd.cColorBits=32;           //32-битовая глубина цвета
            pfd.cAlphaBits=8;            //компонента альфа цвета
            pfd.cAccumBits=32;        //буфер аккумулятора
            pfd.cDepthBits=32;         //буфер глубины (z- буфер)
            pfd.cStencilBits=8;         //трафарет
            pfd.iLayerType=PFD_MAIN_PLANE;            //тип плоскости – основная
            //

            nPxFormat= ChoosePixelFormat(hDC,&pfd);
            label2->Text=L"pixel format: "+nPxFormat.ToString();

            BOOL bResult=SetPixelFormat(hDC,nPxFormat,&pfd);
            label2->Text = label2->Text+L", setpixel result: "+ bResult.ToString();

            hRC = wglCreateContext(hDC);
            if (hRC==NULL){
                label1->Text = label1->Text+L" ,create content error";
            }

функция SetPixelFormat срабарывает успешно, т.к. в bResult - выводится TRUE
А вот создание контекста не проходит: wglCreateContext - пишет, что результат равет NULL
может, кто знает  -с чем это может быть связано??
PM MAIL   Вверх
explorer
Дата 24.8.2009, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 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
--------------------
 
PM MAIL WWW ICQ   Вверх
maxfox
Дата 24.8.2009, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
explorer
Дата 25.8.2009, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 104
Регистрация: 26.2.2008

Репутация: нет
Всего: 2



Вы ничего не написали про hRC. Какого она типа? Возможно, проблема именно в ней. В любом случае, чтобы не гадать, попробуем взять работающий пример (из уроков NeHe).

Переменные должны быть объявлены так:
Код

HGLRC           hRC=NULL; // <---- обратите внимание на тип.
HDC               hDC=NULL;
HWND            myHwnd=NULL;


Структура формата пикселя определяется так:
Код

static    PIXELFORMATDESCRIPTOR pfd=                    // pfd Tells Windows How We Want Things To Be
    {
        sizeof(PIXELFORMATDESCRIPTOR),                    // Size Of This Pixel Format Descriptor
        1,                                // Version Number
        PFD_DRAW_TO_WINDOW |                        // Format Must Support Window
        PFD_SUPPORT_OPENGL |                        // Format Must Support OpenGL
        PFD_DOUBLEBUFFER,                        // Must Support Double Buffering
        PFD_TYPE_RGBA,                            // Request An RGBA Format
        bits,                                // Select Our Color Depth
        0, 0, 0, 0, 0, 0,                        // Color Bits Ignored
        0,                                // No Alpha Buffer
        0,                                // Shift Bit Ignored
        0,                                // No Accumulation Buffer
        0, 0, 0, 0,                            // Accumulation Bits Ignored
        16,                                // 16Bit Z-Buffer (Depth Buffer)
        0,                                // No Stencil Buffer
        0,                                // No Auxiliary Buffer
        PFD_MAIN_PLANE,                            // Main Drawing Layer
        0,                                // Reserved
        0, 0, 0                                // Layer Masks Ignored
    };


Далее идёт получение необходимых указателей и данных:

Код

...
hDC=GetDC(hWnd); // получаем контекст устройства
...
PixelFormat=ChoosePixelFormat(hDC,&pfd); // пусть Windows сама выбирает нужный формат
...
SetPixelFormat(hDC,PixelFormat,&pfd); // пробуем применить выбранный формат
...
hRC=wglCreateContext(hDC); // здесь пытаемся получить контекст для "рисования"
...
wglMakeCurrent(hDC,hRC); // активируем выбранный контекст


Попробуйте сделать у себя точно такую же инициализацию. Если все заработает, попробуйте выставить в объявлении структуры формата пикселя нужные вам параметры. Если контекст не удасться выбрать или установить, значит ваша видеокарта не поддерживает такие параметры.
Предположительно, проблема могла возникнуть из-за глубин буферов. 
--------------------
 
PM MAIL WWW ICQ   Вверх
maxfox
  Дата 25.8.2009, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 29.7.2009

Репутация: нет
Всего: нет



Цитата

попробуем взять работающий пример (из уроков NeHe).

на сколько я помню, эти уроки для MFC-среды, или даже под API... но на самом деле я на основе схожих примеров и пытаюсь реализовать всё в CLR.
Цитата

Переменные должны быть объявлены так:

да. переменные я объявил именно так. Пробовал объявлять их и внутри класса формы, и как глобальные переменные - всё без изменений.
Цитата

Структура формата пикселя определяется так:

таким образом я тоже пытался.(попытался и снова) - без изменений.
Цитата

Далее идёт получение необходимых указателей и данных:

ну и здесь, собственно, ошибиться трудно. Единственное, на что я грешу, что у меня контекст устройства получается неверно...
Цитата

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

-это очень сомнительно по нескольким причинам. Во первых, не верится ,что GF8600GT не может поддерживать эти "скромные" параметры. А во вторых, я установил Borland C++builder, 6,
и там написал аналогичный код - контекст был получен, и всё заработало. Это, кстати, и убедило меня во мнении, что в VisualStudio я просто не правильно получаю контекст устройства.
Код

            ppp = Form1::Handle;                            
            myHwnd =(HWND)ppp.ToPointer();
            hDC= GetDC(myHwnd); //создаем контекст устройства

здесь Form1::Handle - имеет тип IntPtr, и без приведения. как я понимаю, не обойтись. То бишь, на второй строчке кода, этот контекст теряется....Побовал все возможные формы приведения(какие знал), но ничего не помогает. Всё то же. Сторка hRC=wglCreateContext(hDC); // здесь пытаемся получить контекст для "рисования" - не проходит.... smile 
PM MAIL   Вверх
explorer
Дата 25.8.2009, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 104
Регистрация: 26.2.2008

Репутация: нет
Всего: 2



Попробуйте SetPixelFormat выполнить после получения контекста,  т.е. после злосчастной wglCreateContext.
Еще можно сделать так: в ppp у вас лежит нужный handle в виде IntPtr. Передавайте этот IntPtr в GetDC. Существуют перегруженные версии GetDC, получающие и возвращающие IntPtr (сам использую именно такие). Потом получившийся результат преобразуйте в нужному типу и передавайте в ChoosePixelFormat и SetPixelFormat, а уже в wglCreateContext передавайте тот IntPtr, который был получен от GetDC. В теории, оба они (IntPtr и преобразованный от него указатель)  обязаны указывать на один и тот же адрес. 

--------------------
 
PM MAIL WWW ICQ   Вверх
maxfox
Дата 25.8.2009, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 29.7.2009

Репутация: нет
Всего: нет



Цитата

Существуют перегруженные версии GetDC, получающие и возвращающие IntPtr (сам использую именно такие).

не подскажешь, в какой библиотеке искать эти перегруженные функции? файл справки по этому поводу молчит...
PM MAIL   Вверх
explorer
Дата 25.8.2009, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 104
Регистрация: 26.2.2008

Репутация: нет
Всего: 2



GetDC, ReleaseDC - это user32.dll, wglCreateContext и wglMakeCurrent - opengl32.dll
Возможно, есть что-то и для ChoosePixelFormat и SetPixelFormat, но это может быть в Gdi32.dll.
Если нужно, могу скинуть часть фреймворка Tao, в котором описываются все возможные импортированные функции.
--------------------
 
PM MAIL WWW ICQ   Вверх
maxfox
  Дата 26.8.2009, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 29.7.2009

Репутация: нет
Всего: нет



уффф. слава богу, человек на www.gamedev.ru помог.
всё оказалось просто.
- по каким то причинам студия хочет, чтобы инициализация openGL начиналась со строки 
Код
wglMakeCurrent( 0, 0 );
.
это собственно всё!!
если сокращённо, то последовательность инициализации такая:
Код

wglMakeCurrent( 0, 0 );
myHwnd =(HWND)panel1->Handle.ToPointer();
hDC= GetDC(myHwnd);
PIXELFORMATDESCRIPTOR pfd;
...
//заполнение pfd
.....
nPxFormat= ChoosePixelFormat(hDC,&pfd);
SetPixelFormat(hDC,nPxFormat,&pfd);
hRC = wglCreateContext(hDC);

wglMakeCurrent(hDC,hRC);   //активируем

     glClearColor (0.1, 0.1, 0.75, 0.45); // цвет фона
    glClear (GL_COLOR_BUFFER_BIT);      // очистка буфера цвета
    SwapBuffers(hDC);   //выводим на экран

wglMakeCurrent(0, 0);    // деактивируем



п.с. кроме того, когда я копался, увидел интересное приведение. Таким образом, строку:
Код

myHwnd =(HWND)panel1->Handle.ToPointer();

можно написать так:
Код

myHwnd =(HWND)(intptr_t)panel1->Handle;

 - будет таботать и так, и так.

В общем - ура! Спасибо всем!!

PM MAIL   Вверх
NightmareZ
Дата 4.9.2009, 01:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


[хакер]
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 10.8.2006

Репутация: нет
Всего: 13



Цитата(maxfox @  26.8.2009,  18:06 Найти цитируемый пост)
по каким то причинам студия хочет, чтобы инициализация openGL начиналась со строки 


Мне кажется, что что-то тут не так....


--------------------
NightmareZ.net - мой блог и сайт, мои проекты и прочий трэш
Ely-Art.ru - наша маленькая домашняя арт-студия
mugcraft.ru - кружки на любой вкус
PM WWW ICQ Skype GTalk AOL YIM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.1162 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.