WS_EX_LAYERED & DirectX 9.0 & Windows Aero

Тема в разделе "WASM.DirectX", создана пользователем Udzhen, 11 июн 2007.

  1. Udzhen

    Udzhen New Member

    Публикаций:
    0
    Регистрация:
    18 окт 2005
    Сообщения:
    25
    Адрес:
    Russia
    Вот написал небольшое тестовое приложение, цель которого продемонстрировать отрисовку трехмерного объекта средствами Direct3D на фоне прозрачного окна. Т.е. я стремлюсь создать эффект "3D окна" (В данном случае просто кубик). Проблема заключается в том, что при установке темы "Windows Aero" фон окна перестает быть прозрачным. Во всех остальных случаях все работает нормально, в том числе и с темой "Windows Vista - упрощенный стиль". Важный момент: подобного рода проблема возникает только если рисовать в окне средствами Direct3D, если же рисовать через GDI, то все работает нормально! Перерыл всю сеть, нашел лишь одну статью (http://rsdn.ru/article/opengl/layeredopengl.xml) реализующую "3D окно" и успешно работающюю с темой "Windows Aero", но увы там применяется OpenGL...
    Исходники и бинарник программы в аттаче. Хочу сразу оговориться, с DirectX я сталкиваюсь впервые, а код рисующий вращающийся кубик выдран из какого-то урока.

    Подскажите в чем причина такого поведения...
    Заранее большое спасибо!
     
  2. Kozyr__

    Kozyr__ New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2005
    Сообщения:
    213
    Адрес:
    Ukraine
    Udzhen
    я как-то экспериментировал с такими окнами (тоже с кубом ;). использовать D3D + WS_EX_LAYERED у меня получилось только рендером в текстуру, а потом из текстуры делал DIB, а потом средствами GDI (WM_PAINT + SetDIBitsToDevice) рисовал окно.
     
  3. Udzhen

    Udzhen New Member

    Публикаций:
    0
    Регистрация:
    18 окт 2005
    Сообщения:
    25
    Адрес:
    Russia
    Да, здесь http://rsdn.ru/article/opengl/layeredopengl.xml как раз и описан подобный способ, но только с использованием OpenGL...
    К сожалнию этот способ мне не подходит по причине его очень медленной работы. Но все равно большое спасибо за сорцы!
    Кроме того у способа "D3D + WS_EX_LAYERED" есть один очень большой, на мой взгяд, недостаток... Дело в том, что во первых: границы 3D объекта выглядят ступенчато, а использовать штатные средства Direct3D (Antialiasing filter) для устранения этого недостатка не возможно ввиду того, что граница прозрачности определяется по маске. В вторых: объект на фоне рабочего стола выглядит не естественно, т.е. не вписывается в окружение, цветовую гамму и "освещение"... Можно конечно все настроить один раз, но например при смене темы все наши усилия сойдут на нет. Поэтому хотелось бы развернуть наше окно на весь экран, а прозрачным его делать средствами Direct3D. Это нам дает большие приемущества, а в точности: Возможность применить Antialiasing filter для сглаживания границ объекта, возможность рисовать самые разнообразные тени отбрасываемые объектом и возможность так вписать объект в окружающую среду, что он будет выглядеть на фоне GUI Windows естественно (Технология "встраивания" 3D объекта в графическое изображение не однократно описывалась на сайтах посвященных 3D графике). Правда в этом случае есть одна проблемма: как сделать окно прозрачным, тем более которое развернуто на весь экран, и избежать тормозов? У кого какие будут идеи?
    Интересно узнать, какими средствами винда делает окно прозрачным? Интересует сам механизм. Сейчас курю сорцы win2k, но там такая помойка...

    P.S.
    В идеале прозрачное окно развернутое на весь экран должно быть одно, а приложение которое хочет отрисовать свой 3D объект просто должно добавить свой объект к остальным объектам других приложений. В результае чего мы сможем получить красивые визульные эффекты (отражение в одном объекте другого и т.д.)...
     
  4. Kozyr__

    Kozyr__ New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2005
    Сообщения:
    213
    Адрес:
    Ukraine
    Udzhen
    задумка прикольная :)
    а вот идей реализации у меня пока нет
     
  5. Udzhen

    Udzhen New Member

    Публикаций:
    0
    Регистрация:
    18 окт 2005
    Сообщения:
    25
    Адрес:
    Russia
    Еще один вопрос по теме:
    Можно ли юзать Direct3D из драйвера?
     
  6. CnCVK

    CnCVK New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2006
    Сообщения:
    108
    У меня есть тупая идея:
    При любом изменении положения окна сохранять фон под ним и создавать текстуру и затем выводить ее как фон :)
     
  7. NickLion

    NickLion А вам зачем

    Публикаций:
    0
    Регистрация:
    19 сен 2006
    Сообщения:
    22
    Адрес:
    Ищите
    CnCVK
    Не сработает, если за окном что-то меняется - пусть GIF открыт. :dntknw:
    Udzhen
    Прога из D3D.ZIP без прозрачности вообще (на XP SP2, даже с классической темой)
    А сделать такую вещь без GDI сложно будет, ИМХО. Просто "прозрачность" областей окна как раз на этом уровне контролируется. А на аппаратном уже только отрисовка. Если фигура простая - можно прогнать точки через матрицы преобразования и установить регион из треугольников, которые получились. Сложная - будет тормозить.
    Вторая идея хороша, только её бы на уровне ОС сделать :-9
    Ступенчатость - тут совсем все плохо.
    Идея: нарисовать со сглаживанием на ЧЕРНОМ фоне, считать альфа канал, его использовать при UpdateLayeredWindow, а цвет - само собой вывести. Только тормозить будет жутко. :dntknw:
     
  8. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    Udzhen

    Еще один вопрос по теме:
    Можно ли юзать Direct3D из драйвера?


    А вопрос очень хороший, но боюсь проффесионала такого уровня даже на этом форуме ты не найдешь :dntknw: