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