2
我已經實現了一個着色器進行排序像素:那是什麼的排序算法(它運行在GPU如何有效)
void main()
{
vec4 renderedImagePixel = texture2D(CalculatedImage,v_texcoord);
if(int(numRenderPass) == int(v_texcoord.y*float(height)) && fbo){
vec2 coordTHIS = vec2(v_texcoord.x,v_texcoord.y-1.0/float(height));
float THIS = unpack(texture2D(CalculatedImage,coordTHIS));
renderedImagePixel = texture2D(CalculatedImage,coordTHIS);
if(sieveCycle == true){ //even Cycle
//Even cell
if(mod(int(v_texcoord.x*float(width)),2) == 1){
//CHANGES IN CODE HERE
vec2 coordTHAT = vec2(v_texcoord.x+1.0/float(width),v_texcoord.y-1.0/float(height));
float THAT = unpack(texture2D(CalculatedImage,coordTHAT));
//CHANGES IN CODE HERE
if(THIS > THAT){
renderedImagePixel = texture2D(CalculatedImage,coordTHAT);
}
}else{
//Odd cell
//CHANGES IN CODE HERE
vec2 coordTHAT = vec2(v_texcoord.x-1.0/float(width),v_texcoord.y-1.0/float(height));
float THAT = unpack(texture2D(CalculatedImage,coordTHAT));
//CHANGES IN CODE HERE
if(THAT > THIS){
renderedImagePixel = texture2D(CalculatedImage,coordTHAT);
}
}
}else{ //odd cycle
//Even cell
if(mod(int(v_texcoord.x*float(width)),2) == 0){
//CHANGES IN CODE HERE
vec2 coordTHAT = vec2(v_texcoord.x+1.0/float(width),v_texcoord.y-1.0/float(height));
float THAT = unpack(texture2D(CalculatedImage,coordTHAT));
//CHANGES IN CODE HERE
if(THIS > THAT){
renderedImagePixel = texture2D(CalculatedImage,coordTHAT);
}
}else{
//Odd cell
//CHANGES IN CODE HERE
vec2 coordTHAT = vec2(v_texcoord.x-1.0/float(width),v_texcoord.y-1.0/float(height));
float THAT = unpack(texture2D(CalculatedImage,coordTHAT));
//CHANGES IN CODE HERE
if(THAT > THIS){
renderedImagePixel = texture2D(CalculatedImage,coordTHAT);
}
}
}
}
gl_FragColor = renderedImagePixel;
}
現在我想知道它是多麼有效?
我的想法是,如果在一個循環中計算每個像素,算法在最壞的情況下應該是O(n)。這是正確的嗎。如果它只是Bubble Sort的衍生產品。
這裏有一個排序示例的圖片:
你可能希望看看排序網絡,這是有點你試圖實現https://en.wikipedia.org/wiki/Sorting_network –
老兄,它很漂亮。 –
http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter46.html – Luca