2011-03-01 61 views
4

我想更改桌面屏幕的形狀,因此桌面上顯示的內容會同時失真。用戶仍然可以在畸變的桌面上使用鼠標操作PC(運行應用程序,打開「我的電腦」等)。我想我必須首先得到屏幕座標的投影矩陣。然後轉換矩陣,並將桌面緩衝圖像映射到扭曲的網格。是否有可以修改OpenGL或DirectX桌面屏幕形狀的界面?請給我一些小費。非常感謝你提前。如何扭曲桌面屏幕

請參考圖片從http://oi53.tinypic.com/bhewdx.jpg

BR, 海豐

Addition1:

對不起!也許我沒有明確表達我想要實現的東西。 我想要實現的是修改屏幕的形狀。因此,我們可以同時扭曲在Windows上運行的所有應用程序的形狀。例如,「我的電腦」窗口會隨着桌面屏幕的扭曲而變形。而且我們仍然可以使用失真桌面上的鼠標操作PC(點擊快捷方式運行程序)。

加2: 投影矩陣只是我的假設。沒有任何桌面投影矩陣可以將桌面投影到屏幕上。我想要實現的是改變桌面的形狀,就像將桌面映射到3D網格一樣。但用戶仍然可以在失真的桌面上操作操作系統(點擊快捷方式運行程序,打開ie即可上網)。

加3: OS上運行的所有程序的形狀都隨着屏幕的變形而改變。這是實時的。通常,用戶仍然可以在畸變的屏幕上操作操作系統。

也許我們可以攔截或覆蓋GPU本身來實現效果。

我在調查GDI,我想我可以找到一些線索。第一步是找到如何在屏幕上顯示桌面。

+0

你的意思是,就像你可以在舊CRT屏幕和視頻投影儀上找到的設置一樣? – Calvin1602 2011-03-01 15:31:47

+0

是的。但我想通過軟件設置來控制屏幕的形狀。然後,改變屏幕的形狀後,操作系統上運行的所有程序的形狀將會改變,我們可以在失真的屏幕上控制操作系統。卡爾文,你能給我點小費嗎?謝謝!! – HaifengWang 2011-03-02 14:56:49

+0

請注意,這些方法有專利:http://www.faqs.org/patents/app/20090102862 – 2011-03-19 16:25:58

回答

1

由於帶有Aero的Window Seven使用Direct3D API呈現桌面,因此可能會鉤住(通過使用彎路?)​​進程並更改桌面表面投影到屏幕的方式。據我所知,沒有DWM API可以用來做到這一點。

+0

謝謝!我讀過一些關於DWM和WDDM的資料。我認爲Aero API可以渲染具有特殊形狀的應用程序窗口,即使在3D座標中。但我想要做的是修改投影矩陣,桌面表面投射到屏幕上。如果我們實現此功能,「我的電腦」窗口將隨着桌面屏幕的扭曲而變形。所以我們可以扭曲在Windows上運行的所有應用程序的形狀。我正在研究的一個方向是Windows的低級界面。然後顯示驅動程序也應該被調查。 – HaifengWang 2011-03-01 14:28:36

+0

不錯的主意,upvoted – Calvin1602 2011-03-01 15:18:48

0

我不知道在Windows中如何做到這一點,但如果在X11上用AIGLX合成相當容易創建這些效果。這種合成器的一個例子是Compiz。所以看看那個可能是值得的。

我知道你想在Windows上完成它,但也許已經熟悉這個已經工作的系統的必要任務可能是一個好主意。

+0

謝謝!我看到了Compiz的視頻。這個很酷!但這不是我想要實現的。我想要做的是修改桌面表面投影到屏幕的投影矩陣。如果我們實現此功能,「我的電腦」窗口將隨着桌面屏幕的扭曲而變形。所以我們可以扭曲在Windows上運行的所有應用程序的形狀。 – HaifengWang 2011-03-01 14:41:34

+0

@HaifengWang假設有一個用於渲染桌面的投影矩陣,只有當桌面使用3D API進行合成時纔是如此。純2D桌面不需要任何種類的投影矩陣。 – 2011-03-01 14:47:34

+0

您將截圖鏈接到的效果無法通過簡單矩陣完成。這是一個複雜的非線性效應。而且桌面通常不會被投影(好吧,Aero和Compiz確實改變了這一點)。但是你不會找到一些桌面投影矩陣來修改矩陣。 – datenwolf 2011-03-01 14:56:21

0

問題9.100和9.110以上here如下

9.100怎樣才能找到一個給定對象的空間座標的屏幕座標?

