Для внешних файлов вам необходимо прекратить использование тега сценария. Я предлагаю использовать что-то вроде XMLHttpRequest. Я бы также предложил переименовать ваши файлы, они шейдеры, а не Javascript, поэтому используйте другое расширение, чтобы избежать путаницы. Я использую что-то вроде «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 один.
Возможный глупый вопрос, но почему бы не использовать теги скриптов? Кроме того, как этот метод дает идентификаторы шейдерным файлам (например, «shader-fs»)? –
MonkeyD
+2
'.glsl' является стандартным расширением –
Parobay
+0
@MonkeyD Нет ничего плохого в использовании тегов'
Извините, но нет. Используя этот метод, я получаю непредвиденную ошибку EOF, даже если найден файл, указанный в части 'src' (код состояния 200). –
appas
+2
Это связано с тем, что методы, используемые для получения текста сценария, работают на уровне DOM, и он просто видит пустой тег сценария. Он не знает ничего конкретного о значении атрибута «src» в теге скрипта. –
Update 2: Как < и & в источнике шейдерного должны быть экранированы, чтобы загрузить в качестве XML, это работает все время, даже если вы используете менее чем Comparision или и логические операторы:
Он позволяет загружать шейдеры из URL-адресов и кеширования исходного кода шейдеров для будущих посещений сайта. Это также упрощает использование униформы.
Возможный глупый вопрос, но почему бы не использовать теги скриптов? Кроме того, как этот метод дает идентификаторы шейдерным файлам (например, «shader-fs»)? – MonkeyD
'.glsl' является стандартным расширением – Parobay
@MonkeyD Нет ничего плохого в использовании тегов'
Я не гуру WebGL, но это работает?
источник
2011-02-08 00:53:52
Извините, но нет. Используя этот метод, я получаю непредвиденную ошибку EOF, даже если найден файл, указанный в части 'src' (код состояния 200). – appas
Это связано с тем, что методы, используемые для получения текста сценария, работают на уровне DOM, и он просто видит пустой тег сценария. Он не знает ничего конкретного о значении атрибута «src» в теге скрипта. –
soooo broken :( – Nils
Я была такая же проблема и обнаружил, что это работает для меня с JQuery:
Где
shader.fs
иshader.vs
мои шейдеры (и включают<script type="x-shader/x-fragment">
и<script type="x-shader/x-vertex">
декларации линий)Обновление С Chro меня разумная догадка не выбирает «xml». Следующий код работает в Chrome, а также:
Update 2: Как
<
и&
в источнике шейдерного должны быть экранированы, чтобы загрузить в качестве XML, это работает все время, даже если вы используете менее чем Comparision или и логические операторы:источник
2011-09-19 01:15:36
Хотя ' dataType: «html'' работает нормально, лучше использовать' dataType: 'text'', поскольку исходный код шейдера не является HTML. – TachyonVortex
Вы можете использовать с открытым исходным кодом шейдера управляющей библиотекой, как у меня:
https://github.com/ILOVEPIE/Shader.js
Он позволяет загружать шейдеры из URL-адресов и кеширования исходного кода шейдеров для будущих посещений сайта. Это также упрощает использование униформы.
источник
2013-11-24 21:05:12 ILOVEPIE