Libgdx fbo 背景透明度

Posted

技术标签:

【中文标题】Libgdx fbo 背景透明度【英文标题】:Libgdx fbo background transparency 【发布时间】:2017-06-21 22:08:08 【问题描述】:

我在 libgdx 的 FBO 上绘制东西。比我只想将具有透明背景的 fbo 绘制到我的屏幕上。但这总是黑色的。

是否可以在 spriteBatch 上使用透明背景?

尝试了很多东西,但看起来我无法完成这个简单的任务。

我创建了一个自定义着色器并且:

vec4 orig = texture2D(u_texture, tc);
if (orig.a==0.0) discard;

第一个 FBO 创建代码:

fbo = new FrameBuffer(Format.RGB565, width, height, hasDepth);

比:

public void begin() 
    fbo.begin();

    Gdx.gl.glClearColor(1.0f, 0.0f, 0.0f, 0f);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);


public void render() 
    renderIt();


private void renderIt() 
    spriteBatch.begin();
    spriteBatch.setShader(shader);
    spriteBatch.draw(fboRegion, 0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
    spriteBatch.end();


public void end() 
    Gdx.gl.glDisable(GLES20.GL_BLEND);
    fbo.end();

看起来着色器无法确定 FBO 的 alpha 值。为什么?我只需要清除 alpha=0.0 像素。

所以在我的着色器中,背景被剪掉了:

if (orig.r==1.0) discard;

这是有效的

if (orig.a==0.0) discard;

if (orig.a<0.2) discard;

if (orig.a<0.9) discard;

这不是

我的着色器看起来像这样

void main() 

    vec4 sum = vec4(0.0);
    vec2 tc = v_texCoord0;
    //the amount to blur, i.e. how far off center to sample from
    //1.0 -> blur by one pixel
    //2.0 -> blur by two pixels, etc.
    float blur = radius/resolution;
    //the direction of our blur
    //(1.0, 0.0) -> x-axis blur
    //(0.0, 1.0) -> y-axis blur
    float hstep = dir.x;
    float vstep = dir.y;

    sum += texture2D(u_texture, vec2(tc.x - 4.0*blur*hstep, tc.y - 4.0*blur*vstep)) * 0.0162162162;
    sum += texture2D(u_texture, vec2(tc.x - 3.0*blur*hstep, tc.y - 3.0*blur*vstep)) * 0.0540540541;
    sum += texture2D(u_texture, vec2(tc.x - 2.0*blur*hstep, tc.y - 2.0*blur*vstep)) * 0.1216216216;
    sum += texture2D(u_texture, vec2(tc.x - 1.0*blur*hstep, tc.y - 1.0*blur*vstep)) * 0.1945945946;
    sum += texture2D(u_texture, vec2(tc.x, tc.y)) * 0.2270270270;
    sum += texture2D(u_texture, vec2(tc.x + 1.0*blur*hstep, tc.y + 1.0*blur*vstep)) * 0.1945945946;
    sum += texture2D(u_texture, vec2(tc.x + 2.0*blur*hstep, tc.y + 2.0*blur*vstep)) * 0.1216216216;
    sum += texture2D(u_texture, vec2(tc.x + 3.0*blur*hstep, tc.y + 3.0*blur*vstep)) * 0.0540540541;
    sum += texture2D(u_texture, vec2(tc.x + 4.0*blur*hstep, tc.y + 4.0*blur*vstep)) * 0.0162162162;

    vec4 all = v_color * vec4(sum.rgb, 1.0);
    if (all.a < 0.9) discard;
    else gl_FragColor = all;


【问题讨论】:

也许只是通过测试orig.a &lt; 0.1 或其他东西来确保 alpha 确实为 0。由于某种原因,它可能非常接近于 0。 vec4 orig = texture2D(u_texture, tc); if (orig.a 【参考方案1】:

RGB565 格式没有 Alpha 通道。如果您需要透明度,请使用 ARGB8888 之类的格式

【讨论】:

更改为 rgba8888 和相同。有什么难处吗? 使用 glClearColor(0f, 0f, 0f, 0f);清除 FBO,使 FBO 一开始就透明【参考方案2】:

哈哈,我真是个白痴。

    vec4 all = v_color * vec4(sum.rgb, 1.0);
    if (all.a < 0.9) discard;
    else gl_FragColor = all;

这是 BAD 着色器(它的 alpha 始终为 1.0)

这是成功的:

vec4 all = sum;
if (all.a  < 0.5) discard;
else
    gl_FragColor = all;

【讨论】:

以上是关于Libgdx fbo 背景透明度的主要内容,如果未能解决你的问题,请参考以下文章

Vue设置背景色透明度字体不透明

怎么通过代码把图片的黑色背景变成透明的?

如何使DIV背景透明内容不透明

gis如何导出透明背景的图?

ps怎么把背景透明

设置div背景透明的方法?