【问题标题】:Filling a texture pattern over another texture in unity在另一个纹理上统一填充纹理图案
【发布时间】:2023-03-26 08:40:01
【问题描述】:

我正在尝试为 android 创建一个统一的角色自定义。现在的场景是我有一个纹理 2D 的服装模型,还有一些用户可以在这个模型上应用的图案和颜色。现在,当用户将图案应用到连衣裙上时,我需要更改要以该图案显示的连衣裙。对于颜色,我能够将 rgb 值更改为所需的颜色值。但是对于图案,我需要遍历连衣裙的每个像素,并将图案对应的颜色应用于连衣裙的像素。我通过以下代码实现了这一点。

    IEnumerator Print() {
    Texture2D tex = DressTexture;
    Color32[] DressColor = tex.GetPixels32();   
    Color32[] PatternColor = PatternTexture.GetPixels32();
    int j = 0;
    Texture2D NewDressPattern = new Texture2D(tex.width, tex.height, TextureFormat.ARGB32, false);
    for(int i = 0; i < DressColor.Length; i++) {
        if(DressColor[i].a != 0) {
            DressColor[i] = PatternColor[j];
            j++;
            if(j == PatternColor.Length - 1) {
                j = 0;
            }
        }
        else {
            j = 0;
        }
        yield return null;
    }
    NewDressPattern.SetPixels32(DressColor);
    NewDressPattern.Apply();
    Debug.Log("texture created");
    Sprite spr = Sprite.Create(NewDressPattern, new Rect(0, 0, tex.width, tex.height), Vector2.zero);
    Debug.Log("sprite created");
    sprite.sprite = spr;
}

现在的问题是此操作太慢而无法完成。任何有关实现这一目标的更好方法的建议都会非常有帮助。我也不太了解着色器。

【问题讨论】:

    标签: android opengl-es unity3d shader


    【解决方案1】:

    纹理操作总是需要一些耗时的处理。您可以采取一些变通方法来尽量减少对用户的影响。就像进行多线程或非阻塞计算(我认为这就是您现在正在做的事情)。但他们只会最小化问题,不会解决它。

    您没有提到纹理是在 2D 环境中用作精灵还是用于 3D 模型。

    对于 2D 游戏:

    我会为每个对象使用一个单独的精灵。然后我将重叠精灵,结果将与您在上面尝试做的完全一样。

    对于 3D 模型:

    您可以使用一些简单的着色器来重叠多个纹理。只需谷歌它,你就会有很多例子。像这样的简单着色器不需要火箭科学知识:)

    【讨论】:

    • 感谢@Can Baycay 的回答。游戏使用精灵。不可能为每个模式创建单独的精灵,因为这会增加构建大小。如果我有 10 件衣服和 5 个图案,我将不得不制作 50 个我认为不会好的精灵。
    • 那么最好使用着色器。我认为@gamedevelopmentgerm 的回答是一个好的开始。
    【解决方案2】:

    此外,渲染到纹理技术可用于预渲染多个纹理通道。例如,下面的代码使用内置的“Diffuse Detail”着色器来组合Texture2D对象并将结果放入RenderTexture

    public RenderTexture PreRenderCustomDressTexture(int customTextureWidth, int customTextureHeight, Texture2D pattern1, Texture2D pattern2)
    {
        RenderTexture customDressTexture = new RenderTexture( customTextureWidth, customTextureHeight, 32, RenderTextureFormat.ARGB32, RenderTextureReadWrite.Default );
    
        Material blitMaterial = new Material( Shader.Find( "Diffuse Detail" ) );
        blitMaterial.SetColor( "_Color", Color.white );
        blitMaterial.SetTexture( "_MainTex", pattern1 );
        blitMaterial.SetTexture( "_Detail", pattern2 );
        Graphics.Blit( pattern1, customDressTexture, blitMaterial );
    
        return customDressTexture;
    }
    

    【讨论】:

      猜你喜欢
      • 2015-04-17
      • 1970-01-01
      • 1970-01-01
      • 2016-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-08
      • 1970-01-01
      相关资源
      最近更新 更多