Unity画布缩放器阻止GL.Vertex

时间:2019-09-20 14:30:16

标签: c# unity3d canvas drawing line

所以我正在Unity中使用GL绘制线条。我在屏幕上绘制了这些线,并且它们正在被绘制。但是,只有在为行提供数据的脚本上禁用画布缩放器后,才能看到行。

我尝试了其他方法来画线,但没有任何帮助。

因此设置如下,我的场景中有一个画布,其上方有一个画布缩放器,可以根据屏幕尺寸缩放。此画布包含一个脚本,为行提供数据(位置)。当需要绘制线条时,它会使用vector2 []触发一个事件,其中包含所有需要线条的数据等。我在主摄像机上有另一个脚本正在监听此事件,并在需要时在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);

最后您可以看到,它使用Vector2 [] _skeleton2D触发DrawSkeletonRenderer。然后,我在Main上有一个脚本,并且只有一个摄像机在侦听此事件,而当它接收到该事件时,它将更新其自己的Skeletedata的Vector2 [],并使用它来渲染线条。

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实感相机的提要。我需要在此之上绘制骨架。我通过以下方式制作此纹理:

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];

0 个答案:

没有答案