【问题标题】:random velocities when using simulation shader使用模拟着色器时的随机速度
【发布时间】:2015-10-07 17:59:44
【问题描述】:

我正在尝试使用着色器实现 Fruchterman Reingold 模拟。在着色器中实现计算部分之前,我用 javascript 编写了它。它完全按照我的预期工作,如下所示:

http://jaredmcqueen.github.io/gpgpu-force-direction/canvas_app.html

在着色器中实现计算部分时,我得到了一个在屏幕上随机漂移的稳定结构。我无法弄清楚是什么排斥力/吸引力导致我的图表如此不可预测地浮动:

http://jaredmcqueen.github.io/gpgpu-force-direction/gpgpu_app.html

物理学的核心来自排斥/吸引函数:

//fr(x) = (k*k)/x;
vec3 addRepulsion(vec3 self, vec3 neighbor){
    vec3 diff = self - neighbor;
    float x = length( diff );
    float f = ( k * k ) / x;
    return normalize(diff) * f;
}

//fa(x) = (x*x)/k;
vec3 addAttraction(vec3 self, vec3 neighbor){
    vec3 diff = self - neighbor;
    float x = length( diff );
    float f = ( x * x ) / k;
    return normalize(diff) * f;
}

任何关于为什么 gpgpu、基于模拟的着色器会表现得看似随机的见解将不胜感激。

【问题讨论】:

    标签: glsl webgl shader simulation physics


    【解决方案1】:

    这似乎不是随机的,结构在看似正确的状态下稳定下来,并朝着恒定的方向移动。

    看起来你在着色器中施加了力,然后在 CPU 端更新了模型的位置,并且这个全局模型位置应该保持不变,或者应该被另一个值更新。

    根据我在代码中看到的内容,我建议消除浮点计算 (compareNodePosition.w == -1.0 || 0.0) 和 continue 运算符。请说是否有帮助。我还没有研究算法逻辑。

    【讨论】:

    • github.com/jaredmcqueen/gpgpu-force-direction/blob/master/…我会重新检查我的定位代码,看看我是否发现了任何问题
    • 好的,我会考虑消除浮点比较。我的项目有很多移动部件,我在创建位置纹理时设置了 .w 值。它们不会在着色器中被覆盖——我只修改 xyz 值。 w 应该始终保持不变
    • 如果您在开发控制台打开的情况下运行演示,我会提供纹理打印输出。我控制台。注销纹理
    • 最后一件事——我很确定算法很好。我觉得我可能对不同的节点和边缘进行了过多的迭代,这导致了我看到的额外速度
    【解决方案2】:

    事实证明我错误地遍历了边缘。这是我的新边缘迭代:

    float idx = selfEdgeIndices.x;
    float idy = selfEdgeIndices.y;
    float idz = selfEdgeIndices.z;
    float idw = selfEdgeIndices.w;
    
    float start = idx * 4.0 + idy;
    float end = idz * 4.0 + idw;
    
    
    if(! ( idx == idz && idy == idw ) ){
    
        float edgeIndex = 0.0;
    
        for(float y = 0.0; y < edgesTexWidth; y++){
            for(float x = 0.0; x < edgesTexWidth; x++){
    
    
            vec2 ref = vec2( x + 0.5 , y + 0.5 ) / vec2(edgesTexWidth,edgesTexWidth);
            vec4 pixel = texture2D(edgeData,ref);
    
            if (edgeIndex >= start && edgeIndex < end){
                nodePosition = getNeighbor(pixel.x);
                nodeDiff.xyz -= addAttraction(currentNodePosition.xyz, nodePosition);
            }
            edgeIndex++;
    
            if (edgeIndex >= start && edgeIndex < end){
                nodePosition = getNeighbor(pixel.y);
                nodeDiff.xyz -= addAttraction(currentNodePosition.xyz, nodePosition);
            }
            edgeIndex++;
    
            if (edgeIndex >= start && edgeIndex < end){
                nodePosition = getNeighbor(pixel.z);
                nodeDiff.xyz -= addAttraction(currentNodePosition.xyz, nodePosition);
            }
            edgeIndex++;
    
            if (edgeIndex >= start && edgeIndex < end){
                nodePosition = getNeighbor(pixel.w);
                nodeDiff.xyz -= addAttraction(currentNodePosition.xyz, nodePosition);
            }
            edgeIndex++;
    
    
            }
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2013-01-03
      • 1970-01-01
      • 2014-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-18
      相关资源
      最近更新 更多