【问题标题】:Converting shadertoy to Metal (cube mapping ?)将shadertoy转换为金属(立方体贴图?)
【发布时间】:2020-02-15 22:08:53
【问题描述】:

我正在尝试重写 this 着色器,但我被卡住了:

float backColor = dot (texture (iChannel0, direction).rgb, channel);

我会怎么做?遵循this 教程,我应该可以在这里传递我的立方体纹理,但我无法完成这项任务。 现在没有这条线,随着时间的推移,我会得到一些随机的颜色,所以我认为那是我丢失的部分。 我正在使用带有 SCNProgram 的 SceneKit。

【问题讨论】:

    标签: scenekit metal


    【解决方案1】:

    假设您已经移植了着色器的相关部分,加载了立方体贴图,并将其绑定为着色器参数,则等效的金属着色语言代码行是:

    float backColor = dot(texCube.sample(cubeSampler, direction).rgb, channel);
    

    texCube 的类型为 texturecube<float, access::sample>cubeSampler 类似于

    constexpr sampler cubeSampler(coord::normalized, filter::linear, mip_filter::linear)
    

    【讨论】:

    • 我可以像这样传递立方体贴图:[diamondMaterial setValue:self.scene.background forKey:@"cubeTexture"]; self.scene.background 的加载方式如下:self.scene.background.contents = @[@"px.hdr", @"nx.hdr", @"py.hdr", @"ny.hdr", @"pz.hdr", @"nz.hdr"]; 带有 6 个立方体 hdrs 还是应该以其他方式加载它?我忘了提到我正在使用 SceneKit。
    • 这可能行得通。您可能会考虑使用此和其他此类相关详细信息(例如您是否使用自定义技术、SCNProgram、修饰符等)以及您想要达到的效果来更新您的问题。
    • 我的错,我已经更新了它——当我为 cubeTexture 提供scene.background 时,我的场景背景消失了,但没有错误。我目前的结果看起来像这样milionoczu.com/result.jpeg - 我能错过什么?
    • 您是说在如上所示设置其内容时背景看起来正确吗?并且在您的SCNProgram 重用该材料属性时它会消失吗? docs 似乎并没有表明您可以使用图像名称数组来生成立方体贴图,但尽管没有记录,它可能仍然有效。
    • 传入的片段位置在视口坐标中,所以我认为您需要在标准化之前按渲染缓冲区分辨率对其进行缩放:float2 frag = (2.0 * fragCoord.xy - iResolution.xy) / iResolution.y; 您可以从 scn_frame 的inverseResolution 成员计算视口分辨率。
    猜你喜欢
    • 1970-01-01
    • 2015-06-23
    • 1970-01-01
    • 2020-05-27
    • 2020-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多