короче, я всё починил. как и всегда с WebGL - я нихуя не понял, просто как макака перебрал варианты, и один из них сработал.
Читать полностью…
this.gl.blendFuncSeparate(
this.gl.SRC_ALPHA,
this.gl.ONE_MINUS_SRC_ALPHA,
this.gl.ONE,
this.gl.ONE_MINUS_SRC_ALPHA,
);
то есть каким-то образом альфа с текстуры просачивается в альфу фреймбуффера. но почему-то не вся, а именно > 0 && < 1
Читать полностью…Было такое, нужна настройка webgl контекста - premultiplied alpha = true, (возможно еще alpha = true), текстура должна грузиться из png, в шейдере нужна строчка colorV3 /= textureColorV4.a; в настройках блендинга gl.blendFunc(this.gl.SRC_ALPHA, this.gl.ONE_MINUS_SRC_ALPHA); Это все для webgl 1.0 формата канваса. Сам шейдер для примера (не ржать, я новичок)
#include chunks/precision.glsl;Читать полностью…
uniform sampler2D u_textureS2D;
...
varying vec2 v_uvV2;
...
void main() {
...
vec4 textureColorV4 = texture2D(u_textureS2D, v_uvV2);
float alpha = textureColorV4.a * u_alpha;// alpha
if (alpha <= 0.01) {
discard;
}
vec3 colorV3;
... тут эффекты всякие
colorV3 = textureColorV4.rgb;
... тут эффекты всякие
colorV3 /= textureColorV4.a;// fix premultiplied alpha
gl_FragColor = vec4(colorV3, alpha);
}
если что, экстеншены тоже включены:
Читать полностью…
this.gl.getExtension('EXT_color_buffer_float');
this.gl.getExtension('EXT_float_blend');
this.gl.getExtension('OES_texture_float_linear');
на всякий случай, ещё раз - когда рендерю на канвас - проблем 0, проблема точно не в картинке самой
Читать полностью…вообще у меня кода кот наплакал, сейчас уже спать хочу, но завтра могу прям собрать минимальный пример строк на 20, который эту ошибку воспроизводит
Читать полностью…упростил пример до предела
1. делаю clear канвасу красным непрозрачным цветом
2. делаю clear фреймбуфферу черным непрозрачным цветом
3. рисую png картинку во фреймбуффер элементарнейшим шейдером вида gl_FragColor = texture(image, v_texCoord)
4. рисую фреймбуффер на канвас тем же самым шейдером
результат:
с прозрачностью заморочек много
https://webglfundamentals.org/webgl/lessons/ru/webgl-and-alpha.html
там 3 части - подложка, картинка, и вот этот вот растушеванный край. он используется для плавного перехода между подложкой и картинкой - то есть рендерится последним из трех
Читать полностью…color attachment у фреймбуффера вот такой: this.gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA32F, width, height, 0, gl.RGBA, gl.FLOAT, null);