簡體   English   中英

計算 GPU 上的圖像相似度 [OpenGL/OcclusionQuery]

[英]Count image similarity on GPU [OpenGL/OcclusionQuery]

OpenGL。 假設我已經繪制了一張圖像,然后使用 XOR 繪制了第二張圖像。 現在我在某處有一個帶有非黑色像素的黑色緩沖區,我讀到我可以使用着色器來計算 GPU 上的黑色 [ rgb(0,0,0) ] 像素?

我還讀到它必須對 OcclusionQuery 做一些事情。 http://oss.sgi.com/projects/ogl-sample/registry/ARB/occlusion_query.txt

有可能嗎? [任何編程語言]

如果您對如何通過 OpenGL/GPU 找到相似性有其他想法 - 那也很棒。

我不確定你是如何做 XOR 位的(至少它應該很慢;我認為當前的任何 GPU 都沒有加速),但這是我的想法:

  1. 有兩個輸入圖像
  2. 打開遮擋查詢。
  3. 兩個圖像繪制到屏幕(即全屏四與設置了兩個紋理),具有片段着色器,其計算ABS(texel1-texel2),並殺死像素(丟棄在GLSL)如果像素是相同的(差零或低於某個閾值)。 最簡單的可能只是使用 GLSL 片段着色器,然后您只需讀取兩個紋理,計算差異的 abs() 並丟棄像素。 非常基本的 GLSL 知識就足夠了。
  4. 獲取通過查詢的像素數。 對於相同的像素,查詢不會通過(像素將被着色器丟棄),對於不同的像素,查詢將通過。

起初我想到了一種更復雜的方法,涉及深度緩沖,但后來意識到僅僅殺死像素就足夠了。 這是我的原版(但上面的更簡單,更有效):

  1. 有兩個輸入圖像
  2. 清除屏幕和深度緩沖區
  3. 將兩個圖像繪制到屏幕上(即設置了兩個紋理的全屏四邊形),使用計算 abs(texel1-texel2) 的片段着色器,並在像素不同時殺死像素(在 GLSL 中丟棄)。 繪制四邊形,使其深度緩沖值接近近平面。
  4. 在此步驟之后,深度緩沖區將包含相同像素的小深度值,以及不同像素的大(遠平面)深度值。
  5. 打開遮擋查詢,並繪制另一個全屏四邊形,其深度比遠平面更近,但比前一個四邊形大。
  6. 獲取通過查詢的像素數。 對於相同的像素,查詢不會通過(深度緩沖區已經接近),對於不同的像素,查詢會通過。 你會使用 SAMPLES_PASSED_ARB 來獲得這個。 CodeSampler.com上有一個遮擋查詢示例,可以幫助您入門。

當然,這一切都需要具有遮擋查詢支持的 GPU。 自 2002 年左右以來,大多數 GPU 都支持這一點,但一些低端 GPU(特別是 Intel 915(又名 GMA 900)和 Intel 945(又名 GMA 950))除外。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM