在另一个纹理上填充纹理图案

时间:2015-04-27 13:15:04

标签: android opengl-es unity3d shader

我正在尝试为Android创建一个统一的角色定制。现在的情况是,我有一个服装模型,这是一个texture2D,也是一些模式和颜色,用户可以在这个模型的服装上应用。现在,当用户将图案应用到衣服上时,我需要更换要在该图案中显示的衣服。对于颜色,我能够将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;
}

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

2 个答案:

答案 0 :(得分:0)

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

您没有提及2D环境中使用的纹理是否为精灵或在3D模型上使用。

对于2D游戏:

我要做的是我会为每个对象使用一个单独的精灵。然后我会重叠精灵,结果将完全像你上面要做的那样。

对于3D模型:

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

答案 1 :(得分:0)

此外,渲染到纹理技术可用于预渲染多个纹理传递。例如,下面的代码使用内置的“漫反射细节”着色器来组合 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;
}