WS_EX_LAYERED и OpenGL
От: Сапронов Андрей Юрьевич Россия  
Дата: 26.03.04 05:07
Оценка: 255 (7)
Статья:
WS_EX_LAYERED и OpenGL
Автор(ы): Сапронов Андрей Юрьевич
Дата: 16.09.2004
Статья объясняет использованию OpenGL в полупрозрачных оконах (созданным с расширенным стилем WS_EX_LAYERED).


Авторы:
Сапронов Андрей Юрьевич

Аннотация:
Начиная с Windows 2000, компания Microsoft включила в состав операционной системы поддержку окон, созданных с расширенным стилем WS_EX_LAYERED. В результате стало возможным очень просто создавать окна с различной степенью прозрачности, объявлять прозрачные (для данного окна) цвета и так далее. Все это достигается при помощи двух функций WinAPI: SetLayeredWindowAttributes и UpdateLayeredWindow.
Однако когда автор попробовал работать с OpenGL-контекстом, результата, в смысле прозрачности окон, удалось добиться далеко не сразу. Эта статья рассказывает о том, как работать с OpenGL в полупрозрачных окнах.
Re: WS_EX_LAYERED и OpenGL
От: adontz Грузия http://adontz.wordpress.com/
Дата: 18.09.04 09:06
Оценка:
Здравствуйте, Сапронов Андрей Юрьевич, Вы писали:

bAlpha – степень прозрачности окна. При bAlpha, равном нулю, окно делается полностью прозрачным. При bAlpha, равном 255 (0xff), окно становится совершенно непрозрачным.


Либо стоит упомянуть стандартный термин Альфа-канал, либо сказать, что bAlpha – степень НЕпрозрачности окна.


Например, если указать
SetLayeredWindowAttributes(hWnd, RGB(0, 0, 0), 0x0, LWA_COLORKEY)
то прозрачным окажутся только те части окна, которые закрашены в чёрный цвет.
Наоборот, если будет указано
SetLayeredWindowAttributes(hWnd, RGB(0, 0, 0), 0x0, LWA_COLORKEY)
то прозрачными окажутся только те части, которые закрашены белым цветом.


Очепятки?

А так см. оценку.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[2]: WS_EX_LAYERED и OpenGL
От: duan Россия  
Дата: 18.09.04 10:14
Оценка:
Здравствуйте, adontz, Вы писали:

A>Здравствуйте, Сапронов Андрей Юрьевич, Вы писали:


Ох как давно это было.

A>Либо стоит упомянуть стандартный термин Альфа-канал,

Альфа канал? Это лучше для текстур применять.

либо сказать, что bAlpha – степень НЕпрозрачности окна.
Согласен. Как по смыслу, так и по переводу термина opacity.

Хотя... прозрачность звучит лучше. Это конечно субъективно.


A>

A>Например, если указать
A>SetLayeredWindowAttributes(hWnd, RGB(0, 0, 0), 0x0, LWA_COLORKEY)
A>то прозрачным окажутся только те части окна, которые закрашены в чёрный цвет.
A>Наоборот, если будет указано
A>SetLayeredWindowAttributes(hWnd, RGB(0, 0, 0), 0x0, LWA_COLORKEY)
A>то прозрачными окажутся только те части, которые закрашены белым цветом.


A>Очепятки?


Да конечно. Дело в том, что между написанием статьи и ее выходом прошел немалый срок. Более полугода. Видимо какие то заминики в редакции. Так получилось, что моя и издательская версия не совпадают. Последние мои изменения внесены не были...

У меня это так:
SetLayeredWindowAttributes(hWnd, RGB(0, 0, 0), 0x0, LWA_COLORKEY)

SetLayeredWindowAttributes(hWnd, RGB(0xff, 0xff, 0xff), 0x0, LWA_COLORKEY)



A>А так см. оценку.

Вы имеете в виду 75 (2)? Увы я не знаю что это значит.
Re: WS_EX_LAYERED и OpenGL
От: siv Украина  
Дата: 22.09.04 19:29
Оценка:
Здравствуйте, Сапронов Андрей Юрьевич, Вы писали:
САЮ>Статья:

К сожалению, рендереинг в контекст в памяти происходит исключительно через software OpenGL реализацию.
Соответвенно версия доступна только 1.1 и прощай скорость и полезные расширения...
А вот рендеринг ч\з PBuffer — другое дело...
Re[2]: WS_EX_LAYERED и OpenGL
От: duan Россия  
Дата: 22.09.04 23:03
Оценка:
Здравствуйте, siv, Вы писали:

siv>Здравствуйте, Сапронов Андрей Юрьевич, Вы писали:

