金属着色语言 - FragCoord 等效?
Metal Shading Language - FragCoord equivalent?
我试图将 this shadertoy scene 翻译成 Metal Kernel
。在 shadertoy 代码中:
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
vec3 dir = rayDirection(45.0, iResolution.xy, fragCoord);
...
}
在OpenGL
情况下,我们需要从glfw
window发送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();
....
}
所以我可以从 width
和 height
得到我的 iResolution
。但我不确定如何获得 gl_FragCoord
.
Metal_stdlib
是否有等同于 gl_FragCoord
的东西?或者如果我必须计算,我怎样才能获得相同的值?
如果您正在寻找 window 坐标中的 "fragment" 位置(如 gl_FragCoord
),您可以使用 float2(gid)
,范围从 (0, 0)到(宽度,高度)。仅当您的网格尺寸(线程组大小和线程组计数的乘积)与目标纹理的尺寸完全匹配时才会出现这种情况。
我试图将 this shadertoy scene 翻译成 Metal Kernel
。在 shadertoy 代码中:
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
vec3 dir = rayDirection(45.0, iResolution.xy, fragCoord);
...
}
在OpenGL
情况下,我们需要从glfw
window发送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();
....
}
所以我可以从 width
和 height
得到我的 iResolution
。但我不确定如何获得 gl_FragCoord
.
Metal_stdlib
是否有等同于 gl_FragCoord
的东西?或者如果我必须计算,我怎样才能获得相同的值?
如果您正在寻找 window 坐标中的 "fragment" 位置(如 gl_FragCoord
),您可以使用 float2(gid)
,范围从 (0, 0)到(宽度,高度)。仅当您的网格尺寸(线程组大小和线程组计数的乘积)与目标纹理的尺寸完全匹配时才会出现这种情况。