Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Three.js и import файлов .glsl (https://javascript.ru/forum/misc/81319-three-js-i-import-fajjlov-glsl.html)

Biotoxsin 08.11.2020 23:57

Three.js и import файлов .glsl
 
Здравствуйте!

При попытке загрузить файл .glsl через import выдаёт такую ошибку
"Failed to load module script: The server responded with a non-JavaScript MIME type of "". Strict MIME type checking is enforced for module scripts per HTML spec."

Код загрузки:
import { ShaderMaterial, BackSide } from "../three/build/three.module.js";
import vertexShader from "./vertex.glsl";
import fragmentShader from "./fragments.glsl";


Подскажите, может знает кто, почему возникает эта ошибка и как её можно решить?

laimas 09.11.2020 01:11

В этом сообщении и указывается причина:

"Не удалось загрузить скрипт модуля: сервер ответил типом MIME, отличным от JavaScript. Для скриптов модуля в соответствии со спецификацией HTML применяется строгая проверка типов MIME."

Судя по сообщению, в качестве типа сервер вообще ничего не сообщает - пусто.

Biotoxsin 09.11.2020 01:32

Цитата:

Сообщение от laimas (Сообщение 530520)
В этом сообщении и указывается причина:

"Не удалось загрузить скрипт модуля: сервер ответил типом MIME, отличным от JavaScript. Для скриптов модуля в соответствии со спецификацией HTML применяется строгая проверка типов MIME."

Судя по сообщению, в качестве типа сервер вообще ничего не сообщает - пусто.

Именно. Вот я и не пойму причину почему нет типа. Может вы знаете как его можно указать в загрузке этих файлов?

laimas 09.11.2020 02:19

Цитата:

Сообщение от Biotoxsin
Вот я и не пойму причину почему нет типа

Ну так код сервера посмотреть, почему он не передает заголовков нужных.

MallSerg 09.11.2020 02:36

Шейдерные программы это не JavaScript поэтому их нельзя загрузить с помощью import.

По факту это просто текстовые данные которые передаются в API функцию браузера. А уже браузер передает их драйверу видеокарты который их компилирует для текущей видеокарты и выполняет.

Vlasenko Fedor 09.11.2020 12:41

MallSerg,
все правильно написал
в trree внешние ресурсы( текстуры, материалы) загружаем аяксом внешним запросом
далее, после загрузки , обрабатываем
или вставляем в тело документа
https://threejs.org/docs/#api/en/mat...ShaderMaterial
https://developer.mozilla.org/ru/doc...color_in_WebGL
<script id="shader-vs" type="x-shader/x-vertex">Код</script>

Biotoxsin 09.11.2020 12:56

Цитата:

Сообщение от laimas (Сообщение 530520)
В этом сообщении и указывается причина:

"Не удалось загрузить скрипт модуля: сервер ответил типом MIME, отличным от JavaScript. Для скриптов модуля в соответствии со спецификацией HTML применяется строгая проверка типов MIME."

Судя по сообщению, в качестве типа сервер вообще ничего не сообщает - пусто.

Цитата:

Сообщение от MallSerg (Сообщение 530523)
Шейдерные программы это не JavaScript поэтому их нельзя загрузить с помощью import.

По факту это просто текстовые данные которые передаются в API функцию браузера. А уже браузер передает их драйверу видеокарты который их компилирует для текущей видеокарты и выполняет.

В Three.js их загружают именно что через import. В точности как я указал в примере.

SuperZen 09.11.2020 13:09

Не понятно, где и когда загружается, и что используется... провангую )

https://discourse.threejs.org/t/how-...loader/10474/4

здесь смотреть raw-loader

https://webpack.js.org/loaders/raw-loader/

voraa 09.11.2020 13:26

Цитата:

Сообщение от Biotoxsin
В Three.js их загружают именно что через import. В точности как я указал в примере.

Примерчик киньте.
Даже если и случайно загрузится, то в vertexShader и fragmentShader точно ничего не будет.
Там могут быть только объекты, которые экспортируются из указанных модулей.

