Skip to content

SDF 2D 图形系统 >=26.1

dev.anvilcraft.lib.v2.rendering.sdf 提供了一套基于有符号距离场(Signed Distance Field)的 2D 图形渲染系统。通过 GPU UBO 传输参数,支持 7 种图形类型和填充/发光两种渲染 Pass。

SdfGraphics

核心入口类,提供流式 Builder API。全局单例通过 SdfGraphics.getInstance() 获取。

图形绘制方法

所有方法返回 this 支持链式调用,每个方法设置当前参数状态,调用 draw(graphics) 提交渲染。

方法参数说明
box(x, y, w, h)位置 + 尺寸矩形
circle(x, y, radius)中心 + 半径圆形
arc(x, y, radius, startAngle, arcLength)中心 + 半径 + 起始角 + 弧长弧形
sector(x, y, radius, startAngle, arcLength)中心 + 半径 + 起始角 + 弧长扇形环
pie(x, y, radius, startAngle)中心 + 半径 + 起始角饼形
capsule(x, y, w, h, radius)中心 + 宽 + 高 + 圆角半径胶囊形
egg(x, y, radiusTop, radiusBottom, height)中心 + 上半径 + 下半径 + 高蛋形

样式方法

方法说明
color(int argbHex)设置颜色(ARGB)
rotate(float degrees)设置旋转角度(度,自动 wrap 到 0-360)
center(boolean)是否以中心为锚点
stroke(int width)设置描边宽度(0=填充, >0=描边)
round(float radius)设置圆角半径(≥0)
fill()设置填充 Pass(默认)
light(int)设置发光 Pass
reset()重置参数为默认值
onion(boolean)启用中空描边模式

碰撞检测

java
// 判断点 (mouseX, mouseY) 是否在 SDF 距离阈值内
boolean hit = SdfGraphics.getInstance().collide(mouseX, mouseY, threshold);

复制与重置

java
// 复制当前参数状态(创建新的 SdfGraphics 实例)
SdfGraphics copy = SdfGraphics.getInstance().cache();

// 重置参数为默认值
SdfGraphics.getInstance().reset();

// 刷新全局状态(重置参数 + 清零 UBO 索引)
SdfGraphics.flush();

使用示例

java
// 获取全局实例
SdfGraphics sdf = SdfGraphics.getInstance();

// 绘制填充圆角矩形
sdf.box(100, 50, 200, 80)
   .color(0xFFFF4080)
   .round(10)
   .draw(graphics);

// 绘制描边圆形
sdf.circle(200, 150, 60)
   .color(0xFF4080FF)
   .stroke(4)
   .draw(graphics);

// 绘制发光矩形
sdf.box(300, 100, 150, 60)
   .color(0xFFFFC832)
   .light(8)
   .draw(graphics);

// 帧结束时刷新
SdfGraphics.flush();

SdfRenderType

java
public enum SdfRenderType {
    BOX, CIRCLE, ARC, SECTOR, PIE, CAPSULE, EGG
}

SdfPassType

java
public enum SdfPassType {
    FILL,   // 填充渲染
    LIGHT   // 发光渲染
}

SdfParameters

UBO 参数类,继承 UboObject<SdfParameters>。通过 SdfGraphics 的 Builder 方法设置,内部通过 GPU UBO 传输到着色器。

布局定义 (STD140)

字段类型分量说明
sharedParamsvec4smooth, stroke, round, light共享样式参数
shapeParamsvec4x, y, z, w图形特定参数
rectvec4x, y, width, height包围矩形
typeParamsivec4pass, renderType, onion, _类型控制参数

reset()

重置所有参数为默认值(零向量、白色、零旋转、非居中)。

Sdf2d

工具类 (@UtilityClass),包含 9 个核心 SDF 数学函数:

函数说明
sd(parameters, x, y)主分发函数,根据 RenderType 选择具体 SDF
sdRect(px, py, bx, by)矩形 SDF
sdCircle(px, py, r)圆形 SDF
sdArc(px, py, scx, scy, ra, rb)弧形 SDF
sdRing(px, py, nx, ny, r, th)扇形环 SDF
sdPie(px, py, cx, cy, r)饼形 SDF
sdUnevenCapsule(px, py, r1, r2, h)不等径胶囊形 SDF
sdEgg(px, py, he, ra, rb)蛋形 SDF

内部渲染流程

SdfGraphics.box().color().round().draw(graphics)
  → SdfParameters 设置对应的 Vector4f/Vector4i 分量
  → _draw() 函数:
    1. 计算扩展尺寸 (round + stroke) * 2
    2. 构建 Matrix3x2f 变换(平移 + 旋转 + 缩放)
    3. 通过 UBO offset 写入 SdfParameters
    4. 创建 RenderState (实现 LibGuiElementRenderState)
    5. 通过 graphics.submitGuiElementRenderState() 提交
    6. 着色器通过 ALRPipelines.SDF_GRAPHICS 管线渲染

容量限制

  • 全局 UBO 缓冲区大小: SDF_PARAMETER_SIZE * 256 = 16 * 16 * 256 = 65536 字节
  • 每帧最多 256 个 SDF 绘制调用
  • 每帧结束时应调用 SdfGraphics.flush() 重置索引计数器

注意事项

  • SDF 渲染依赖 ConfigureMainRenderTargetEvent 初始化 GPU 资源(UBO、CommandEncoder)
  • 渲染通过 ALRPipelines.SDF_GRAPHICS 管线,无需纹理绑定(TextureSetup.noTexture()
  • stroke(0) 为填充模式,stroke(>0) 为描边模式
  • 颜色使用 ARGB 格式,color(int) 接受 0xAARRGGBB

Released under the CC-BY-NC-SA 4.0 License.