Как установить прозрачность альфа-канала p5.js в шейдере?

В p5.js (v1.9.0) я пытаюсь настроить очень простой шейдер, устанавливая альфа-канал некоторых фигур, чтобы увидеть прозрачность (перекрывающиеся фигуры должны выглядеть ярче). Весь код виден здесь:

https://editor.p5js.org/evilmandarine/sketches/WdqoaeEr7

Здесь используется версия 1.9.0 и прозрачности нет вообще. Похоже, что в версии 1.4.1 для альфа-канала по умолчанию установлено значение false. В этом примере использование альфа-канала версии 1.4.0 работает, однако последняя нарисованная фигура находится над первой; Я ожидал увидеть немного нижней формы, поскольку здесь есть некоторый уровень прозрачности:

https://editor.p5js.org/Kumu-Paul/sketches/9RMzCJwMX

У меня такое чувство, что я путаю p5 альфа-режим/режим наложения холста с режимом наложения WebGL/шейдер.

Вопрос: как включить прозрачность в версии 1.9.0, а также как установить режим наложения?
Как в моем примере показать результат, похожий на этот, но с использованием шейдера?

https://editor.p5js.org/evilmandarine/sketches/QjHsWotHV

См. минимальный воспроизводимый пример — код должен быть в самом вопросе, а не как внешняя ссылка, которая может исчезнуть со временем. Спасибо.

ggorlen 27.02.2024 23:57

@ggorlen Я знаю, но в этом случае в вопросе нужно разместить довольно много кода. Также иногда люди публикуют ссылку на проект GitHub, потому что публиковать полный MRE непрактично (например, проблема с узлом). Вам все равно нужен полный код?

evilmandarine 28.02.2024 09:19

Мне нужен минимально воспроизводимый пример :-). Это означает, что вам придется проделать некоторую работу, чтобы удалить все, что не имеет отношения к рассматриваемому вопросу, и удалить весь шум. Принятый вами ответ является минимальным, полным и работоспособным, а вопросы должны иметь код, аналогичный фрагменту. Без него непонятно, о чем вы спрашиваете. Спасибо.

ggorlen 28.02.2024 16:21
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
161
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Альфа-канал работает так же, как и в p5.js 1.9.0. Вот пример:

let shdr;

function setup() {
  createCanvas(windowWidth, windowHeight, WEBGL);
  shdr = createShader(vert, frag);
  noStroke();
}

function draw() {  
  background(255);
  
  orbitControl(2, 1, 0.1);
  
  shader(shdr);
  shdr.setUniform("uColor", [1, 0, 0]);
  push();
  translate(-100, 0, 0)
  cylinder(30, 50);
  pop();
  
  shdr.setUniform("uColor", [0, 0, 1]);
  push()
  translate(100, 0, 0)
  cylinder(30, 50);
  pop()
}

const vert = `
// Transformation matrices
uniform mat4 uModelViewMatrix;
uniform mat4 uProjectionMatrix;

attribute vec3 aPosition;
// P5 provides us with texture coordinates for most shapes
attribute vec2 aTexCoord;

// This is a varying variable, which in shader terms means that it will be passed from the vertex shader to the fragment shader
varying vec2 vTexCoord;

void main() {
  // Copy the texcoord attributes into the varying variable
  vTexCoord = aTexCoord;
  
        
  vec4 viewModelPosition = uModelViewMatrix * vec4(aPosition, 1.0);
  gl_Position = uProjectionMatrix * viewModelPosition;
}
`;

const frag = `
precision mediump float;

uniform vec3 uColor;


void main()
{
  gl_FragColor = vec4(uColor, 0.33);
}
`;
html, body {
  margin: 0;
  padding: 0;
  overflow: hidden;
}
<script src = "https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.9.0/p5.js"></script>

Здесь можно проследить несколько нюансов поведения:

  1. Порядок, в котором нарисованы объекты, имеет большое значение. Это связано с тем, что графический процессор выполняет тестирование глубины для каждого фрагмента (пикселя) и пропускает те, которые находятся за всем, что уже было нарисовано в этой позиции (независимо от альфа-уровня).
  2. Здесь нет неявного отсеивания задней грани, и то же правило применяется к порядку отрисовки (треугольники, нарисованные позади ранее нарисованных треугольников, не имеют никакого эффекта, но треугольники, нарисованные поверх треугольников, расположенных позади них, имеют эффект).

Мораль этой истории такова: если вы хотите использовать альфа-версию с p5.js WebGL, вам нужно управлять своими собственными треугольниками и контролировать порядок их рисования (от самого дальнего от камеры до ближайшего, возможно, пропуская треугольники, обращенные от камеры). камера).

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