金属着色语言 - FragCoord的等效物?

3

我尝试将这个shadertoy场景翻译成Metal Kernel。在shadertoy代码中:

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    vec3 dir = rayDirection(45.0, iResolution.xy, fragCoord);
    ...
}

在OpenGL的情况下,我们需要从glfw窗口发送iResolution。而fragCoord将来自Fragment Shader中的gl_FragCoord。
我有一个metal文件:
kernel void compute(texture2d<float, access::write> output [[texture(0)]],
                    uint2 gid [[thread_position_in_grid]]) {
    int width = output.get_width();
    int height = output.get_height();
    ....
}

我可以通过宽度高度获取iResolution,但我不确定如何获取gl_FragCoord

Metal_stdlib是否有与gl_FragCoord等效的内容?或者如果我必须计算,该怎么样才能获得相同的值?


如果您正在分派一个与输出纹理完全相同大小的单个网格,则等效于 gl_FragCoord 的是 float2(gid) / float2(width, height) - warrenm
3
这似乎更适合用于渲染流程中的实际片段函数,而不是计算函数。在这种情况下,片段坐标将是一个输入变量或带有[[position]]标记的stage_in结构体字段。 - Ken Thomases
@warrenm 有没有示例代码可以做到这一点?假设我的屏幕分辨率是float(800/600),我如何划分“线程组”或“线程组计数”? - sooon
我可能误解了。如果您正在寻找窗口坐标中的“片段”位置(如gl_FragCoord),那么它只是float2(gid),其范围从(0,0)到(width,height)(同样,前提是您的网格维度(线程组大小和线程组计数的乘积)完全匹配目标纹理。 - warrenm
@warrenm,您能否举个例子来说明网格维度与目标纹理完全匹配是什么意思?我有些模糊的概念。如果有例子,我想我可以更清晰地看到它。 - sooon
好的,它可以工作了。我只是用 float2(gid) 替换了它,现在我得到了我想要的结果。@warrenm,你能把它变成答案,这样我就可以接受它了吗? - sooon
1个回答

2

如果您正在寻找窗口坐标系中的“片段”位置(如gl_FragCoord),则可以使用float2(gid),其范围从(0, 0)到(宽度,高度)。只有当网格维度(线程组大小和线程组计数的乘积)与目标纹理的尺寸完全匹配时,才会出现这种情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接