L'autre réponse fournie consiste simplement à prendre du code GLSL et à transformer chaque ligne en une chaîne. Chaque chaîne est une valeur dans un tableau. L'appel join
concatène toutes les chaînes avec un caractère \n
pour faciliter la lecture du code lors du débogage. Je l'ai fait de cette façon plusieurs fois auparavant, et c'est une solution légitime à ce que vous essayez de faire. Mais si vous préférez avoir des fichiers externes avec du code GLSL brut, vous pouvez également le faire. Considérons les deux fichiers:
- glow_vertex.glsl
- glow_fragment.glsl
Ces fichiers contiennent le code de shaders que vous auriez normalement dans les balises de script. Vous pouvez utiliser un XMLHTTPRequest pour récupérer les fichiers et utiliser le texte renvoyé comme code de shader.
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);
Notez que tout cela est asynchrone. En outre, votre serveur devra être configuré pour envoyer des fichiers GLSL en texte brut.
Tant que nous parlons du web moderne ...
Il y a aussi la possibilité de import
votre code shader. TRÈS GRAND MAIS Actuellement, il est seulement supporté par Chrome et Opera (bien qu'il existe des polyfills). Microsoft Edge répertorie la fonctionnalité comme "sous examen", et Firefox ne pas indenter pour l'implémenter dans son état actuel. Alors, prenez ce qui suit avec un gros grain de sel, et de garder un oeil sur: http://caniuse.com/#search=import
Dans votre code HTML, et avant le JavaScript qui l'utiliser ...
<link id="vertexImport" rel="import" href="/server/glow_vertex.glsl" />
<link id="fragmentImport" rel="import" href="/server/glow_fragment.glsl" />
Puis, plus tard dans votre JavaScript:
var material = new THREE.ShaderMaterial({
vertexShader: document.getElementById("vertexImport").import.body.childNodes[0].data,
fragmentShader: document.getElementById("fragmentImport").import.body.childNodes[0].data,
});
De nouveau, ceci est asynchrone. Vous devrez peut-être ajouter un gestionnaire onload
pour chaque lien, de sorte que vous n'essayez pas d'accéder au code avant qu'il ne soit chargé.
Vous avez seulement besoin du code de shader sous forme de chaîne, donc tout moyen permettant d'introduire une chaîne à partir d'un fichier externe pourrait être utilisé. – 2pha
Pouvez-vous me montrer un exemple s'il vous plaît? – ClassikD
J'ai édité la réponse donnée par Shao – 2pha