Javascript和WebGL,外部脚本 [英] Javascript and WebGL, external scripts
问题描述
好奇;如何将我的webgl着色器放在外部文件中?
Just curious; How do I place my webgl shaders, in an external file?
目前我有;
<script id="shader-fs" type="x-shader/x-fragment">
#ifdef GL_ES
precision highp float;
#endif
void main(void)
{
gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
}
</script>
<script id="shader-vs" type="x-shader/x-vertex">
attribute vec3 aVertexPosition;
uniform mat4 uMVMatrix;
uniform mat4 uPMatrix;
void main(void)
{
gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);
}
</script>
在我的html标题中,如何从外部文件中链接? - 我尝试了通常的javascript方法;
In my html header, how do I link in this from an external file? - I tried the usual javascript approach;
<script type="text/javascript" src="webgl_shader.js"></script>
推荐答案
对于外部文件,您需要停止使用脚本标签。我建议使用 XMLHttpRequest 之类的内容。我还建议重命名你的文件,它们是着色器而不是Javascript所以使用不同的扩展名以避免混淆。我使用类似shiny_surface.shader的东西。
For external files, you need to stop using the script tag. I suggest using something like XMLHttpRequest. I would also suggest renaming your files, they are shaders not Javascript so use a different extension to avoid confusion. I use something like "shiny_surface.shader".
这就是我的工作:
function loadFile(url, data, callback, errorCallback) {
// Set up an asynchronous request
var request = new XMLHttpRequest();
request.open('GET', url, true);
// Hook the event that gets called as the request progresses
request.onreadystatechange = function () {
// If the request is "DONE" (completed or failed)
if (request.readyState == 4) {
// If we got HTTP status 200 (OK)
if (request.status == 200) {
callback(request.responseText, data)
} else { // Failed
errorCallback(url);
}
}
};
request.send(null);
}
function loadFiles(urls, callback, errorCallback) {
var numUrls = urls.length;
var numComplete = 0;
var result = [];
// Callback for a single file
function partialCallback(text, urlIndex) {
result[urlIndex] = text;
numComplete++;
// When all files have downloaded
if (numComplete == numUrls) {
callback(result);
}
}
for (var i = 0; i < numUrls; i++) {
loadFile(urls[i], i, partialCallback, errorCallback);
}
}
var gl;
// ... set up WebGL ...
loadFiles(['vertex.shader', 'fragment.shader'], function (shaderText) {
var vertexShader = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(vertexShader, shaderText[0]);
// ... compile shader, etc ...
var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fragmentShader, shaderText[1]);
// ... set up shader program and start render loop timer
}, function (url) {
alert('Failed to download "' + url + '"');
});
如果您使用的是像JQuery这样的库,它们可能具有与我的loadFiles类似的功能。
If you're using a library like JQuery, they probably have a function similar to my loadFiles one.
这篇关于Javascript和WebGL,外部脚本的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!