もう1つの答えは、単にGLSLコードを取得し、各行を文字列に変換することです。各文字列は配列内の値です。 join
呼び出しでは、すべての文字列を\n
文字で連結し、デバッグ時にコードを読みやすくします。私はこれまで何度もやったことがありますし、あなたがしようとしていることに対する正当な解決策です。
しかし、生のGLSLコードを使用して外部ファイルを作成したい場合は、そのようにすることもできます。
- glow_vertex.glsl
- glow_fragment.glsl
これらのファイルを使用すると、通常はスクリプトタグを持っているでしょうシェーダコードが含まれています2つのファイルを考えてみましょう。 XMLHTTPRequestを使用してファイルをフェッチし、返されたテキストをシェーダコードとして使用できます。
var vertexShader = null;
var fragmentShader = null;
function shadersDone(){
var material = new THREE.ShaderMaterial({
uniforms: { /* define your uniforms */},
vertexShader: vertexShader,
fragmentShader: fragmentShader
});
}
function vertexDone(code){
vertexShader = code;
if(fragmentShader !== null){
shadersDone();
}
}
function fragmentDone(code){
fragmentShader = code;
if(vertexShader !== null){
shadersDone();
}
}
var xhr1 = new XMLHttpRequest();
var xhr2 = new XMLHttpRequest();
xhr1.open("GET", "/server/glow_vertex.glsl", true);
xhr2.open("GET", "/server/glow_fragment.glsl", true);
xhr1.responseType = "text";
xhr2.responseType = "text";
xhr1.onload = function(){
if(xhr1.readyState === xhr1.DONE && xhr1.status === 200){
vertexDone(xhr1.resultText);
}
};
xhr2.onload = function(){
if(xhr2.readyState === xhr2.DONE && xhr2.status === 200){
fragmentDone(xhr2.resultText);
}
};
xhr1.send(null);
xhr2.send(null);
これはすべて非同期であることに注意してください。また、GLSLファイルをプレーンテキストとして送信するようにサーバーを設定する必要があります。
我々は近代的なウェブの話をしている限り
...
もimport
あなたのシェーダコードのオプションがあります。 VERY BIG現在のところ、ChromeとOperaでのみサポートされています(ただし、ポリフィルは存在します)。 Microsoft Edgeはこの機能を「検討中」としてリストしており、Firefoxは現在の状態で実装するためにインデントしていません。 JavaScriptの中で、後に続いて...
<link id="vertexImport" rel="import" href="/server/glow_vertex.glsl" />
<link id="fragmentImport" rel="import" href="/server/glow_fragment.glsl" />
をあなたのHTMLではhttp://caniuse.com/#search=import
、およびJavaScriptの前にそれを使用することになる。だから、塩の大粒で、以下のものを取る、とに目を離しません。
var material = new THREE.ShaderMaterial({
vertexShader: document.getElementById("vertexImport").import.body.childNodes[0].data,
fragmentShader: document.getElementById("fragmentImport").import.body.childNodes[0].data,
});
また、これは非同期です。リンクごとにonload
ハンドラを追加する必要があるかもしれないので、ロードする前にコードにアクセスしようとしないでください。
シェーダコードは文字列としてのみ必要なので、外部ファイルから文字列を取り込むことができる方法であれば使用できます。 – 2pha
私に例を教えてもらえますか? – ClassikD
私はシャオによって与えられた答えを編集しました – 2pha