LiquidGlass UI 2.4.5 / SDK

2.4.2 · 实时 LiquidGlass 设置与网格背景

展示程序入口

九个展示页面的右上角都有 LiquidGlass 设置。点击后打开非模态的可拖动窗口,可以一边调整,一边点击其他控件观察效果。关闭、重新打开、切换分类不会重置数值;切换浅色/深色外观也保留材质参数、AA、字体和曲线设置。

也可在命令面板(Ctrl+K)搜索“LiquidGlass 设置”“背景网格”或“背景动画”。设置内有实际生效的背景模糊、网格背景和背景动画开关。菜单示例中的“显示网格”不再是只写日志的演示回调,而是控制同一个背景开关。

启动时直接显示面板和网格:

java -jar jdk8/demo/liquidglass-ui-demo-jdk8.jar --material-settings --grid
java -jar jdk21/demo/liquidglass-ui-demo-jdk21.jar --material-settings --grid

--no-animation 现在是初始暂停状态;在设置中可以重新开启。暂停冻结在当前背景帧,不会跳到时间零点。背景动画与控件交互动画独立,暂停背景不会取消按钮回弹或滑杆跟随。

所有数值都绑定真实渲染参数

参数范围含义
模糊 sigma0~32Gaussian 标准差,单位为实际 framebuffer 像素;0 跳过模糊
模糊混合比例0~1清晰/模糊背景的混合权重;不是 sigma 的缩放
折射强度0~30屏幕空间边缘折射程度,不是玻璃的物理折射率 IOR
边缘高光0~1.5轮廓反射强度,默认 .82;0 关闭高光及光学阴影,不改变色散
RGB 色散0~2单通道轮廓偏移,逻辑像素,默认 .85;0 关闭通道分离
材质 tint0~1玻璃自身着色比例,不新增覆盖底板
表面不透明度0~1最终合成 alpha,默认 1;降低时可能重新露出清晰背景
选中 tint 增量0~1在选中态增加材质 tint,不恢复选中描边

每项既有连续滑杆,也有左减/右加的横向数值编辑器。模型即时生效,位移/数字过渡动画只影响视觉显示。可以直接编辑精确数值。程序直接修改 theme 后,设置面板在下一次布局时同步;正在输入的数值不会在键入中途被重写。

关闭“背景模糊”会记住当前非零 sigma,再设为 0;重新开启会恢复所记数值,而不是强制设回 18。把模糊混合比例设为 0,则该表面仍然使用清晰采样,这是另一种独立控制。

“通透”“柔和”“低反光”及“恢复默认”仅影响材质参数,不清空自定义配色、四角曲线、字体、AA 或网格设置。数值保存在当前 Ui 的内存状态中,退出后不会自动写入磁盘。

为什么之前拖动折射滑杆后半段看不出变化

2.4.1 的 shader 使用 min(strength, bevel * 0.80)。普通小圆角控件的 bevel 较小,因此输入值远未到滑杆上限,就已经触及相同的位移上限。界面数值变了,但采样位置没有继续变。

2.4.2 改为连续、有界的响应:

float refraction = (1.0 - exp(-max(optics.x, 0.0) / 12.0)) * bevel * 0.80;

这样 0~30 的后半段仍能改变实际边缘像素;边缘位移仍受到 bevel 限制,不恢复大幅全控件位移、错位白圈或强烈闪光。这也不是物理折射率模型。真实 GPU 回读测试分别比较 0→10、10→20 和 20→30 的像素,三段均有变化。

直接从 API 调整

原有 public theme 字段保留;同时提供带数值范围检查的 fluent 方法:

ui.theme()
    .sigma(18f)
    .blur(.98f)
    .refraction(16f)
    .shine(.82f)
    .dispersion(.85f)
    .tint(.20f)
    .opacity(1f)
    .selectedTint(.18f);

ui.background().grid(true).animated(false);

Theme.tint(float) 是着色强度;既有 Theme.tint(int) 是 ARGB 着色颜色,二者类型不同。相关属性只在渲染/Ui 线程修改;跨线程更新使用 ui.post(...)。

复用设置界面

GlassSettingsDialog dialog = new GlassSettingsDialog();
button.onClick(w -> dialog.open(ui));

这是本库绘制的非模态窗口,不创建第二个系统窗口或 OpenGL context。

也可使用 GlassSettingsPanel 嵌入现有容器。它默认没有额外玻璃底板,宽度足够时双列,否则单列;通过 preferredHeight(width) 得到内容高度。空间不足时放进 ScrollPane。它保持 16 的容器留白和 12 的同级间距规则;内部参数行共用等宽布局。

完整可编译用法见 examples/MaterialControls.java。该例和原有 11 个例子都随两种目标的库重新编译。

宿主 OpenGL 接入的边界

ui.theme() 中的材质参数参与正常 NativePainter 提交,在宿主模式同样有效。sigma 仍需按照既有方式传入 painter.flush(..., ui.theme().sigma, ...)。

ui.background() 的网格/动画是独立窗口背景设置。附带 DesktopWindow 会读取并绘制它们;attachCurrentContext() 模式下不会擅自覆盖宿主已经画好的 3D 场景。宿主若要显示网格,需要读取这些设置并画自己的背景。

本次未改动 native 调用协议、Windows WGL 生命周期或贝塞尔裁剪实现。Native 协议仍为 24164;新的 glass shader 与 Java/文档已一起打包。

本次实际窗口截图

深色设置与网格 · 浅色设置与网格。图片由实际 OpenGL 窗口生成。

2.4.3 更新:真实可见的高光与色散

默认高光 .82、色散 .85。通透预设使用 1.00 / 1.20,柔和预设使用 .65 / .65,低反光预设使用 .35 / .35;恢复默认重新读取当前深浅色主题的默认值。关闭任一效果仍可直接将其参数设为 0,不会强制重新开启。

色散的色度差来自清晰背景,基底亮度仍由 Gaussian 模糊结果决定。它不会因 sigma 变大而一起消失,也不会把控件中心变成清晰背景。浅色高光增加受控的相反方向环境反射,以保留对比;没有新增选中边框。完整算法与适用边界见 高光与色散。

2.4.5:三种固定参数模板

开关下方新增独立的“材质模板”一行:Morden、LiquidGlass、Normal。它们不取代原来的四个预设。数值表、模板 API、sigma=0 时的行为以及完整示例见 材质模板。所有按钮根据可用宽度换行,面板测量高度包含新增行,滚动和弹窗高度也同步更新。