私は戻って、displacementMapによって置き換えられているメッシュをエクスポートしようとしています。displacement.mapによって置き換えられた修正されたメッシュをthree.jsで置き換えます
シェーダが( three.js/SRC /レンダラー/シェーダー/ ShaderChunk/displacementmap_vertex.glslから)このラインに従って頂点変換される:
transformed += normalize(objectNormal) * (texture2D(displacementMap, uv).x * displacementScale + displacementBias);
これは、displacementMapに従って頂点を変位さその頂点のuv座標と混合されます。
このメッシュ/ジオメトリを作成して、後でエクスポートできるようにしようとしています。
私はここでの問題の「デモ」を作成しました: Github Page 私はexportSTLを押すと上の、ビューポートに見られるように変位は、メッシュたいと思います。しかし、私は未配置の飛行機しか手に入れていません。
私はこれがなぜ起こるのか理解しています。変位はシェーダでのみ起こり、実際には平面のジオメトリを直接変位させるわけではありません。
three.jsで提供されているメソッドが見つかりませんでしたが、これまでシェーダから変更を取得する方法が見つかりませんでした。 私は "demo.js"の関数でそれをやろうとしています。 しかし、私はWebGL/three.jsの初心者であり、シェイダーが何をしているのかを再現するのに問題があります。
私は輸出業者がmorphTargetを扱っているのを発見しましたが、これは助けにはなりません。 this questionを読んだ後、Shaneerに近いのでPlaneBufferGeometryを試しましたが、これは私にとっては同じ結果をもたらします。 私はthis questionはもともと同様のものを作り出そうとしましたが、無関係な質問を受け入れました。
最後に、リアルタイムでテクスチャを更新するHTMLキャンバスを描画したいと思います(私はこの部分が動作しています)。ユーザーは、3次元印刷のためにメッシュをエクスポートすることができます。
シェイダーの変更されたジオメトリを私に与える方法はありますか? 誰かがシェイダーラインを "従来の" Three.js関数に変換するのを助けることができますか? これは、完全に間違った方法で、移動したメッシュを取得するのでしょうか?
更新 - 例は、もともとimersoにより示唆されるように、私は今、CPUの変位を計算することができDeeFisherから例に
感謝を進めています。 今すぐGithub Pageをクリックすると、実際の例が得られます。 現時点で私は最後に正しいキャンバスを得るためにキャンバスを鏡にしなければならない理由を完全に理解していませんが、これは最悪の場合です。
ありがとうございます。私はそれを見て、これまでのところ成功していません。 基本的なWebGL2に切り替えることなくthree.jsでやりたいと思います。私はあなたの提案でthree.js GLSLコードを変更しようとしています。私が実際にそれをやり遂げることができれば、私はそれを1つの時点で元に戻すことを望んでいます。 – Deadolus
WebGL1を使い続けるには、GPUに置き換えられた頂点を回復/保存する方法がないので、CPU内の変位テクスチャを読み返して頂点を移動させる唯一の賭けです。つまり、GLSLを使用せずに少なくともディスクに書き出すためには、CPU内の変位した頂点を持つことになります。 WebGL2では、変換された頂点を読み戻す方法である変換フィードバックがあるので、GLSLをそのまま使用して、変換フィードバックを使用して結果を得て、最後にディスクに書き出すことができます。 – imerso
提案した方法以外の方法はないように思われます。 Three.js devブランチはWebGL2レンダラーを開発中ですが、プライムタイムの準備がまだ整っていないようです。 https://ibiblio.org/e-notes/webgl/gpu/bounce.htmを見ると、WebGl2のTransformFeedbacksが問題を解決する良い方法になるはずです。とにかく助けてくれてありがとう。 – Deadolus