Top.Mail.Ru
Ответы

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

У меня есть мобильное приложение для рисования , в котором есть необходимость постоянно изменять цвет пикселей, но из-за скорости функции, они не успевают закрасить полностью. Я читал про LockBits, но так и не понял как её связать Bitmap с Texture2D.
Вот мой код:

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
     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(); 
    } 
По дате
По рейтингу
Аватар пользователя
Ученик

привет да не парься с сетпикселем лучше попробуй использовать lockbits для производительности делай так: 1. создаешь bitmap 2. получаешь данные пикселей через lockbits 3. изменяешь массив пикселей 4. потом перекладываешь обратно в texture2d и всё так быстрее будет



Видео по теме