Блокировка скейлера Unity GL.Vertex - PullRequest
1 голос
/ 20 сентября 2019

Итак, я рисую линии, используя GL в Unity.Я рисую эти линии на моем экране, и они рисуются.Тем не менее, я вижу линии только после того, как отключаю средство масштабирования холста в сценарии, который предоставляет данные для линий.

Я пробовал другие способы рисования линий, но ничего не помогло.

Итакустановка следующая: у меня есть сцена в моей сцене с холстом, который масштабируется с размером экрана.Этот холст содержит скрипт, который предоставляет данные (позиции) для линий.Когда нужно нарисовать линии, он запускает событие с вектором [2] со всеми данными, которые требуют линий и т. Д. У меня есть другой скрипт на моей основной камере, который прослушивает это событие, и при необходимости он рисует линии в onpostrender.Эти линии рисуются в правильных положениях, но я могу их видеть только после того, как отключу масштабирование холста на холсте.Вот некоторый код:

Это сценарий в моей сцене (то есть на холсте), который инициирует событие с данными.

lock (_skeleton2D)
{

    for (int i = 0; i < skeleton.Length; ++i)
    {
        _skeleton2D[i] = new Vector2(skeleton[i].x * scaleX + _depthImageRect.anchoredPosition.x * 2, _depthImageRect.rect.height - skeleton[i].y * scaleY);
    }

    for (int i = 0; i < skeleton.Length; i++)
    {
        Vector2 vector2 = skeleton[i];
        objects[i].transform.position = vector2;
    //                    _skeleton2D[i] = vector2;
    }

    DrawSkeletonRenderer?.Invoke(_skeleton2D);

Как вы можете видеть в конце, он запускаетDrawSkeletonRenderer с Vector2 [] _skeleton2D.Затем у меня есть сценарий на главной и единственной камере в сцене, которая прослушивает это событие, и когда он получает событие, он обновляет свой собственный Vector2 [] skeletondata и использует его для визуализации линий.

private void Start()
{
    _skeletonMaterial = new Material(Shader.Find("UI/Default")); 
    MoveCalibrationToolManager.DrawSkeletonRenderer += receivedDrawSkeleton; 
}

private void receivedDrawSkeleton(Vector2[] skeleton)
{
    _skeleton2D = skeleton;
    isSkeletonValid = true; //TODO Turn false when not needed anymore.
}

private bool isSkeletonValid;

private void OnPostRender()
{
    if (isSkeletonValid)
    {
        lock (_skeleton2D)
        {
            drawSkeleton(_skeleton2D);
            Debug.LogError("DRAW SKELETON RIGHT NOW!");
        }
    }
}

Как вы можете видеть, он в конечном итоге вызывает drawSkeleton, который, как показано ниже, рисует линии

GL.PushMatrix();
_skeletonMaterial.SetPass(0);
GL.LoadPixelMatrix();

drawBone(skeleton[(int)JointType.Head], skeleton[(int)JointType.Neck]);
drawBone(skeleton[(int)JointType.Neck], skeleton[(int)JointType.LShoulder]);
drawBone(skeleton[(int)JointType.Neck], skeleton[(int)JointType.RShoulder]);
drawBone(skeleton[(int)JointType.LShoulder], skeleton[(int)JointType.LElbow]);
drawBone(skeleton[(int)JointType.LElbow], skeleton[(int)JointType.LHand]);
drawBone(skeleton[(int)JointType.RShoulder], skeleton[(int)JointType.RElbow]);
drawBone(skeleton[(int)JointType.RElbow], skeleton[(int)JointType.RHand]);
drawBone(skeleton[(int)JointType.LShoulder], skeleton[(int)JointType.RWaist]);

, который затем вызывает drawBone, который выглядит следующим образом:

if (float.IsNaN(fromJoint.x) || float.IsNaN(fromJoint.y) || float.IsNaN(toJoint.x) || float.IsNaN(toJoint.y))
 {
     Debug.Log("Joint positions for lines are null");
     return;
 }

GL.Begin(GL.LINES);
GL.Color(Color.red);
GL.Vertex(fromJoint);
GL.Vertex(toJoint);
GL.End();

Как я уже сказал, все прорисовано, но я вижу его только при отключении Canvas Scaler на холсте, к которому прикреплен первый скрипт.

Во время выполнения я делаю текстуру, на которой я показываю канал 3D-камеры Realsense.,Мне нужно, чтобы скелет был нарисован поверх этого.Я делаю эту текстуру следующим образом:

GameObject obj = new GameObject("Calibration View");
obj.transform.SetParent(gameObject.transform, false);
obj.transform.SetAsFirstSibling();
_depthImage = obj.AddComponent<RawImage>();

_depthImageRect = obj.GetComponent<RectTransform>();
_depthImageRect.anchorMin = Vector2.zero;
_depthImageRect.anchorMax = Vector2.one;
_depthImageRect.anchoredPosition = Vector2.zero;

Quaternion transformRotation = new Quaternion(180f, 0f, 0f, 0f);
_depthImageRect.transform.rotation = transformRotation;

_depthImage.material = _depthImageMaterial;
_depthTexture = new Texture2D(RsDevice.DepthWidth, RsDevice.DepthHeight, TextureFormat.BGRA32, false);
_depthImage.texture = _depthTexture;
_depthTextureBytes = new byte[RsDevice.DepthWidth * RsDevice.DepthHeight * 4];
...