Урок посвящен постпроцессингу и шейдерам в Three.JS, демонстрируя их применение для создания визуальных эффектов. Для практической работы рекомендуется использовать ресурсы с кодом и домашними заданиями (ссылка на урок будет доступна в описании).
Постпроцессинг
Постпроцессинг добавляет визуальные эффекты к проекту, накладывая их на основную камеру. Эффекты применяются ко всем объектам сцены, включая размытие, подсвечивание, отблески и другие.
Для работы с постпроцессингом установите библиотеку @types/three:
- Остановите запущенный сервер (Ctrl+C).
- Установите библиотеку: npm install @types/three
- Запустите сервер: npm run dev
Импортируйте необходимые классы:
import EffectComposer from './postprocessing/EffectComposer.js';
import RenderPass from './postprocessing/RenderPass.js';
import UnrealBloomPass from './postprocessing/UnrealBloomPass.js';
Создайте постпроцессинг:
// Post process
const renderPass = new RenderPass(scene, camera);
const bloomPass = new UnrealBloomPass(
new THREE.Vector2(window.innerWidth, window.innerHeight),
1.5, // Сила свечения
0.4, // Радиус размытия
0.85 // Порог свечения
);
const composer = new EffectComposer(renderer);
composer.addPass(renderPass);
composer.addPass(bloomPass);
// Вместо renderer.render(...)
composer.render();
В коде:
- renderPass отрисовывает сцену.
- bloomPass добавляет эффект свечения (размытия). Параметры (сила, радиус, порог) настраиваются.
- EffectComposer объединяет renderPass и эффекты.
- composer.render() заменяет renderer.render() для применения эффектов.
После обновления страницы отобразится эффект свечения. Большое количество эффектов может снизить производительность из-за высокого потребления оперативной памяти.
Шейдеры
Шейдеры – специальные программы, управляющие отображением объектов на экране. Они работают на уровне графического процессора, обеспечивая более тонкий контроль внешнего вида объектов, чем стандартные материалы Three.JS.
Существуют два основных типа:
- Вершинный шейдер (Vertex Shader): Управляет положением вершин объекта.
- Фрагментный шейдер (Fragment Shader): Управляет цветом каждого пикселя.
Пример простого шейдера для куба:
// Vertex shader
const vertexShader = `
uniform vec3 color;
varying vec3 vPosition;
void main() {
vPosition = position;
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
}
`;
// Fragment shader
const fragmentShader = `
uniform vec3 color;
varying vec3 vPosition;
void main() {
gl_FragColor = vec4(vPosition * 0.5 + 0.5, 1.0);
}
`;
const shaderMaterial = new THREE.ShaderMaterial({
vertexShader,
fragmentShader,
});
const cube = new THREE.Mesh(new THREE.BoxGeometry(), shaderMaterial);
scene.add(cube);
В примере:
- vertexShader передает позицию вершины в переменную vPosition.
- fragmentShader использует vPosition для определения цвета каждого пикселя, создавая эффект радуги.
- THREE.ShaderMaterial применяет шейдер к объекту.
Пример демонстрирует базовый принцип работы с шейдерами. Создание сложных шейдеров требует глубокого понимания GLSL.
Постпроцессинг и шейдеры позволяют создавать впечатляющие визуальные эффекты в Three.JS. Несмотря на сложность работы с шейдерами, основы их применения доступны для изучения и использования.