Libgdx,使用 Shader 的 Alpha 文本不起作用

2023-12-23

我在使用舞台操作在文本(使用着色器)中应用 alpha 时遇到一些问题。我正在使用添加窗口演员和窗口添加标签演员的组。我组中的其他演员应用 Actions alpha 工作得很好,但我的标签(使用着色器绘制)不起作用,与其他小部件不同的是我的文本标签正在应用着色器。

字体片段 统一sampler2D u_texture;

varying vec4 v_color;
varying vec2 v_texCoord;

const float smoothing = 0.2;

void main() {
    float distance = texture2D(u_texture, v_texCoord).a;
    float alpha = smoothstep(0.5 - smoothing, 0.5 + smoothing, distance);
    gl_FragColor = vec4(texture2D(u_texture, v_texCoord).rgb, alpha);
}

字体.vert

uniform mat4 u_projTrans;

attribute vec4 a_position;
attribute vec2 a_texCoord0;
attribute vec4 a_color;

varying vec4 v_color;
varying vec2 v_texCoord;

void main() {
    gl_Position = u_projTrans * a_position;
    v_texCoord = a_texCoord0;
    v_color = a_color;
}

我的 Label 将标签从 Libgdx 扩展到应用着色器,

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.g2d.Batch;

public class Label extends com.badlogic.gdx.scenes.scene2d.ui.Label {
    boolean shaderActive = false;

    public Label(CharSequence text, LabelStyle style) {
        super(text, style);
        if(style.font.getScaleX() > 1f)
            shaderActive = true;
    }

    @Override
    public void draw(Batch batch, float parentAlpha) {
        if(shaderActive) {
            batch.setShader(Assets.assetFont.fontShader);
        }
        super.draw(batch, parentAlpha);
        batch.setShader(null);          
    }
}

工作代码

private void initStage() {
    // TODO Stage Here
    stage = new Stage();
    stage.setViewport(viewport);

    Window w2 = new Window("",
            new WindowStyle(Assets.assetFont.blackBoldVSmall, Color.BLACK,
                    new Image(Assets.assetHUD.windowFrame).getDrawable()) );
    w2.setSize(1200, 675);
    w2.setPosition(40, 0);
    Label lbl2 = new Label("Touch here to Jump !", new LabelStyle(Assets.assetFont.goldBoldNormal, Color.GRAY));
    lbl2.setPosition(Settings.width/2, Settings.height/2);
    w2.add(lbl2);
    groupTouchHere.addActor(w2);    
    stage.addActor(groupTouchHere); 

    // sequence of action
    SequenceAction sequence = new SequenceAction(
        Actions.fadeIn(0.4f, Interpolation.circleOut), 
        Actions.fadeOut(0.4f, Interpolation.circleIn));
    SequenceAction sequenceTotal = new SequenceAction(sequence, Actions.repeat(4, sequence));
    groupTouchHere.addAction(sequenceTotal);

}

public void update(float deltaTime){
    stage.act();
}

我不是着色器专家,但我已经以我认为简单的方式成功地完成了这项工作。 (我可能很困惑)。

在我的 java 代码中,我的 Main 函数中有一个变量保存 alpha 值(我只使用一个用于游戏状态转换):

public static float newAlph = 1;

在我的 *.vert 文件中,我声明了一个统一变量以将 alpha 作为输入,然后将其值设置为可变变量,以便 .frag 文件获取它。

...

uniform float u_newAlpha;
varying float v_newAlpha;

...

void main() {
    ...
    v_newAlpha = u_newAlpha;
}

然后在 .frag 文件中我声明相同的变化变量并简单地乘以 alpha。

...
varying float v_newAlpha;
...

void main() {
    ...
    gl_FragColor = vec4(v_color.rgb, alpha*v_newAlpha);
}

最后,当调用着色器时,我设置了 alpha 值(您可以在绘制方法的标签类中执行此操作)

sb.setShader(fontShader);
fontShader.setUniformf("u_newAlpha", Main.newAlph);

因此,即使正在渲染的其余所有内容的 alpha 正在更改,此着色器也会使用它所具有的 alpha 渲染您正在渲染的任何内容。

在我的中,我使用主类中的公共变量,但您的绘制方法将 alpha 作为输入,因此将其设置为 .vert 文件内的统一变量应该可以工作。

因此你会:

public void draw(Batch batch, float parentAlpha) {
        if(shaderActive) {
            batch.setShader(Assets.assetFont.fontShader);
        }
        Assets.assetFont.fontShader.setUniformf("u_newAlpha", parentAlpha);
        super.draw(batch, parentAlpha);
        batch.setShader(null);          
    }

让我知道这是否有意义!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Libgdx,使用 Shader 的 Alpha 文本不起作用 的相关文章

