【问题标题】:Libgdx blending contrast issue in render();render() 中的 Libgdx 混合对比度问题;
【发布时间】:2015-03-27 17:28:16
【问题描述】:

在 Libgdx 1.x Stage 中,我的目标是在我的屏幕上应用一个深色半透明蒙版,除了应该显示原始屏幕的区域。

我的全局渲染方法:

public void render() {
    Gdx.gl.glClearColor(0, 0, 0, 1);        
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
    batch.setShader(null); 
    update();
    stage.act(Gdx.graphics.getDeltaTime());     
    stage.draw();       

    batch.begin();      
    darkener.draw(batch, 0.7f);     
    spotlight.draw(batch, 1f);      
    batch.end();                
}

Darkener 和 Spotlight 对象的两个实例都是由纯白色 4x4 纹理制成的 Sprite:

spotlight = new Sprite(new Texture(Gdx.files.internal("data/ui/whitepixel.png")));

darkener = new Sprite(new Texture(Gdx.files.internal("data/ui/whitepixel.png")));

我将 Darkener 对象设置为屏幕大小,将 Spotlight 对象设置为我不想变暗的区域大小。

这是我的对象变暗器的绘制方法:

public void draw(Batch batch, float alpha) {        
    darkener.draw(batch, alpha);        
}

还有我的 Spotlight 对象的 draw 方法:

public void draw(Batch batch, float alpha) {
    batch.setBlendFunction(GL20.GL_DST_COLOR, GL20.GL_SRC_ALPHA);
    spotlight.draw(batch, alpha);
    batch.setBlendFunction(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
}

我的问题是关于混合: 带参数:

darkener.draw(batch, 0.7f);     
spotlight.draw(batch, 1f);  

保留的(聚光灯)区域比原始区域更暗。

带参数:

darkener.draw(batch, 0.3f);     
spotlight.draw(batch, 1f);  

保留的(聚光灯)区域比原始区域更亮(饱和)。

使用参数:

darkener.draw(batch, 0.5f);     
spotlight.draw(batch, 1f);  

保留的(聚光灯)区域与原始区域完全相同(所以,正如我想要的那样)。问题是我希望能够为我的 Darkener 设置不同的值 0.5f。

我做错了什么?

【问题讨论】:

    标签: libgdx rendering draw alphablending


    【解决方案1】:

    您用于聚光灯的混合函数采用当前像素亮度并将其乘以 (1+alpha)。

    因此,如果您将亮度调暗到 0.7(使用 0.3 的变暗器 alpha),您希望聚光灯将亮度乘以 1/0.7 = 1.429,因此您应该使用 0.429 的聚光灯 alpha。所以:

    spotlightAlpha = 1/(1-darkenerAlpha) - 1; //assuming darkener RGB is black
    

    问题是,如果您将亮度调暗到小于 0.5(较暗的 alpha > 0.5),因为 alpha 不能大于 1。您必须反复使用 alpha 1 运行聚光灯,直到亮度高于 0.5,然后再增加一个时间与适当的值。

    颜色越深,颜色精度就会下降,因此这种方法可能不适合。可能要考虑绘制 8 个暗框。如果您希望聚光灯是非矩形的,您可以将其 sprite 倒置以填充中间的矩形。

    【讨论】:

    • 嗨@Tenfour04,感谢您的回答。您对问题的原因绝对是正确的,但是您确定找到聚光灯所需的 alpha 的公式是 1/darkener alpha 吗?它从来没有给我想要的结果,但是通过调整值,我发现暗器 = 0.6、0.7 等的结果很好。另外,您能否详细说明一下绘制 8 个暗框?我觉得自己很笨,但我根本没听懂!感谢您的宝贵时间和好主意
    • 我认为这是对的,但我可能会遗漏一些信息。根据您上面的描述,变暗器实际上会使屏幕变暗,因为它会绘制一个半透明的白色矩形。我以为你把它弄黑了。实际上,我认为我可能会根据该假设将其倒置。我的意思是 8 个暗框:想象一个由 9 个框组成的数独网格,除了将其拉伸以适合您的屏幕,并移动内部线条以使中心框与聚光灯的大小相同。您可以在周围 8 个框的坐标上绘制暗器,在中心框上绘制聚光灯精灵。
    • 我刚刚意识到我的解释不清楚。 “变暗到 0.7”是指将其变暗到原始亮度的 70%,这就像使用 0.3 的变暗器 alpha,假设变暗器精灵是黑色的。所以聚光灯 alpha 的公式是 1/(1-darkenerAlpha) - 1
    • 您好@Tenfour,再次感谢您的 cmets 和建议。我明白了 9-1 盒子的想法,这是一个很好的想法。我也更好地理解了设置适量 alpha 的公式。再次感谢您的帮助和好主意,祝您度过愉快的一周
    猜你喜欢
    • 2023-03-17
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-25
    • 1970-01-01
    相关资源
    最近更新 更多