Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> инициализация OpenGl 
:(
    Опции темы
Elfet
Дата 3.11.2004, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



как? и можеть в NET это уже проще? :)


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


Увлеченный
***


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

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



Насколько я знаю - ни фига не проще. Надо вызывать native-функции, короче, все по-старому.
Хотя народ пытается написать нечто заточенное под .NET, например:
http://csgl.sourceforge.net/,
но, имхо, еще рано использовать такие библиотеки на практике.


--------------------
Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед)
...
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)
PM ICQ   Вверх
Elfet
Дата 5.11.2004, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



вот статья smile
Цитата

Использование OpenGL в .Net
Автор: Попов Юрий

Введение
Новые технологии появляются как грибы после дождя, но и старые не спешат уходить со сцены. Из-за этого диалектического процесса часто возникает необходимость «подружить» новое и старое. Представляемый контрол появился на свет благодаря тому, что мне понадобилось использовать «старый добрый» OpenGL в «новом» .Net. Это оказалось совсем не сложно. Разработанный класс OpenGLControl может быть с легкостью использован в качестве базового для любого контрола, в котором необходимо использовать OpenGL.

Аналоги
Одним из наиболее популярных врапперов для OpenGL является CsGL http://csgl.sourceforge.net/. Однако платой за использование CsGL является необходимость распространять вместе с приложением две дополнительные DLL’ки. OpenGLControl свободен от этого недостатка – весь его код содержится в одном файле OpenGLControl.cs, также он имеет более простую и понятную структуру. Недостаток OpenGLControl: импортированы не все функции и константы OpenGL. Необходимые функции вы можете с легкостью импортировать воспользовавшись атрибутом DllImport. Об атрибуте DllImport подробно рассказано в статье Алексея Дубовцева Взаимодействие с DLL. Константы OpenGL описываются как константные члены класса. Описание импортированных функций и констант расположено в начале класса OpenGLControl и для удобства разделено на регионы.

Пример описания функции OpenGL:

[DllImport("opengl32.dll")] public static extern void glBegin(uint mode);



Пример описания константы OpenGL:

public const System.UInt32 PFD_DRAW_TO_WINDOW = 0x00000004;



Быстрый старт
Минимальные действия для создания своего контрола, использующего OpenGL

Создайте новый проект, в свойствах проекта в разделе Build разрешите использование небезопасного (unsafe) кода (Allow unsafe code blocks == true)
Добавьте к проекту класс OpenGLControl
Добавьте в проект свой контрол, порожденный от класса OpenGLControl (это можно сделать командой Project\Add Inherited Control)
Добавьте к вашему контролу обработчик события Paint. В нем необходимо подключить контекст OpenGL (метод OpenGLControl.ActivateContext), выполнить необходимые команды OpenGL, переключить буферы (метод OpenGLControl.SwapBuffers) и отключить контекст (метод OpenGLControl.DeactivateContext)
private void UserControl1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
// Активируем контекст OpenGL
ActivateContext();

// Цвет фона - используем свойство BackColor, унаследованное от Control
glClearColor((float)BackColor.R / 255, (float)BackColor.G / 255, (float)BackColor.B / 255, (float)BackColor.A / 255);
 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

// Смещение по оси Z
glTranslatef(0, 0, -5);
// Поворот сцены
glRotatef(20, 0.3f, -0.4f, 0.2f);

// Задаем цвет используя свойство ForeColor, унаследованное от Control
glColor3ub(ForeColor.R, ForeColor.G, ForeColor.B);

// Рисуем квадрат в плоскости OXY
glBegin(GL_QUADS);
glVertex3f(0, 0, 0);
glVertex3f(1, 0, 0);
glVertex3f(1, 1, 0);
glVertex3f(0, 1, 0);
glEnd();

// Переключаем буфера
SwapBuffers();
// Деактивируем контекст OpenGL
DeactivateContext();
}






СОВЕТ

Глобальные настройки конечного автомата OpenGL, которые не будут меняться в процессе работы, удобно выполнять переопределив метод OnInitScene.


