【问题标题】:Metal Shading Language - FragCoord equivalent?金属着色语言 - FragCoord 等价物?
【发布时间】:2017-09-14 06:01:09
【问题描述】:

我试图将this shadertoy scene 翻译成Metal Kernel。在shadertoy代码中:

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

OpenGL 的情况下,我们需要从glfw 窗口发送iResolution。而fragCoord 将是来自Fragment Shadergl_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();
    ....
}

所以我可以从widthheight 获得我的iResolution。但我不确定如何获得gl_FragCoord

Metal_stdlib 是否有与gl_FragCoord 等价的东西?或者如果我必须计算,我怎样才能获得相同的值?

【问题讨论】:

  • 假设您正在调度一个与输出纹理大小完全相同的单个网格,一个等效于gl_FragCoord 的网格是float2(gid) / float2(width, height)
  • 另外,这似乎更适合渲染过程中的实际片段函数,而不是计算函数。在这种情况下,片段坐标将是输入变量或标有[[position]]stage_in struct 字段。
  • @warrenm 任何示例代码如何做到这一点?假设我的屏幕分辨率是浮动(800/600),我如何划分“线程组”或“线程组计数”?
  • 我可能误会了。如果您正在寻找窗口坐标中的“片段”位置(就像gl_FragCoord 一样),那就是float2(gid),范围从 (0, 0) 到 (width, height)(同样,提供您的网格尺寸 (您的线程组大小和线程组计数的乘积)与目标纹理完全匹配。
  • @warrenm 您能否举例说明网格尺寸与目标纹理完全匹配是什么意思?我隐约明白了。举个例子,我想我可以看得更清楚。

标签: glsl metal shading metalkit


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2016-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-29
    • 2020-02-28
    • 2023-04-05
    • 2018-11-10
    • 2019-07-22
    相关资源
    最近更新 更多