Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Texture2d.Setpixel не успевает закрашивать пиксели текстуры.

Дмитрий Р, Ученик (167), открыт 1 неделю назад
У меня есть мобильное приложение для рисования , в котором есть необходимость постоянно изменять цвет пикселей, но из-за скорости функции, они не успевают закрасить полностью. Я читал про LockBits, но так и не понял как её связать Bitmap с Texture2D.
Вот мой код:
     void Start() 
{
_camera = Camera.main;
_texture = new Texture2D(_resolutionX, _resolutionY);
GetComponent<Renderer>().material.mainTexture = _texture;
_texture.wrapMode = TextureWrapMode.Clamp;
_texture.filterMode = FilterMode.Bilinear;
_Collider = GetComponent<Collider>();
for (int x = 0; x <= _resolutionX; x++)
{
for (int y = 0; y <= _resolutionY; y++)
{
_texture.SetPixel(x, y, Color.white);
}
}
_texture.Apply();
}



void Update()
{

if (Input.touchCount == 1)
{
_touch = Input.GetTouch(0);
ray = _camera.ScreenPointToRay(_touch.position);
if (_Collider.Raycast(ray, out hit, 10000))
{
int rayX = (int)(hit.textureCoord.x * _resolutionX);
int rayY = (int)(hit.textureCoord.y * _resolutionY);
if (_oldX != rayX | _oldY != rayY)
{

if (DrawType == "Circle")
{
DrawCircle(rayX, rayY);
}
else if (DrawType == "Eraser")
{
Erase(rayX, rayY);
}
}
}
}
else
{
if (_Coords.Count != 0)
{
_UndoLists.Add(_Coords);
_Coords.Clear();
_ColorUndo.Add(_Colors);
_Colors.Clear();
}
}
}



void DrawCircle(int rayX, int rayY)
{
float r2 = Mathf.Pow(BrushSize / 2 - 0.5f, 2);
for (int x = 0; x < BrushSize; x++)
{
float x2 = Mathf.Pow(x - BrushSize / 2, 2);
for (int y = 0; y < BrushSize; y++)
{
float y2 = Mathf.Pow(y - BrushSize / 2, 2);
if (_Coords.Contains(new Vector2(rayX + x - BrushSize / 2, rayY + y - BrushSize / 2)) == false)
{
if (rayX + x - BrushSize / 2 >= 0 && rayX + x - BrushSize / 2 < _resolutionX && rayY + y - BrushSize / 2 >= 0 && rayY + y - BrushSize / 2 < _resolutionY)
{
if (x2 + y2 < r2)
{
Color OldColor = _texture.GetPixel(rayX + x - BrushSize / 2, rayY + y - BrushSize / 2);
Color newColor = Color.Lerp(OldColor, color, color.a);
_texture.SetPixel(rayX + x - BrushSize / 2, rayY + y - BrushSize / 2, newColor);
_Coords.Add(new Vector2(rayX + x - BrushSize / 2, rayY + y - BrushSize / 2));
_Colors.Add(OldColor);
}
}

}

}
}

rayX = _oldX;
rayY = _oldY;
_texture.Apply();
}
1 ответ
Ваня Колчугин Знаток (292) 1 неделю назад
привет да не парься с сетпикселем лучше попробуй использовать lockbits для производительности делай так: 1. создаешь bitmap 2. получаешь данные пикселей через lockbits 3. изменяешь массив пикселей 4. потом перекладываешь обратно в texture2d и всё так быстрее будет
Похожие вопросы