Как исказить экран рабочего стола - PullRequest
5 голосов
/ 01 марта 2011

Я хочу изменить форму экрана рабочего стола, чтобы то, что отображается на рабочем столе, было искажено одновременно. И пользователь по-прежнему может управлять ПК с помощью мыши на искаженном рабочем столе (Запустите приложения, откройте «Мой компьютер» и т. Д.). Я думаю, что я должен сначала получить матрицу проекции экранной координаты. Затем преобразуйте матрицу и сопоставьте изображение буфера рабочего стола с искаженной сеткой. Существуют ли какие-либо интерфейсы, которые могут изменять форму экрана рабочего стола в OpenGL или DirectX? Не могли бы вы дать мне совет. Заранее большое спасибо.

Пожалуйста, обратитесь к картине от http://oi53.tinypic.com/bhewdx.jpg

BR, Haifeng

Addition1:

Простите! Может быть, я не ясно выразил, что я хочу реализовать. То, что я хочу реализовать, это изменить форму экрана. Таким образом, мы можем искажать формы всех приложений, которые одновременно работают в Windows. Например, что окно «Мой компьютер» будет искажено из-за искажения экрана рабочего стола. И мы все еще можем управлять ПК с помощью мыши с искаженного рабочего стола (нажмите на ярлык, чтобы запустить программу).

Addition2: Матрица проекции - это только мое предположение. Не существует какой-либо матрицы проекции рабочего стола, с помощью которой поверхность рабочего стола проецируется на экран. То, что я хочу реализовать, - это изменить форму рабочего стола, так же как и при отображении рабочего стола в трехмерную сетку. Но пользователь все еще может работать с ОС на искаженном рабочем столе (нажмите на ярлык, чтобы запустить программу, откройте, например, для серфинга в Интернете).

Addition3: Формы всех программ, запускаемых в ОС, изменяются с искажением экрана. Это в реальном времени. Пользователь по-прежнему может работать с ОС на искаженном экране, как обычно.

Может быть, мы можем перехватить или переопределить сам графический процессор для реализации эффекта.

Я расследую GDI, думаю, я смогу найти какую-то подсказку для этого. Первый шаг - найти способ отображения рабочего стола на экране.

Ответы [ 5 ]

1 голос
/ 01 марта 2011

Хорошо, во-первых, ссылка, которую вы разместили, использует некоторую сложную фигуру, а не простой квад, поэтому матрица проекции для получения этого эффекта будет недостаточной. Вам понадобится текущее изображение рабочего стола в качестве текстуры и отобразите эту текстуру на сетку. Обратите внимание, что вы все еще можете сделать это с помощью простого четырехугольника, но он даст более упрощенный эффект (я все же предлагаю вам сначала попробовать это для отладки вашей установки).

Как захватить содержимое рабочего стола:

Существует два основных способа (API) для этого. Первый - old-school, он даст вам только один снимок (его очень сложно тщательно обновить, чтобы вы все еще использовали свой рабочий стол даже после запуска эффекта). Второй даст вам больше поддержки для взаимодействия, но не работает в Windows XP.

  1. Используйте функции Windows GDI (возможно, используя GDI + или .NET, что угодно), чтобы захватить содержимое рабочего стола и сохранить его в растровое изображение DIB, используя BitBlt() - это то, что «экран печати» Кнопка на рабочем столе делает, только она помещает изображение в буфер обмена. Затем сопоставьте это с текстурой OpenGL / DirectX и перейдите к остальным.
  2. Используйте новую функцию Windows DWM Thumbnail для прокси на рабочем столе. Существует некоторая документация о том, как использовать это для создания эффектов.

Как использовать содержимое рабочего стола:

Это включает в себя несколько шагов, и код будет сильно различаться в зависимости от вашего выбора DirectX или OpenGL.

  1. Создайте полноэкранное окно с поддержкой 3D-рендеринга (т.е. настройте OpenGL или DirectX для этого окна или используйте некоторую платформу со встроенной поддержкой одного или обоих).
  2. Захват содержимого рабочего стола (метод 1: один раз при запуске, метод 2: несколько раз в цикле событий)
  3. Перенос содержимого рабочего стола из растрового изображения в текстуру.
  4. Создайте поверхность (квад или сетку) и нанесите на карту текстуру.
  5. Обновите ваше окно.

