Visual LabINTERACTIVE LEARNING
WGSL 接口 · CONCEPT BUILTIN

@builtin

标记着色器入口的系统输入或输出:输入值由 GPU/管线自动提供,输出值交给固定功能阶段;名称、阶段、方向与类型必须匹配规范。可用名称由 WGSL 枚举,不能自定义。

先抓住概念边界

@builtin 在完整技术链路中承担什么职责?

先确认它处理的对象、输入与输出,再顺着课程和相邻概念检查边界。

@builtin 完整取值表20 个名称均由 WGSL 规范预定义,不能自定义;展开后可按阶段、方向和类型核对。
可用值阶段 · 方向类型含义要求
vertex_index顶点 · 输入u32当前顶点编号;非索引绘制从 firstVertex 开始,索引绘制还会计入 baseVertex。核心
instance_index顶点 · 输入u32当前实例编号,从绘制命令的 firstInstance 开始。核心
clip_distances顶点 · 输出array<f32, N>到用户裁剪平面的有符号距离;N 最大为 8。clip_distances
position顶点输出 / 片元输入vec4<f32>顶点输出时是齐次裁剪空间位置;片元输入时是当前 framebuffer 位置。核心
front_facing片元 · 输入bool当前片元是否来自正面图元。核心
frag_depth片元 · 输出f32由片元着色器显式写出的深度值。核心
primitive_index片元 · 输入u32当前实例内已处理图元的编号;同一图元的所有片元取值一致。primitive_index
sample_index片元 · 输入u32当前 MSAA 样本编号,范围为 0 到 sampleCount - 1。核心
sample_mask片元 · 输入/输出u32输入时表示图元覆盖的样本;输出时可进一步关闭样本。核心
local_invocation_id计算 · 输入vec3<u32>当前 invocation 在所属工作组内的三维坐标。核心
local_invocation_index计算 · 输入u32工作组内按 x 最快、再 y、最后 z 展开的线性编号。核心
global_invocation_id计算 · 输入vec3<u32>当前 invocation 在整个 dispatch 网格中的三维坐标。核心
global_invocation_index计算 · 输入u32整个 dispatch 网格按 x、y、z 展开的线性编号。linear_indexing
workgroup_id计算 · 输入vec3<u32>当前工作组在 dispatch 网格中的三维坐标。核心
workgroup_index计算 · 输入u32当前工作组在 dispatch 网格中的线性编号。linear_indexing
num_workgroups计算 · 输入vec3<u32>本次 dispatch 在 x、y、z 三个维度启动的工作组数量。核心
subgroup_invocation_id计算 / 片元 · 输入u32当前 invocation 在线程子组中的编号。subgroups
subgroup_size计算 / 片元 · 输入u32当前线程子组中的 invocation 数量。subgroups
subgroup_id计算 · 输入u32当前工作组内的子组编号。subgroups + subgroup_id
num_subgroups计算 · 输入u32当前工作组包含的子组数量。subgroups + subgroup_id