Подробности
Активация/деактивация контекста
Активация и деактивация контекста необходима для корректной работы контрола в MDI приложении (или при размещении на форме нескольких контролов). Метод ActivateContext вызывает функцию wglMakeCurrent с параметрами (hdc, hrc) а метод DeactivateContext вызывает ту же функцию, но с параметрами (IntPtr.Zero, IntPtr.Zero).

Структура PIXELFORMATDESCRIPTOR
Создание любого OpenGL-окна начинается с заполнения полей этой структуры. По умолчанию, структура PIXELFORMATDESCRIPTOR инициализируется следующим образом:

nSize = (ushort)Marshal.SizeOf(this);
nVersion = 1;
dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
iPixelType = PFD_TYPE_RGBA;
cColorBits = 24;
cRedBits = 24; cRedShift = 0;
cGreenBits = 24; cGreenShift = 0;
cBlueBits = 24; cBlueShift = 0;
cAlphaBits = 0; cAlphaShift = 0;
cAccumBits = cAccumRedBits = cAccumGreenBits = cAccumBlueBits = cAccumAlphaBits = 0;
cDepthBits = 32;
cStencilBits = 0;
cAuxBuffers = 0;
iLayerType = 0;
bReserved = 0;
dwLayerMask = dwVisibleMask = dwDamageMask = 0;



Вы можете по-другому инициализировать поля этой структуры, переопределив метод OnPreparePFD.

Методы
Переопределяемые методы
protected virtual void OnPreparePFD(ref PIXELFORMATDESCRIPTOR pfd) Вызывается перед созданием окна OpenGL. Переопределив этот метод, вы можете инициализировать поля структуры PIXELFORMATDESCRIPTOR значениями, отличными, от значений по умолчанию.
protected virtual void OnInitScene() Вызывается сразу после успешного создания окна OpenGL. Переопределив этот метод, вы можете выполнить подготовку сцены OpenGL (например, включить тест глубины или другие глобальные настройки конечного автомата OpenGL, которые не будут меняться в процессе работы). В данном методе не требуется подключать/отключать контекст OpenGL.
protected virtual void OnSetViewport() Вызывается из обработчика события SizeChanged для установки области просмотра (viewport area) окна OpenGL. По умолчанию, область просмотра занимает всю доступную клиентскую область окна. Переопределив этот метод, вы сможете самостоятельно задавать область просмотра. В данном методе не требуется подключать/отключать контекст OpenGL.
protected virtual void SetProjection() Вызывается из обработчика события SizeChanged для установки типа проекции. По умолчанию задается перспективная проекция. Переопределив этот метод, вы сможете самостоятельно задавать тип проекции. В данном методе не требуется подключать/отключать контекст OpenGL.

Общие методы
protected void ActivateContext() Активирует контекст OpenGL.
protected void DeactivateContext() Деактивирует контекст OpenGL.
protected void SwapBuffers() Осуществляет обмен переднего (front) и заднего (rear) буферов.
protected Bitmap ToBitmap() Сохраняет окно OpenGL в битмап с форматом данных System.Drawing.Imaging.PixelFormat.Format24bppRgb.
protected Bitmap ToBitmap(System.Drawing.Imaging.PixelFormat pf) Сохраняет окно OpenGL в битмап с заданным форматом данных.




вот тока не понятно мне в ней вот это:
Цитата
Минимальные действия для создания своего контрола, использующего OpenGL

Создайте новый проект, в свойствах проекта в разделе Build разрешите использование небезопасного (unsafe) кода (Allow unsafe code blocks == true)
Добавьте к проекту класс OpenGLControl
Добавьте в проект свой контрол, порожденный от класса OpenGLControl (это можно сделать командой Project\Add Inherited Control)
Добавьте к вашему контролу обработчик события Paint. В нем необходимо подключить контекст OpenGL (метод OpenGLControl.ActivateContext), выполнить необходимые команды OpenGL, переключить буферы (метод OpenGLControl.SwapBuffers) и отключить контекст (метод OpenGLControl.DeactivateContext)


smile smile smile


--------------------
PM MAIL WWW Skype   Вверх
Elfet
Дата 8.11.2004, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



i need your help! smile


--------------------
PM MAIL WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




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


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

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