我正在尝试为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;
}
现在的问题是这个操作太慢而无法完成。任何有关实现这一目标的更好方法的建议都会非常有用。我也不了解着色器。
答案 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;
}