JS-как мне превратить это в модуль ES6?

Хорошо, я разбиваю пример ShaderGlow из https://github.com/stemkoski/stemkoski.github.com/blob/master/Three.js/Shader-Glow.html, пытаясь перенести его в свое приложение узла.

Автор делает все в тегах в html-документе, но все мое приложение находится в app.js и вызывает модули ES6 из вспомогательных файлов.

Шейдер до моей настройки работает так:

var customMaterial = new THREE.ShaderMaterial(
{
    uniforms:
    {
        "c":   { type: "f", value: 1.0 },
        "p":   { type: "f", value: 1.4 },
        glowColor: { type: "c", value: new THREE.Color(0xffff00) },
        viewVector: { type: "v3", value: camera.position }
    },
    vertexShader:   document.getElementById( 'vertexShader'   ).textContent,
    fragmentShader: document.getElementById( 'fragmentShader' ).textContent,
    side: THREE.FrontSide,
    blending: THREE.AdditiveBlending,
    transparent: true
}   );

Где фрагмент и вершинный шейдер находятся в своих собственных:

<!-- ---------------- Custom Shader Code ------------------------ -->
<script id = "vertexShader" type = "x-shader/x-vertex">
uniform vec3 viewVector;
uniform float c;
uniform float p;
varying float intensity;
void main() 
{
    vec3 vNormal = normalize( normalMatrix * normal );
    vec3 vNormel = normalize( normalMatrix * viewVector );
    intensity = pow( c - dot(vNormal, vNormel), p );

    gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
}
</script>

<!-- fragment shader a.k.a. pixel shader -->
<script id = "fragmentShader" type = "x-shader/x-vertex"> 
uniform vec3 glowColor;
varying float intensity;
void main() 
{
    vec3 glow = glowColor * intensity;
    gl_FragColor = vec4( glow, 1.0 );
}
</script>

До сих пор я пытался сделать:

import fragmentShader from './elements/GlowShaders.js';
import vertexShader from './elements/GlowShaders.js';

    var customMaterial = new THREE.ShaderMaterial(
    {
            uniforms:
        {
            "c":   { type: "f", value: 1.0 },
            "p":   { type: "f", value: 1.4 },
            glowColor: { type: "c", value: new THREE.Color(0xffff00) },
            viewVector: { type: "v3", value: this.camera.position }
        },
        vertexShader:  vertexShader,
        fragmentShader: fragmentShader,
        side: THREE.FrontSide,
        blending: THREE.AdditiveBlending,
        transparent: true
    }   );

С GlowShader.js написано так:

export default class vertexShader {
  uniform vec3 viewVector;
  uniform float c;
  uniform float p;
  varying float intensity;
  void main()
  {
      vec3 vNormal = normalize( normalMatrix * normal );
    vec3 vNormel = normalize( normalMatrix * viewVector );
    intensity = pow( c - dot(vNormal, vNormel), p );

      gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
  }
}

export default class fragmentShader {
  uniform vec3 glowColor;
  varying float intensity;
  constructor() {
    vec3 glow = glowColor * intensity;
      gl_FragColor = vec4( glow, 1.0 );
  }
}

Честно говоря, очень новичок в модулях, и это не работает. Как я могу разбить эти специальные блоки шейдера на модули или включить их в свой скрипт app.js?

Шейдеры — это отдельный язык. Они не JS. Это код, который выполняется на вашей видеокарте. Вы должны передавать скрипты шейдеров точно так же, как они есть, в three.js (в виде строк).

Thomas 21.07.2019 01:34

проверить шадертой

Thomas 21.07.2019 01:38

@ Томас, приятно знать. Как тогда я могу включить только текст? Учитывая, что я не работаю с тегами <script>?

blue 21.07.2019 01:46

Как поместить строку в некоторый код JS?

Thomas 21.07.2019 19:25

@Thomas Что мне просто вставить весь блок кода шейдера в кавычки после параметра «vertexShader:» в customMaterial?

blue 21.07.2019 19:37

да, но я бы либо использовал строки шаблона, либо использовал JSON.stringify() для правильной сериализации этой многострочной строки. Но это именно то, что делает vertexShader: document.getElementById( 'vertexShader' ).textContent. * Найдите узел скрипта с идентификатором "vertexShader", получите textContent этого узла и передайте этот текст свойству vertexShader

Thomas 21.07.2019 19:45

Можете ли вы предоставить ответ, где вы помещаете блок кода в JSON.stringify или другой формат, который может быть прочитан JS? Вставка прямо в параметр не работает, нет

blue 21.07.2019 21:51
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
7
197
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Can you provide an answer where you put the code block into JSON.stringify or another format able to be read by the JS? Pasting straight into the parameter doesn't work, no.

const vertexShader = `
uniform vec3 viewVector;
uniform float c;
uniform float p;
varying float intensity;
void main() 
{
    vec3 vNormal = normalize( normalMatrix * normal );
    vec3 vNormel = normalize( normalMatrix * viewVector );
    intensity = pow( c - dot(vNormal, vNormel), p );

    gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
}`;

const fragmentShader = `
uniform vec3 glowColor;
varying float intensity;
void main() 
{
    vec3 glow = glowColor * intensity;
    gl_FragColor = vec4( glow, 1.0 );
}`;

var customMaterial = new THREE.ShaderMaterial({
    uniforms:
    {
        "c":   { type: "f", value: 1.0 },
        "p":   { type: "f", value: 1.4 },
        glowColor: { type: "c", value: new THREE.Color(0xffff00) },
        viewVector: { type: "v3", value: camera.position }
    },
    vertexShader,
    fragmentShader,
    side: THREE.FrontSide,
    blending: THREE.AdditiveBlending,
    transparent: true
});

или

var customMaterial = new THREE.ShaderMaterial({
    uniforms:
    {
        "c":   { type: "f", value: 1.0 },
        "p":   { type: "f", value: 1.4 },
        glowColor: { type: "c", value: new THREE.Color(0xffff00) },
        viewVector: { type: "v3", value: camera.position }
    },
    vertexShader: "uniform vec3 viewVector;\nuniform float c;\nuniform float p;\nvarying float intensity;\nvoid main() \n{\n    vec3 vNormal = normalize( normalMatrix * normal );\n    vec3 vNormel = normalize( normalMatrix * viewVector );\n    intensity = pow( c - dot(vNormal, vNormel), p );\n\n    gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}",
    fragmentShader: "uniform vec3 glowColor;\nvarying float intensity;\nvoid main() \n{\n    vec3 glow = glowColor * intensity;\n    gl_FragColor = vec4( glow, 1.0 );\n}",
    side: THREE.FrontSide,
    blending: THREE.AdditiveBlending,
    transparent: true
});

Другие вопросы по теме