Страница 1 из 1

Перенос изображения камеры в текстуру

СообщениеДобавлено: 22 окт 2014, 00:14
MUGIK
В общем хочу сделать снайперский прицел, и дабы сделать линзу реалистичней хочу перенести изображение отдельной камеры в текстуру, а затем текстуру в материал линзы.
У меня возникли две проблемы:
1. При работе моего скрипта юнити начинает просто пожирать мою оперативу до 3,5 гигов!!!!! у меня всего то 4(((((((
2. Как сделать чтобы ReadPixels брал скрин именно с той камеры, которая мне нужна? ибо у меня изображение берется с маин камера, а камера которая нужна находится на самой оптике.
А вот и сам про скрипт от про скриптингера:
Синтаксис:
Используется csharp
void Start ()
        {
                camera.enabled = false;
                camera.enabled = true;
                tileSizeX = (int)camera.pixelWidth;
                tileSizeY = (int)camera.pixelHeight;
                screen = new Texture2D(tileSizeX, tileSizeY, TextureFormat.ARGB32, true);
                renderer.material.mainTexture = screen;
        }

        void Update ()
        {
                camera.enabled = true;

                screen = new Texture2D(tileSizeX, tileSizeY, TextureFormat.ARGB32, true);

                StartCoroutine(Screenshot(screen, tileSizeX, tileSizeY, tileSizeX, tileSizeY));
                camera.enabled = false;
                //renderer.material.mainTexture = screen;
        }

        System.Collections.IEnumerator Screenshot(Texture2D tex, int tileWidth, int tileHeight, int destX, int destY)
        {      
                // Read pixels to buffer location
                yield return new WaitForEndOfFrame();
                camera.enabled = true;
                tex.ReadPixels(new Rect(0, 0, tileWidth, tileHeight), 0, 0);
                tex.Apply();
                renderer.material.mainTexture = tex;
                 //Copy pixels to dest in buffer
//              Color background = camera.backgroundColor;
//              Color alpha = background; alpha.a = 0.0f;
//              for(int y = 0; y < tileHeight; y++)
//                      for(int x = 0; x < tileWidth; x++)
//              {
//                      Color c = tex.GetPixel(x,y);
//                      if (c.r == background.r && c.g == background.g && c.b == background.b)
//                              tex.SetPixel(x + destX, y + destY, alpha);
//                      else
//                              tex.SetPixel(x + destX, y + destY, c);
//              }
               
                 //Clear buffer data
//              Color background = camera.backgroundColor;
//              Color alpha = background; alpha.a = 0.0f;
//              for(int y = 0; y < tileHeight; y++)
//                      for(int x = 0; x < tileWidth; x++)
//                              tex.SetPixel(x,y, alpha);
                //camera.enabled = false;
                //tex.Apply();
        }
}
 


вы пожалуста не пугайтесь от моего скила, но часть кода в коментах была с готового скрипта, но его работа мне не подходит. Но если это наведет вас, чтобы вы навели меня на путь истины , то пусть останется...
и скрипт не работает после попытки решения проблемы с оперативой, но оператива так и кушается(

ну а так скрипт по идее простяковый, но походу не для меня((((

Re: Перенос изображения камеры в текстуру

СообщениеДобавлено: 22 окт 2014, 00:59
DonTTGnev
Не совсем понимаю логику камеру включил,а не выключил, а не включил а не опять выключил. в Update() вы создаете новый материал Оо каждый кадр. Мусоршик за вами не успеет. Создай функцию инициализации материала один раз, примени для линзы когда нужно и все. Пугаент название метода (Screenshot) явно не то взяли за основу...

Re: Перенос изображения камеры в текстуру

СообщениеДобавлено: 22 окт 2014, 01:31
Tolking
Нормально это можно сделать только на про.

Re: Перенос изображения камеры в текстуру

СообщениеДобавлено: 22 окт 2014, 19:09
MUGIK
хорошо, я понял о чем вы
но все же как сделать чтобы ReadPixels считывал именно с нужной мне камеры а не с главной(основной)?

Re: Перенос изображения камеры в текстуру

СообщениеДобавлено: 24 ноя 2018, 05:29
LoneRay
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NewImage : MonoBehaviour
{
    public Camera camera;
    private int tileSizeX;
    private int tileSizeY;
    private Texture2D screen;
    void Start()
    {
        tileSizeX = (int)camera.pixelWidth;
        tileSizeY = (int)camera.pixelHeight;
        screen = new Texture2D(tileSizeX, tileSizeY, TextureFormat.ARGB32, true);
    }

    void Update()
    {
        StartCoroutine(Screenshot(screen, tileSizeX, tileSizeY));
    }

    System.Collections.IEnumerator Screenshot(Texture2D tex, int tileWidth, int tileHeight)
    {
        yield return new WaitForEndOfFrame();
        tex.ReadPixels(new Rect(0, 0, tileWidth, tileHeight), 0, 0);
        tex.Apply();
        GetComponent<Renderer>().material.mainTexture = tex;
    }
}