代码之家  ›  专栏  ›  技术社区  ›  Cerzi

如何最好地将明暗器逻辑分解为可以混合和匹配的组件

  •  1
  • Cerzi  · 技术社区  · 7 年前

    我对明暗器编程还比较陌生,尽管我希望它是一个比较明显的问题,但我仍在努力寻找相关信息。

    说我有一堆材料。我想让他们中的一些有一个轮廓辉光,其中一些显示一个剪影,另一些既辉光又变成剪影。从传统编程的角度来看,您希望大纲发光逻辑存在于一个函数中,而轮廓逻辑存在于另一个函数中,然后能够调用其中一个或两个函数以获得所需的结果。

    由于材质只能使用单个明暗器,将多个明暗器“链接”在一起的最佳实践是什么?从我所有的阅读资料来看,事实上的方法基本上是为每种功能组合编写一个着色程序,如果您有许多不同的、不同的着色程序出现在不同的排列中,这就像一个维护噩梦。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Draco18s no longer trusts SE    7 年前

    你可以这样做……有点

    问题是:任何给定对象只能有一个材质 1个 任何给定的材质只能有一个材质球。

    所以你的选择是:

    • 多个材质(使用材质球值调整属性)
    • 多个材质(使用多个不同的材质球)
    • SubShader Tags

    最后一个是事情变得有趣的地方。子阴影标记最接近您要查找的内容。每个子阴影都有一组与其关联的标记。只有当材质具有相同的标记值时,才会应用该子阴影。

    例如,我有这个明暗器(在一个我很久没做过的项目中):

    Shader "Custom/Wallhack" 
    {
        Properties 
        {
            _MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
            _WireColor("WireColor", Color) = (1,0,0,1)
            _Color("Color", Color) = (1,1,1,1)
            _HighlightColor("HighlightColor", Color) = (1,0,0,1)
            _HighlightSize("Highlight Size", float) = 4
        }
        SubShader 
        {
            Tags { "Queue"="Transparent" "Wallhack"="1" }
        }
        SubShader 
        {
            Tags { "Queue"="Transparent" "Wallhack"="2" }
        }
        SubShader 
        {
            Tags { "Queue"="Transparent" "Wallhack"="3" }
        }
    }
    

    只需假设这些子阴影通过gem、vert或frag方法的条目,以及省略的其他一些标记。所有这些都会让这个例子太长。在这种情况下:

    • "Wallhack"="1" 是标准渲染路径(墙后不可见)
    • "Wallhack"="2" 突出显示轮廓(用于鼠标悬停选择)
    • "Wallhack"="3" 是否可以通过其他几何图形看到完整的线框轮廓?

    不执行任何操作时,渲染的唯一过程是第一个过程(材质的标记设置为1)。但是打电话来 render.material.SetOverrideTag("WallHack","3"); 在一个物体上 Renderer 组件,而是使用材质球的线框部分进行渲染。

    注: 我不知道子阴影标记造成了什么样的渲染,但我认为它不是很好(中断批处理、克隆材质等)。我有一段时间没弄乱它了。

    1个 嗯,差不多吧。有些对象的子网格可以有自己的材质,但一般来说:1个网格,1个材质。