Sorting 奇偶合并排序

Sorting 奇偶合并排序,sorting,glsl,gpu,mergesort,fragment-shader,Sorting,Glsl,Gpu,Mergesort,Fragment Shader,我试图在gpugems网站上了解,但我很难弄清楚他们在制服中传递了什么。这是完整的着色器 uniform vec3 Param1; uniform vec3 Param2; uniform sampler2D Data; #define OwnPos gl_TexCoord[0] // contents of the uniform data fields #define TwoStage Param1.x #define Pass_mod_Stage Param1.y #define Tw

我试图在gpugems网站上了解,但我很难弄清楚他们在制服中传递了什么。这是完整的着色器

uniform vec3 Param1;
uniform vec3 Param2;
uniform sampler2D Data;

#define OwnPos gl_TexCoord[0]

// contents of the uniform data fields
#define TwoStage Param1.x
#define Pass_mod_Stage Param1.y
#define TwoStage_PmS_1 Param1.z
#define Width Param2.x
#define Height Param2.y
#define Pass Param2.z

void main(void){
// get self
vec4 self = texture2D(Data, OwnPos.xy);

float i = floor(OwnPos.x * Width) + floor(OwnPos.y * Height) * Width;

// my position within the range to merge
float j = floor(mod(i, TwoStage));

float compare;

if ( (j < Pass_mod_Stage) || (j > TwoStage_PmS_1) )
  // must copy -> compare with self
  compare = 0.0;
else
  // must sort
  if ( mod((j + Pass_mod_Stage) / Pass, 2.0) < 1.0)
    // we are on the left side -> compare with partner on the right
    compare = 1.0;
  else
    // we are on the right side -> compare with partner on the left
    compare = -1.0;

// get the partner
float adr = i + compare * Pass;

vec4 partner = texture2D(Data, vec2(floor(mod(adr, Width)) / Width, floor(adr / Width) / Height));

// on the left it's a < operation; on the right it's a >= operation
gl_FragColor = (self.x * compare < partner.x * compare) ? self : partner;
}
uniformvec3参数1;
均匀vec3参数2;
二维数据的均匀采样;
#定义OwnPos gl_TexCoord[0]
//统一数据字段的内容
#定义TwoStage Param1.x
#定义Pass_mod_Stage参数1.y
#定义两个阶段参数1.z
#定义宽度参数2.x
#定义高度参数2.y
#定义passparam2.z
真空总管(真空){
//找回自我
vec4 self=texture2D(数据,自身位置xy);
浮动i=地板(向下位置x*宽度)+地板(向下位置y*高度)*宽度;
//我的位置在要合并的范围内
浮动j=地板(模块(i,两级));
浮动比较;
如果((jtwo Stage_PmS_1))
//必须复制->与自己比较
比较=0.0;
其他的
//必须分类
如果(模式((j+通过模式阶段)/通过,2.0)<1.0)
//我们在左边->与右边的合作伙伴比较
比较=1.0;
其他的
//我们在右侧->与左侧的合作伙伴比较
比较=-1.0;
//找到搭档
浮动adr=i+比较*通过;
vec4搭档=纹理2D(数据,vec2(地板(模数(adr,宽度))/宽度,地板(adr/宽度)/高度));
//左边是<操作;右边是>=操作
gl_FragColor=(self.x*compare
让我绊倒的部分是弄清楚他们给Param1和Param2.z分配了什么

Param2.x和Param2.y只是图像的宽度和高度。每次通过循环时,pass变量是否只是一个递增的数字

Param1.x、Param1.y和Param1.z把我彻底难住了。这个程序的CPU端是否应该有一些不包括在这里的东西


任何帮助或澄清都将不胜感激!谢谢

此示例的代码可用。
main.cpp
文件的第298行是您需要的:

glUniform3fARB(oddevenMergeSort.getUniformLocation("Param1"),
    float(pstage+pstage),
    float(ppass%pstage),
    float((pstage+pstage)-(ppass%pstage)-1)
);
glUniform3fARB(oddevenMergeSort.getUniformLocation("Param2"),
    float(width),
    float(height),
    float(ppass)
); 
int ppass=1