You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WGSL中@builtin(position)工作机制疑问及着色器行为咨询

关于WGSL中@builtin(position)的工作机制与行为差异解答

核心结论

@builtin(position)在顶点阶段和片段阶段的语义完全独立,顶点输出的@builtin(position)不会被插值传递给片段输入的@builtin(position)——这是WGSL规范明确规定的行为,也是你遇到现象差异的根本原因。

规范定义的细节差异

根据WGSL规范§16内置变量的定义:

  • 顶点阶段的@builtin(position):是输出内置变量,用于传递顶点的齐次裁剪空间坐标。GPU仅将其用于光栅化的前置计算(透视除法、视口转换等),它的作用是告知GPU顶点在裁剪空间的位置,而非作为普通插值变量传递给片段阶段。
  • 片段阶段的@builtin(position):是输入内置变量,由GPU在光栅化完成后自动生成,代表当前片段在帧缓冲空间的位置。其中x/y为片段的像素坐标(范围通常为0到画布宽/高),z为深度值,w用于透视校正插值。这个值与顶点输出的@builtin(position)没有直接插值关联,不是顶点裁剪空间坐标的插值结果。

你的代码现象解释

  1. 使用@builtin(position)时的异常现象:
    你在顶点着色器中将NDC坐标直接赋值给@builtin(position),GPU用这个值完成了视口转换和光栅化,但片段阶段拿到的@builtin(position)是帧缓冲的像素坐标(而非NDC插值结果)。当你计算0.5*(1 + input.position_data[0])时,由于像素坐标远大于1,结果被GPU clamp到1,因此大部分区域呈现黄色(R=1、G=1);只有画布边缘的像素坐标极小,计算结果接近0或0.5,才会出现绿色/红色的边缘。

  2. 自定义location变量的正确表现:
    你定义的@location(0)变量other_position_data属于用户自定义插值变量,GPU会按照默认的平滑插值规则,对顶点输出的NDC坐标xy分量进行插值。因此片段阶段能拿到每个片段对应的插值后NDC坐标,最终渲染出预期的四角颜色线性渐变效果。

惯用写法说明

如果需要在片段阶段获取基于顶点位置插值后的坐标(如NDC坐标、局部空间坐标等),使用自定义@location变量传递是WGSL中的标准惯用写法。而片段阶段的@builtin(position)主要用于获取当前片段的屏幕像素位置,适合实现屏幕空间特效(如屏幕纹理采样、UI定位等),并非用于传递顶点位置的插值结果。

内容的提问来源于stack exchange,提问作者user2628206

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 09:20:43