2016-08-11 6 views
1

私はThreeJSでGLSL上の球詐欺師シェーダーを開発しています。私のアルゴリズムは、Siggらの出版物に基づいています。 「二次曲面のGPUベースのレイキャスティング」と命名されました。ThreeJS上のSphere詐称者

古典的なジオメトリアプローチを使用する場合、各球を表すために数十または数百の三角形が必要です。何千もの球を表示する必要がある場合は、メモリの負荷がかかる可能性があります。球の偽装によって、球を表示するためにジオメトリ上の位置と半径のみを保存することができ、これまでの手法よりもはるかに優れたパフォーマンスが得られます。

今のところ、ThreeJSシェーダチャンクを使ってThreeJSの完全な互換性を確保しても、シェーダの開発に成功しました。デモページhereがあります。しかし、この実装では最後のことはできません。

シーン上のオブジェクトを移動するとき、球の詐称者を使用するオブジェクトが通常のメッシュに比べて遅れているようです。また、球体はthis pictureのように「切り取られている」ことがあります。

この2番目のバグは、スプライトが頂点シェーダによってシーンにうまく配置されているが、フラグメントシェーダが間違った座標を計算していると思います。スプライトの各画素について同じ値を与える必要がフラグメントシェーダに頂点シェーダによって提供

  • 二可変長:私は、問題があり得るコードの二つの部品を疑います。私はこれを確認する方法を知らない。

    varying float projMatrix11; 
    varying float projMatrix22; 
    
  • 私は

    group.traverse(function(o) { 
        if (!o.material) { return; } 
    
        var u = o.material.uniforms; 
        if (!u) { return; } 
    
        modelViewMatrixInverse.getInverse(
         o.modelViewMatrix 
        ); 
    
        if (u.projectionMatrixInverse) { 
         u.projectionMatrixInverse.value = projectionMatrixInverse; 
        } 
    
        if (u.projectionMatrixTranspose) { 
         u.projectionMatrixTranspose.value = projectionMatrixTranspose; 
        } 
    
        if (u.modelViewMatrixInverse) { 
         u.modelViewMatrixInverse.value = modelViewMatrixInverse; 
        } 
    
        if (u.viewport) { 
         u.viewport.value = viewport; 
        } 
    }); 
    

私のシェーダの制服を更新するために、うまくやっている場合、私は知らない私は、問題をデバッグすることができませんでしたし、より良いThreeJSよりを知っている誰かを願っています私はそれについて私に手がかりを与えることができます。

私は本当に私たちは、この問題を解決することを願って、私たちはThreeJSのコミュニティ全体にこの機能を提案することができるかもしれ;)

:あなたは、デバッグ容易にするために、私はrequestAnimationFrameのの呼び出しを延期

EDIT:以上を掘りした後、問題はどのように私は更新していますカスタム制服から来るかもしれません。そのうちの1つはmodelViewMatrixを使用してそれを逆にします。しかし、modelViewMatrixはWebGLRendererのレンダリング呼び出し中にのみ更新されるため、フレーム遅延はそこから来るかもしれません。 ThreeJSで他のユニフォームに依存しているユニフォームを更新するにはどうしたらいいですか?

答えて

1

誰かが同じ問題に遭遇した場合、答えは単独で見つけて、ここで説明します。

問題は、私はThreeJSによって提供さmodelViewMatrixを使用してmodelViewMatrixInverse制服を更新したことがあります。このユニフォームは、WebGLRendererのrender()メソッドの呼び出し中にのみ更新され、modelViewMatrixInverseは各レンダリングコールで1フレーム遅れました。だから、私のカスタムシェイダーは、ThreeJSのネイティブシェイダーより1フレーム遅れていたのです。