我正在尋找一個快速,骯髒,非常有效的邊緣檢測着色器或邊緣網格的視頻應用程序。由於這將在移動設備上完成,因此我需要一些能夠提高精度的性能。無論如何,我將模糊輸出,而我所見過的所有邊緣檢測算法都傾向於通過將原始圖像與模糊圖像進行比較來完成。我認爲這是造成大多數性能問題的模糊因素。GLSL邊緣檢測着色器最有效的方法
我有這樣的工作的函數:
vec4 edge()
{
float K00 = -1.0;
float K01 = -2.0;
float K02 = -1.0;
float K10 = 0.0;
float K11 = 0.0;
float K12 = 0.0;
float K20 = 1.0;
float K21 = 2.0;
float K22 = 1.0;
vec2 ox = vec2 (0.0,0.0);
ox[0] = width;
vec2 oy = vec2 (0.0,0.0);
oy[1] = height;
float g00, g01, g02;
float g10, g11, g12;
float g20, g21, g22;
vec4 CC;
vec2 PP = TextureCoord - oy;
CC = texture2D(blurredFrame, vec2(PP-ox));
g00 = getGrey(CC);
CC = texture2D(blurredFrame, vec2(PP));
g01 = getGrey(CC);
CC = texture2D(blurredFrame, vec2(PP+ox));
g02 = getGrey(CC);
PP = TextureCoord;
CC = texture2D(blurredFrame, vec2(PP-ox));
g10 = getGrey(CC);
CC = texture2D(blurredFrame, vec2(PP));
g11 = getGrey(CC);
CC = texture2D(blurredFrame, vec2(PP+ox));
g12 = getGrey(CC);
PP = TextureCoord + oy;
CC = texture2D(blurredFrame, vec2(PP-ox));
g20 = getGrey(CC);
CC = texture2D(blurredFrame, vec2(PP));
g21 = getGrey(CC);
CC = texture2D(blurredFrame, vec2(PP+ox));
g22 = getGrey(CC);
float sx = 0.0, sy = 0.0;
sx = sx + g00 * K00;
sx = sx + g01 * K01;
sx = sx + g02 * K02;
sx = sx + g10 * K10;
sx = sx + g11 * K11;
sx = sx + g12 * K12;
sx = sx + g20 * K20;
sx = sx + g21 * K21;
sx = sx + g22 * K22;
sy = sy + g00 * K00;
sy = sy + g01 * K10;
sy = sy + g02 * K20;
sy = sy + g10 * K01;
sy = sy + g11 * K11;
sy = sy + g12 * K21;
sy = sy + g20 * K02;
sy = sy + g21 * K12;
sy = sy + g22 * K22;
float dist = sqrt(sx * sx + sy * sy);
return dist > threshold ? vec4 (0,0,0,1) : vec4 (1,1,1,1);
}
我見過的所有例子都是這樣,似乎專注於桌面平臺 - 也參與和昂貴獲得在iPhone或一個體面的幀率Android設備。這隻適用於2d應用程序,速度是關鍵。
任何想法,使這個更有效率,或者更好的選擇?感謝大家。
謝謝。我唯一想到的其他事情就是從中刪除「模糊」代碼,並在縮小版本的圖像上執行模糊處理,然後將該紋理傳遞到此代碼的邊緣檢測部分。我認爲這會加速模糊,但我會通過使用多次傳球失去一些收益。 – akaru 2011-05-01 17:13:52