随机推荐

  • 如何在 MAUI 中添加自定义启动画面?

    我有一个基本的 MAUI 项目 我想将 SVG 文件设置为启动屏幕 我尝试使用以下代码修改 csproj 文件 As you can see the photo is cropped in a circle 如何让启动画面显示整张照片 你不
  • 死锁谜题:受害者不拥有任何资源,用于解决死锁

    我有一个奇怪的死锁图 其中 MSSQL Server 2008 选择的受害者不是死锁循环的一部分 这个僵局是在select and insert 死锁资源是一个表 其中所有selects want waitresource KEY 6 72
  • PHP 脚本中的 XSS 漏洞

    我一直在到处寻找 试图找到解决这个问题的方法 我最近在我们的网站上运行扫描 以查找任何 XSS 和 SQL 注入漏洞 有些项目引起了我的注意 用户输入的任何数据现在都使用filter var 进行验证和清理 我现在的问题是 XSS 和操纵
  • python 和 java api 的释放错误:未定义符号:_ZN5boost6system15system_categoryEv

    我在 Ubuntu 13 10 中安装了 freeling 并且尝试使用 python 或 java api 但每当我尝试执行以下操作时都会收到错误 matias matias IdeaPad U430 Touch Programas To
  • 在 MVC 中显示文件夹中的所有图像。与 foreach

    我想将我的文件夹 Images uploads 文件夹中的所有图片显示到 MVC 视图中 所以它显示在网站上 但似乎没什么作用
  • GWT (2.4.0) + XSRF

    我一直在尝试让 XSRF 在网络应用程序上运行 但没有成功 我正在研究一个典型的登录实现 我正在关注谷歌的代码 https developers google com web toolkit doc latest DevGuideSecur
  • 向工人发送数据

    我正在尝试创建一段并行代码来加速非常大 几亿行 数组的处理 为了并行化 我将数据切成 8 个 我的核心数 块 并尝试向每个工作人员发送 1 个块 然而 看看我的 RAM 使用情况 似乎每一块都发送给每个工作人员 有效地将我的 RAM 使用量
  • ServiceStack OnDeserialized 等效项

    我正在实时反序列化 websocket 消息 在我收到的消息 json 字符串 中 有一个 unix 时间戳 长 一旦每个对象被反序列化 我就需要它尽快调用一个方法 以便我可以捕获消息发送和接收时间之间的延迟 使用 Json NET 这很简
  • 如何对字典(在运行时)进行类型提示/类型检查以查找任意数量的任意键/值对?

    我定义一个类如下 from numbers import Number from typing import Dict from typeguard import typechecked Data Dict str Number typec
  • 缓慢/跳跃地调整大小

    我使用简单的渐变扩展 JComponent 并调整 PaintComponent 方法制作了自己的 BottomBar 然后我将它添加到使用 BorderLayout 的 JFrame 的南部 一切一开始看起来都是正确的 当我调整框架大小时
  • 如何在android中获取纬度和经度?

    android2 3 3中如何获取当前的经纬度 我尝试跟随this https stackoverflow com questions 2227292 how to get latitude and longitude of the mob
  • 当使用实体框架代码优先映射属性到单独的表时,移动外键字段

    使用代码优先 EF 映射表时遇到奇怪的问题 我有一个父类 Contract 与另一个类 Supplier 具有多对一关系 要求在合同实体中存储合同的扫描副本 为了避免每次都查询文档字节 我想将此属性存储在单独的表中 我可以让 EF 将 Co
  • 为什么我的“事件”总是空?

    我正在尝试连接一个新事件 但由于某种原因 更改 总是评估为空 public class MyTreeViewItem INotifyPropertyChanged private MyTreeViewItem parent public M
  • Windows 批处理中的 if/then/else 语句

    在 shell 脚本中我有以下代码 if echo Mr 32 then echo Success else echo Failed exit fi Windows 批处理文件的等效语法是什么 我很难想象 ECHO 何时会失败并返回 ERR
  • 将布尔值绑定到视觉状态

    我正在使用表达式混合 当列表框没有元素时 我想将文本框的状态更改为红色边框和红色文本 因此 当文本更改时 我会过滤列表框 private void OnIPAddressTextChanged object sender System Wi
  • 启动 docker 守护进程监听特定端口的正确方法

    我是 Docker 新手 希望以守护进程模式启动它 监听特定的 IP 地址和端口 在里面文档 https docs docker com reference commandline daemon 据说这可以通过写来完成sudo usr bi
  • 关于AMR音频文件在不同设备上播放的问题

    我这里遇到了一个很奇怪的问题 我正在开发一个IM软件 需要在Android上播放另一个客户端录制的音频文件 我得到的相同音频文件可以在 3GS IOS 4 2 1 设备和模拟器 4 2 上使用 AVAudioPlayer 播放 但是当我尝试
  • 如何在gmake中返回变量的第一个字符

    使用 GNU 的 make 我想提取变量的第一个字符 目前我正在使用 shell 函数bash执行子串 我想知道是否有办法使用 gmake 的内置函数来执行相同的操作 DIR user shell echo USER 0 1 USER 这不
  • ViewModel 在 Activity 之间共享数据

    我正在使用 android viewmodel 但我无法从另一个活动传递和访问活动视图模型的数据 我只能用片段来做到这一点 我应该使用像 EventBus 这样的库在几个活动之间共享数据吗 最佳实践是什么 None
  • Libgdx,使用 Shader 的 Alpha 文本不起作用

    我在使用舞台操作在文本 使用着色器 中应用 alpha 时遇到一些问题 我正在使用添加窗口演员和窗口添加标签演员的组 我组中的其他演员应用 Actions alpha 工作得很好 但我的标签 使用着色器绘制 不起作用 与其他小部件不同的是我