在
p5.js (v1.9.0)
中,我尝试设置一个非常基本的着色器,设置某些形状的 Alpha 通道以查看透明度(重叠的形状应该显得更亮)。整个代码在这里可见:
https://editor.p5js.org/evimandarine/sketches/WdqoaeEr7
这使用了版本
1.9.0
并且完全没有透明度。看起来 alpha 通道在版本 1.4.1
中默认设置为 false。在此示例中,使用版本 1.4.0
alpha 通道可以工作,但是最后绘制的形状位于第一个形状之上;我希望看到一些底部形状,因为有一定程度的透明度:
https://editor.p5js.org/Kumu-Paul/sketches/9RMzCJwMX
我有一种感觉,我正在混淆
p5
画布 alpha/混合模式与 WebGL/着色器混合模式。
问题是如何在版本
1.9.0
中启用透明度以及如何设置混合模式?Alpha 通道与 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 中使用 alpha,那么你需要管理自己的三角形并控制它们的绘制顺序(从距离相机最远到最近,可能会跳过背向的三角形)来自相机)。