Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unity3d 如何在着色器之间实时切换?_Unity3d_Unity5_Unityscript - Fatal编程技术网

Unity3d 如何在着色器之间实时切换?

Unity3d 如何在着色器之间实时切换?,unity3d,unity5,unityscript,Unity3d,Unity5,Unityscript,问题是我有两个着色器。如果在游戏运行时在着色器之间进行更改,则不会生效。只有当我使用当前着色器开始游戏时,它才会使用该着色器,而不是我切换到的着色器 我看到了这段代码,但它正在切换材质,我想切换着色器。 我的意思是在同一个游戏对象上的着色器之间切换。我不确定这个代码中应该包含哪些材料数组 var materials : Material[]; var count = 0; function OnMouseDown() { if (count == materials.Length -

问题是我有两个着色器。如果在游戏运行时在着色器之间进行更改,则不会生效。只有当我使用当前着色器开始游戏时,它才会使用该着色器,而不是我切换到的着色器

我看到了这段代码,但它正在切换材质,我想切换着色器。 我的意思是在同一个游戏对象上的着色器之间切换。我不确定这个代码中应该包含哪些材料数组

var materials : Material[];
var count = 0;

function OnMouseDown() {
    if (count == materials.Length - 1)
        count = 0;
    else
        count++;

    renderer.material = materials[count];
}

您可以使用
GameObject.renderer.material.shader
设置着色器。
API提供了这方面的例子。签出。

您可以使用
GameObject.renderer.material.shader设置着色器。
API提供了这方面的例子。签出。

简短回答 不要这样做。通过游戏对象的渲染器指定更改
材质
着色器
属性会导致创建多个材质实例,这不仅在计算上很昂贵,而且在GPU上的内存方面也很昂贵

Unity Tutorials的Thomas说得最好:

第一件最有可能进入你脑海的事情是:

GetComponent().material.color=…

简单,对吗?只需抓取颜色并设置动画即可。问题是,为了更改着色器中的颜色,Unity需要告诉GPU该对象将以不同方式渲染,唯一的方法是更改材质实例。因此,当您第一次访问renderer.material时,Unity将创建材质的副本

这意味着可能存在大量的材料拷贝,所有这些拷贝都消耗了记忆

2500个球体共享相同材质的场景。其他39种材质用于场景中的其他项目

在2500个对象上摆弄
GameObject.renderer.material.shader
之后。请注意,材质是如何从40跳到2540的

长话短说 首先是复习。在Unity中,创建(或从资产商店购买)着色器,然后创建材质。然后,材质指的是提供着色器可能需要的任何参数(例如纹理)的着色器;颠簸地图;以及将此材质与可能使用相同着色器的任何其他材质区分开来的标量。完成后,将材质应用于对象

我的意思是在同一个游戏对象上的着色器之间切换

因此,想要切换着色器是没有意义的。对象直接与着色器对话不仅是不正确的,而且它没有足够的细节使着色器能够这样做

您要做的是在对象上切换材质

如果在游戏运行时在着色器之间进行更改,则不会生效

没有看到你的代码,很难说。无论如何,可以说,最好提前定义所有资产,而不是动态创建。通过这种方式,您可以根据已知的保真度或平台烘焙它,而无需代码决定应该使用哪个着色器级别

变通

如果您必须在运行时更改材料,您可能需要考虑Unity的“代码>材料属性块 < < /P>”。 MaterialPropertyBlock由Graphics.DrawMesh和Renderer.SetPropertyBlock使用。如果要使用相同的材质绘制多个对象,但属性稍有不同,请使用它。例如,如果要稍微更改绘制的每个网格的颜色。不支持更改渲染状态

不幸的是,正如Thomas在下面的文章中解释的那样,您现在需要向着色器添加
PerRendererData

对于这样一件简单的事情来说,它是非常复杂的。提前准备好预先设计好的材料要好得多。这可以说是一种更好的做法

告诉我更多
  • 优秀文章

  • ,

  • 简短回答 不要这样做。通过游戏对象的渲染器指定更改
    材质
    着色器
    属性会导致创建多个材质实例,这不仅在计算上很昂贵,而且在GPU上的内存方面也很昂贵

    Unity Tutorials的Thomas说得最好:

    第一件最有可能进入你脑海的事情是:

    GetComponent().material.color=…

    简单,对吗?只需抓取颜色并设置动画即可。问题是,为了更改着色器中的颜色,Unity需要告诉GPU该对象将以不同方式渲染,唯一的方法是更改材质实例。因此,当您第一次访问renderer.material时,Unity将创建材质的副本

    这意味着可能存在大量的材料拷贝,所有这些拷贝都消耗了记忆

    2500个球体共享相同材质的场景。其他39种材质用于场景中的其他项目

    在2500个对象上摆弄
    GameObject.renderer.material.shader
    之后。请注意,材质是如何从40跳到2540的

    长话短说 首先是复习。在Unity中,创建(或从资产商店购买)着色器,然后创建材质。然后,材质指的是提供着色器可能需要的任何参数(例如纹理)的着色器;颠簸地图;以及将此材质与可能使用相同着色器的任何其他材质区分开来的标量。完成后,将材质应用于对象

    我的意思是在同一个游戏对象上的着色器之间切换

    因此,想要切换着色器是没有意义的。不仅