В 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
, а также как установить режим наложения?
Как в моем примере показать результат, похожий на этот, но с использованием шейдера?
@ggorlen Я знаю, но в этом случае в вопросе нужно разместить довольно много кода. Также иногда люди публикуют ссылку на проект GitHub, потому что публиковать полный MRE непрактично (например, проблема с узлом). Вам все равно нужен полный код?
Мне нужен минимально воспроизводимый пример :-). Это означает, что вам придется проделать некоторую работу, чтобы удалить все, что не имеет отношения к рассматриваемому вопросу, и удалить весь шум. Принятый вами ответ является минимальным, полным и работоспособным, а вопросы должны иметь код, аналогичный фрагменту. Без него непонятно, о чем вы спрашиваете. Спасибо.
Альфа-канал работает так же, как и в 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>
Здесь можно проследить несколько нюансов поведения:
Мораль этой истории такова: если вы хотите использовать альфа-версию с p5.js WebGL, вам нужно управлять своими собственными треугольниками и контролировать порядок их рисования (от самого дальнего от камеры до ближайшего, возможно, пропуская треугольники, обращенные от камеры). камера).
См. минимальный воспроизводимый пример — код должен быть в самом вопросе, а не как внешняя ссылка, которая может исчезнуть со временем. Спасибо.