Biotoxsin 09.11.2020 14:16

Цитата:

Сообщение от SuperZen (Сообщение 530536)
Не понятно, где и когда загружается, и что используется... провангую )

https://discourse.threejs.org/t/how-...loader/10474/4

здесь смотреть raw-loader

https://webpack.js.org/loaders/raw-loader/

Примерчик:

index.js
import * as THREE from '/three/build/three.module.js';
import loadTexture from "/texture-loader.js";
import loadModel from "/model-loader.js";
import BackfaceMaterial from "/backface-material";
import RefractionMaterial from "/refraction-material";


backface-material index.js
import { ShaderMaterial, BackSide } from "../three/build/three.module.js";
import vertexShader from "./vertex.glsl";
import fragmentShader from "./fragments.glsl";


refraction-material index.js
import { ShaderMaterial } from "../three/build/three.module.js";
import vertexShader from "./vertex.glsl";
import fragmentShader from "./fragments.glsl";

SuperZen 09.11.2020 14:39

блин, нет ) только не это...
вопрос был, используется ли вебпак или что-то подобное... если import используется в <script module...> подразумевает что надо импортировать js файлы, а не текст или еще что-то... насколько я понял three.js хавает glsl в виде текста, по этому нужен raw-loader ))... пока гуглил ошибку из первого сообщения, я нагуглил так же несколько лоадеров конкретно для glsl... но это сути не меняет )...

итого, неизвестные: есть вебпак? а какой сервер? ... )

Biotoxsin 09.11.2020 15:35

Цитата:

Сообщение от SuperZen (Сообщение 530545)
блин, нет ) только не это...
вопрос был, используется ли вебпак или что-то подобное... если import используется в <script module...> подразумевает что надо импортировать js файлы, а не текст или еще что-то... насколько я понял three.js хавает glsl в виде текста, по этому нужен raw-loader ))... пока гуглил ошибку из первого сообщения, я нагуглил так же несколько лоадеров конкретно для glsl... но это сути не меняет )...

итого, неизвестные: есть вебпак? а какой сервер? ... )

Без вебпака, сервер Apache

SuperZen 09.11.2020 15:53

Цитата:

Сообщение от SuperZen
если import используется в <script module...> подразумевает что надо импортировать js файлы, а не текст или еще что-то..

тогда нужен https://webpack.js.org/, там на главной странице то, что поможет )... даже мудрить не надо особо, просто лоадер добавить...

если совсем будет туго с пониманием, можно этот туториал пройти
https://webpack.js.org/guides/getting-started/

MallSerg 09.11.2020 16:57

Цитата:

Сообщение от Biotoxsin (Сообщение 530535)
В Three.js их загружают именно что через import. В точности как я указал в примере.

Ты ошибаешься.

Three.js с помощью ключевого слова import загружает и подключает модуль который является самым обычным JavaScript как и положено делать директиве import.
А уже этот модуль на JavaScript возвращает строку (текст шейдера)
Как пример шейдер по умолчанию.

Код подключающий модули с шейдерными программами
https://github.com/mrdoob/three.js/b...derMaterial.js

Код в котором написан модуль с шейдерной программой
https://github.com/mrdoob/three.js/b...vertex.glsl.js

Если я правильно понял то ты пытаешься подключить шейдерные программы не организуя их как модуль JavaScript что приводит к ошибкам.

SuperZen 09.11.2020 18:59

Не совсем так, берем какой-то шейдер, например, https://github.com/mrdoob/three.js/b...h_vert.glsl.js
и видим там:
export default /* glsl */``


идем в package.json

там видим
"build": "rollup -c utils/build/rollup.config.js",

идем в https://github.com/mrdoob/three.js/b...llup.config.js

и на 204 строке видим ) как rollup парсит ast на предмет /* glsl */

-
Вывод: это не простой js файл...

----
p.s. хотя нет ) это простой js файл...


Часовой пояс GMT +3, время: 09:34.