Ваша проблема не вызвана предварительно умноженной альфой, как вы и думали.Проблема вызвана установленным вами атрибутом непрозрачности .alpha
.
graphic.alpha = 0.5;
Этот атрибут применяется (умножается) ко всем цветным каналам и альфа-каналу объекта.
Если вы не хотите, чтобы эти атрибуты влияли на красный, зеленый и синий цветовые каналы, вам нужно разделить каналы RGB на непрозрачность .alpha
в фрагментном шейдере:
varying vec2 vTextureCoord;
uniform vec4 uColor;
uniform float uAlpha;
uniform sampler2D uSampler;
void main(void) {
vec4 texColor = texture2D(uSampler, vTextureCoord);
gl_FragColor = vec4(texColor.rgb / uAlpha, 1.0);
}
См. Пример:
var app = new PIXI.Application(800, 600, {
backgroundColor : 0xcccccc,
transparent: 'notMultiplied',
});
document.body.appendChild(app.view);
var graphic = new PIXI.Graphics();
graphic.alpha = 0.5;
graphic.beginFill(0xff0000);
graphic.drawCircle(100,100,100);
graphic.endFill();
app.stage.addChild(graphic);
var mesh = new PIXI.mesh.Mesh( graphic.generateCanvasTexture() );
mesh.position.set(300,100);
app.stage.addChild(mesh);
app.renderer.plugins.mesh.shader = new PIXI.Shader(
app.renderer.gl,
`
attribute vec2 aVertexPosition;
attribute vec2 aTextureCoord;
uniform mat3 projectionMatrix;
uniform mat3 translationMatrix;
uniform mat3 uTransform;
varying vec2 vTextureCoord;
void main(void) {
gl_Position = vec4((projectionMatrix * translationMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);
vTextureCoord = (uTransform * vec3(aTextureCoord, 1.0)).xy;
}
`,
`
varying vec2 vTextureCoord;
uniform vec4 uColor;
uniform float uAlpha;
uniform sampler2D uSampler;
void main(void) {
vec4 texColor = texture2D(uSampler, vTextureCoord);
gl_FragColor = vec4(texColor.rgb / uAlpha, 1.0);
}
`
);
app.render();
<script src="https://cdnjs.cloudflare.com/ajax/libs/pixi.js/4.8.2/pixi.min.js"></script>