如果您只需要爲幾個頂點找到它,則可以使用GLU庫gluProject()實用程序。對於大量的座標,使用反饋機制會更有效率。

要使用gluProject(),您需要提供ModelView矩陣,投影矩陣,視口和輸入對象空間座標。屏幕空間座標返回X,Y和Z,Z被歸一化(0 < = Z < = 1)。

9.110如何找到屏幕像素的對象空間座標?

GLU庫爲此提供了gluUnProject()函數。

您需要讀取深度緩衝區才能獲得感興趣的X,Y位置處的輸入屏幕座標Z值。這可以編碼如下:

GLdouble z; 

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

請注意,x和y以OpenGL爲中心,左下角爲(0,0)。

您需要提供屏幕空間X,Y和Z值作爲gluUnProject()的輸入,並使用模型視圖矩陣,投影矩陣和視口,這些視點在呈現特定像素時是當前視圖。


OpenGl tutorial說如何使用以下

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

謝謝!我正在學習NeHe的教程。 – HaifengWang 2011-03-01 15:12:04

+0

您的歡迎。希望能幫助到你。 – Alpine 2011-03-01 15:13:03

0

不,你不希望「修改通過桌面表面投射到屏幕上的投影矩陣」來重置投影矩陣。

桌面不顯示在屏幕上。這是在2D,所以這是兩個數組(其中一個恰好是圖形卡上)

之間的簡單的memcpy()的基本思想是如下:

  • 你得到你的OS呈現桌面上的紋理,而不是標準的幀緩衝區。
  • 清除
  • 你的「桌面」

這應該在Linux上有可能與Compiz的顯示一些三角形和紋理它的畫面,datenwolf建議,很難在Vista上,與Tibur酒店的想法,在XP上幾乎不可能。

雖然你給的截圖是在XP下。我懷疑這實際上是第二個屏幕,甚至是第二臺電腦。桌面以標準方式呈現,截取屏幕並在另一個屏幕上呈現出搖擺物體。

1

OK,首先,你發佈的鏈接使用了一些複雜的形狀,而不是簡單的四邊形,所以投影矩陣得到效果不夠。您需要將當前桌面圖像作爲紋理並將該紋理映射到網格上。請注意,你仍然可以用一個簡單的四元組來做到這一點,但它會給出一個更簡單的效果(我仍然建議你先試試這個來調試你的設置)。

如何捕獲桌面內容:

基本上有兩種方式(API)來做到這一點。第一個是老派,只會給你一個快照(很難仔細更新它,以便即使在啓動效果後仍能使用桌面)。第二個將爲您提供更多交互支持,但在Windows XP上不起作用。

  1. 使用Windows GDI函數(可能使用GDI +或.NET,等等)來捕捉桌面內容和保存使用BitBlt()一個DIB位圖 - 這就是你的桌面上的「打印屏幕」按鈕的功能,只有它將圖像放到剪貼板上。然後,將其映射到OpenGL/DirectX紋理,然後繼續處理。
  2. 使用新的Windows DWM Thumbnail功能代理桌面。有關於如何將其用於合成效果的一些documentation

如何使用桌面內容:

這涉及幾個步驟,並且代碼將根據您選擇的DirectX或OpenGL的有很大的差異。

  1. 創建一個支持3D渲染的全屏窗口(即爲該窗口設置OpenGL或DirectX,或者使用一個或兩個內置支持的框架)。
  2. 捕獲桌面內容(方法1:在啓動時方法2:在事件循環中重複使用)
  3. 將桌面內容從位圖傳送到紋理。
  4. 創建表面(四邊形或網格)並映射紋理。
  5. 更新您的窗口。

更多細節:

實現這個要求的良好的知識:

  1. 使用的DirectX或OpenGL
  2. 在Windows

你可能

  • 高級UI設計3D動畫沒有全部的知識來實現​​這一點,因此我建議您花一些時間研究所需的API並計劃應用程序中的數據流。

    此外,這篇文章故意含糊不清。如果您需要更多關於使用特定API的不同步驟的詳細信息,請隨時在SO上提出其他更有針對性的問題!

  • +0

    é。謝謝André給我這麼多的信息!我們可以通過您的方法將桌面映射到網格。但我想在扭曲的桌面上操作操作系統。所有的程序也可以在扭曲的桌面上運行。例如,單擊運行程序的快捷方式。如果打開「我的電腦」,則「我的電腦」窗口失真。如果播放視頻,視頻也會在失真的屏幕上播放。 – HaifengWang 2011-03-02 14:25:36