【问题标题】:Would this shader code snippet still be converted as i.uv in Unity?这个着色器代码片段是否仍会在 Unity 中转换为 i.uv?
【发布时间】:2019-02-07 17:43:04
【问题描述】:

我正在关注本教程:https://www.youtube.com/watch?v=CzORVWFvZ28 将一些代码从 ShaderToy 转换为 Unity。这是我正在尝试转换的着色器:https://www.shadertoy.com/view/Ws23WD。

我浏览了本教程,发现其中一项更改是采用“fragCoord.xy/iResolution.xy”并改用“i.uv”。但是如果我有'fragCoord.x/iResolution.x'和'fragCoord.y/iResolutiony'呢? 'i.uv' 是否替换了这两个语句?

这是它在我的代码中的显示方式:

float2 uv = float2(fragCoord.x / iResolution.x, fragCoord.y / iResolution.y);
uv -= 0.5;
uv /= float2(iResolution.y / iResolution.x, 1);

【问题讨论】:

  • 我不确定我是否正确理解了您的问题,但 CG 中的乘法和除法都是按分量计算的,因此将 float2 除以 float2 相当于将 x 和 y 分开。
  • @Piflik 在教程中,他有一段代码类似于:'float2 UV = fragCoord.xy/iResolution.xy) - .5'。他必须对 UV 进行的着色器更改之一是将其替换为:'float2 UV = i.uv - .5'。但我上面的代码 sn-p 似乎将 x 和 y 坐标分开;所以在我的情况下,我将如何使用“i.uv”来替换 fragCoord/iResolution 语法?
  • @Piflik 会不会是:'float2 uv = float2(i.uv)?按照教程,我猜第三行是纵横比,我不需要?

标签: unity3d shader


【解决方案1】:

iResolution.x 和 iResolution.y 指的是渲染窗口的像素尺寸。在统一中,您有 _ScreenParams.x 和 _ScreenParams.y 用于屏幕像素尺寸,但如果您正在渲染屏幕空间效果,您只需要担心这一点。如果您想将其渲染为平面上的效果,您可以使用 i.uv.x 和 i.uv.y 来实现相同的目的。 FragCoord / iResolution 旨在为您提供屏幕上 0-1 范围内的片段位置,这实际上相当于 UV 坐标。减去 0.5 得到 -0.5 到 0.5 的范围。

最后一行 uv /= float2(iResolution.y / iResolution.x, 1) 用于校正纵横比。如果您使用的是 UV 映射的方形平面,则无需为此烦恼。

总而言之,这些行相当于:

float2 uv = i.uv - (float2)0.5;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-07
    • 2021-04-21
    • 2019-09-19
    • 1970-01-01
    • 1970-01-01
    • 2020-11-25
    • 1970-01-01
    相关资源
    最近更新 更多