Access to gl.blendFuncSeparate

Hello,

I saw that we can set alphaMode on material or meshes. But I would need to set blendFuncSeparate to specific values:
gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA);

and

gl.blendFuncSeparate(gl.ZERO, gl.ONE_MINUS_SRC_ALPHA, gl.ZERO, gl.ONE_MINUS_SRC_ALPHA);

I’m wondering if I can have access to the gl context from babylon ? Thanks !

You can change all of them through engine.alphaState.setAlphaBlendConstants or engine.alphaState. …

Would that work for you ? it is what we use internally

Thanks ! This is what I’m looking for however changing them directly or using .setAlphaBlendConstants doesn’t seems to change anything in my render.

Just to give a bit of context, I’m having the black alpha problem (This is a pure blue) :
image
This is a plane with a renderTarget that has alpha. Solution for this in native is setting gl.blendFunc( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA );

But I can’t get the same on babylon

You should try to set it in mesh.onBeforeRenderObservable to ensure it does not get overriden by the mesh render function.

1 Like

It does not change anything either :frowning:

I’m trying to get this : WebGL, Blending, and Why You're Probably Doing it Wrong

Would be great if you could share a repro in the playground :slight_smile:

Hi ! Sorry for the delay.

I investigated a bit and found out the reason of the black border. I’m working with transparent scene. The clear color is affecting the alpha. So a scene clear color black will create those black value in the alpha. If i’m changing the color it will change it too. I think this is not correct as render and it should be considered as a bug. What do you think ?

Here a simple playground so you can see & test : https://www.babylonjs-playground.com/#2J05PG#1

I found the solution!

So on my mesh I have this :

mesh.onBeforeDrawObservable.add(_ => {
engine._alphaState.setAlphaBlendFunctionParameters( engine._gl.SRC_ALPHA, engine._gl.ONE_MINUS_SRC_ALPHA, engine._gl.ONE, engine._gl.ONE_MINUS_SRC_ALPHA )
})

And on the plane where there is the renderTarget I have this

plane.onBeforeDrawObservable.add(_ => {
engine._alphaState.setAlphaBlendFunctionParameters(engine._gl.ONE, engine._gl.ONE_MINUS_SRC_ALPHA, engine._gl.ONE, engine._gl.ONE_MINUS_SRC_ALPHA)
})

2 Likes