Подробнее:

Выполнение этого требует хорошего знания:

  1. 3D-анимации с использованием DirectX или OpenGL
  2. Расширенное программирование пользовательского интерфейса в Windows

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

Кроме того, этот пост намеренно неясен. Когда вам нужно больше подробностей о различных шагах, связанных с использованием определенного API, не стесняйтесь задавать другие, более сфокусированные вопросы о SO!

1 голос
/ 01 марта 2011

Поскольку Window Seven с Aero визуализирует рабочий стол с помощью Direct3D API, возможно, можно подключить (используя обходные пути) процесс dwm.exe и изменить способ проецирования поверхности рабочего стола на экран. Насколько я знаю, нет никакого DWM API, который вы можете использовать для этого.

0 голосов
/ 01 марта 2011

Нет, вы не хотите «изменять матрицу проецирования, с помощью которой поверхность рабочего стола проецируется на экран».

Поверхность рабочего стола НЕ проецируется на экран. Это в 2D, так что это простой memcpy () между двумя массивами (один из которых находится на графической карте)

Основная идея заключается в следующем:

  • вы получаете свою ОС для рендеринга рабочего стола в виде текстуры вместо стандартного кадрового буфера.
  • вы очищаете экран
  • Вы отображаете несколько треугольников и текстурируете их с помощью «рабочего стола»

Это должно быть возможно в Linux с Compiz, как предположил datenwolf, очень сложно в Vista, с идеей Тибура и почти невозможно в XP.

Скриншот, который вы даете, находится под XP. Я подозреваю, что на самом деле это второй экран или даже второй компьютер. Рабочий стол визуализируется стандартным способом, снимок экрана делается и отображается на шатком объекте на другом экране.

0 голосов
/ 01 марта 2011

Вопросы 9.100 и 9.110 по здесь следующие:

9.100 Как найти экранные координаты для заданной координаты пространства объекта?

Вы можете использовать служебную программу библиотеки GLU gluProject(), если вам нужно только найти ее для нескольких вершин.Для большого количества координат может быть более эффективно использовать механизм обратной связи.

Чтобы использовать gluProject(), вам потребуется предоставить матрицу ModelView, матрицу проекции, видовой экран и координаты пространства входного объекта.,Координаты экранного пространства возвращаются для X, Y и Z, причем Z нормализуется (0 <= Z <= 1).</p>

9.110 Как найти координаты пространства объекта для пикселя на экране?

Библиотека GLU предоставляет для этой цели функцию gluUnProject().

Вам потребуется прочитать буфер глубины, чтобы получить значение Z координаты входного экрана в интересующем месте X, Y.Это может быть закодировано следующим образом:

GLdouble z;

glReadPixels (x, y, 1, 1, GL_DEPTH_COMPONENT, GL_DOUBLE, &z);

Обратите внимание, что x и y являются OpenGL-центрированными с (0,0) в нижнем левом углу.

Вам нужно будет предоставитьзначения экранного пространства X, Y и Z в качестве входных данных для gluUnProject () с матрицей ModelView, матрицей проекции и окном просмотра, которые были актуальны на момент визуализации определенного интересующего пикселя. В руководстве по OpenGl рассказывается, как сбросить матрицу проекции с помощью следующего

glMatrixMode(GL_PROJECTION);        // Select The Projection Matrix
glLoadIdentity();                  // Reset The Projection Matrix

// Calculate The Aspect Ratio Of The Window
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);

glMatrixMode(GL_MODELVIEW);     // Select The Modelview Matrix
glLoadIdentity();                 // Reset The Modelview Matrix
0 голосов
/ 01 марта 2011

Я понятия не имею, как можно это сделать в Windows, но создать эти эффекты, если довольно просто на X11 с композитингом AIGLX.Одним из примеров такого композитора является Compiz .Так что, возможно, стоит взглянуть на это.

Я знаю, что вы хотите сделать это в Windows, но, возможно, знакомство с необходимыми задачами в системе, где это уже работает, может быть хорошей идеей..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...