Итак, я рисую линии, используя 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];