3

我试图将这个 shadertoy 场景翻译成Metal Kernel. 在着色玩具代码中:

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

以防万一OpenGL,我们需要iResolutionglfw窗口发送。并且fragCoord将从. gl_FragCoord_Fragment Shader

我在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();
    ....
}

所以我可以iResolutionwidthand得到我的height。但我不确定如何获得gl_FragCoord.

Metal_stdlib有相当于的东西吗gl_FragCoord?或者如果我必须计算,我怎样才能获得相同的值?

4

1 回答 1

2

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

于 2017-04-20T18:09:14.377 回答