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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Установка формата пиксела, для OpenGL 
:(
    Опции темы
PPS05
Дата 5.4.2008, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 262
Регистрация: 6.11.2005
Где: Беларусь, Минск

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



Есть следующий код, который устанавливает формат пиксела для использования в OpenGL:
Код

Gl.PixelFormatDescriptor PFD = new Gl.PixelFormatDescriptor();
// Инициализация PFD...
hdc = Gl.GetDC(this.Handle);
nPixelFormat = Gl.ChoosePixelFormat(hdc, ref PFD);
Gl.wglMakeCurrent(hdc, 0);
Gl.SetPixelFormat(hdc, nPixelFormat, ref PFD);
hglrc = Gl.wglCreateContext(hdc);
Gl.wglMakeCurrent(hdc, hglrc);


Если убрать строчку Gl.wglMakeCurrent(hdc, 0);, то SetPixelFormat возвращает 1, но формат пиксела не устанавливается (проверялось с помощью GetPixelFormat) и контекст не создается. А так - все нормально. Вопрос: в чем дело? Почему этот вызов обязателен и можно ли без него обойтись?

Gl - мой класс, вышеописанные функции объявлены так:
Код

[DllImport("opengl32.dll")]
public static extern uint wglCreateContext(uint hdc);
[DllImport("opengl32.dll")]
public static extern void wglMakeCurrent(uint hdc, uint hglrc);
[DllImport("gdi32.dll")]
public static extern int ChoosePixelFormat(uint hdc, ref PixelFormatDescriptor
    PixelFormatDescriptor);
[DllImport("gdi32.dll")]
public static extern int GetPixelFormat(uint hdc);
[DllImport("gdi32.dll")]
public static extern uint SetPixelFormat(uint hdc, int PixelFormat,
    ref PixelFormatDescriptor PixelFormatDescriptor);



--------------------
Ушел с форума и не вернулся.
PM MAIL ICQ   Вверх
mr.DUDA
Дата 6.4.2008, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



Вообще-то, необязателен. А что говорит GetLastError после неудачного вызова SetPixelFormat?


--------------------
user posted image
PM MAIL WWW   Вверх
PPS05
Дата 6.4.2008, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 262
Регистрация: 6.11.2005
Где: Беларусь, Минск

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



GetLastError() возвращает либо 0, либо 1008 "Попытка ссылки на несуществующий маркер" - в зависимости от того, где ставлю breakpoint. Только вот SetPixelFormat в любом случае возвращает TRUE. А вместо строчки Gl.wglMakeCurrent(hdc, 0); можно написать, например, Gl.wglCreateContext(hdc); - тоже после этого все будет нормально. Больше ничего не смог выяснить.


--------------------
Ушел с форума и не вернулся.
PM MAIL ICQ   Вверх
mr.DUDA
Дата 6.4.2008, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



В доках ещё говорится про ограничения накладываемые на hdc и окно, возможно что-то не выполняется в этом случае:
Цитата
If hdc references a window, calling the SetPixelFormat function also changes the pixel format of the window. Setting the pixel format of a window more than once can lead to significant complications for the Window Manager and for multithread applications, so it is not allowed. An application can only set the pixel format of a window one time. Once a window's pixel format is set, it cannot be changed.

You should select a pixel format in the device context before calling the wglCreateContext function. The wglCreateContext function creates a rendering context for drawing on the device in the selected pixel format of the device context.

An OpenGL window has its own pixel format. Because of this, only device contexts retrieved for the client area of an OpenGL window are allowed to draw into the window. As a result, an OpenGL window should be created with the WS_CLIPCHILDREN and WS_CLIPSIBLINGS styles. Additionally, the window class attribute should not include the CS_PARENTDC style.

(взято из хелпа по SetPixelFormat)


--------------------
user posted image
PM MAIL WWW   Вверх
PPS05
Дата 7.4.2008, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 262
Регистрация: 6.11.2005
Где: Беларусь, Минск

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



Со стилями все в порядке. А вот это заинтересовало:
Цитата(mr.DUDA @  6.4.2008,  11:33 Найти цитируемый пост)
application can only set the pixel format of a window one time

.net вне моего ведома не устанавливает формат до меня?


--------------------
Ушел с форума и не вернулся.
PM MAIL ICQ   Вверх
mr.DUDA
Дата 7.4.2008, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



Цитата(PPS05 @  7.4.2008,  11:21 Найти цитируемый пост)
.net вне моего ведома не устанавливает формат до меня?

Смотря какое окно брать в GetDC, у формы будут другие настройки WS_-стилей по сравнению с контролом/панелью. 

З.Ы. вообще-то, не пробовал с OpenGL работать в дотнете, так что ногами не пинайте.


--------------------
user posted image
PM MAIL WWW   Вверх
PPS05
Дата 7.4.2008, 15:44 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 262
Регистрация: 6.11.2005
Где: Беларусь, Минск

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



В GetDC беру Handle просто формы. Здесь у них все нормально. Чего же я такого натворил, что меня SetPixelFormat так не любит?...


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

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


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

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


 




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


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

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