САЮ>>Статья:

siv>К сожалению, рендереинг в контекст в памяти происходит исключительно через software OpenGL реализацию.

Да. Это так.
siv>А вот рендеринг ч\з PBuffer — другое дело...
А что такое PBuffer
Re[3]: WS_EX_LAYERED и OpenGL
От: Аноним  
Дата: 08.10.04 11:34
Оценка:
siv>>А вот рендеринг ч\з PBuffer — другое дело...
D>А что такое PBuffer
Pixel buffer...
См. WGL_ARB_pbuffer на http://oss.sgi.com/projects/ogl-sample/registry/
Поддерживают практически все адаптеры, за исключением некоторого "ацтоя" (например, S3 Graphics KM400/MMX/K3D 1.2)
Re: WS_EX_LAYERED и OpenGL
От: mihauzen Украина  
Дата: 28.01.05 08:46
Оценка:
Здравствуйте, Сапронов Андрей Юрьевич, Вы писали:

...про WS_EX_LAYERED и OpenGL.

Я пытаюсь создать прозрачное окно на основе АТЛ класса CAxWindow (контейнер для Ах-контролов). Но оно ну ни как не хочет принимать ExStyle. Вот пример кода:

CAxWindow wnd(m_hWnd);
CRect rc;
HRESULT hr;

GetClientRect(rc);
HWND wndFP = wnd.Create(m_hWnd,rc,_T(""),WS_BORDER | WS_VISIBLE | WS_CHILD ,0,0);
::SetWindowLong(wndFP, GWL_EXSTYLE, WS_EX_LAYERED);
SetLayeredWindowAttributes(wndFP, RGB(0xff, 0xff, 0xff), 0, LWA_ALPHA);
::UpdateWindow(wndFP);
   
DWORD b=wnd.GetExStyle();//==0


Не знаете ли вы в чем может быть проблема и как ее решить?
...все это временно... (с) Айэм
Re[2]: WS_EX_LAYERED и OpenGL
От: mihauzen Украина  
Дата: 28.01.05 10:46
Оценка:
Здравствуйте, mihauzen, Вы писали:

M>Здравствуйте, Сапронов Андрей Юрьевич, Вы писали:


M>...про WS_EX_LAYERED и OpenGL.


M>Я пытаюсь создать прозрачное окно на основе АТЛ класса CAxWindow (контейнер для Ах-контролов). Но оно ну ни как не хочет принимать ExStyle. Вот пример кода:


M>
M>CAxWindow wnd(m_hWnd);
M>CRect rc;
M>HRESULT hr;

M>GetClientRect(rc);
M>HWND wndFP = wnd.Create(m_hWnd,rc,_T(""),WS_BORDER | WS_VISIBLE | WS_CHILD ,0,0);
M>::SetWindowLong(wndFP, GWL_EXSTYLE, WS_EX_LAYERED);
M>SetLayeredWindowAttributes(wndFP, RGB(0xff, 0xff, 0xff), 0, LWA_ALPHA);
M>::UpdateWindow(wndFP);
   
M>DWORD b=wnd.GetExStyle();//==0
M>


M>Не знаете ли вы в чем может быть проблема и как ее решить?


Кажется — эта штука не работает с CHILD окнами
...все это временно... (с) Айэм
Re: WS_EX_LAYERED и OpenGL
От: buzzer  
Дата: 06.05.06 13:40
Оценка:
Здравствуйте,
прочитал вашу статью и возник вопрос.

Как реализовать без мерцаний наложения WS_EX_LAYERED поверх OpenGL окна.

можно рассматривать как мне нужно дорисовывать на слой который рендерит OpenGL дорисовывать на GDI. Рендирить в битмап очень сильно тормозит.

Спасибо за ответ.
Re: Раз уж подняли тему из глубины веков...
От: McSeem2 США http://www.antigrain.com
Дата: 06.05.06 19:03
Оценка:
D>Однако не забывайте, что скорость у такого рода приложений на порядок меньше, чем у “чистого” OpenGL.

То есть, получается чисто софтварный рендеринг, так? И ни какой HW акселерации. Если так, то смысл всего этого действа весьма сомнителен.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[2]: Раз уж подняли тему из глубины веков...
От: Аноним  
Дата: 14.07.06 21:49
Оценка:
MS>То есть, получается чисто софтварный рендеринг, так? И ни какой HW акселерации. Если так, то смысл всего этого действа весьма сомнителен.

Есть пример как можно это сделать с полной 3D акселлерацией. Только исходник довольно большой, не знаю
можно ли его постить здесь, сервер загрузить файл не дает. Если интересно, пиши. Как-нибудь договоримся.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.