Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Camera 带多个摄影机的OnPostRender';s Unity3D_Camera_Unity3d - Fatal编程技术网

Camera 带多个摄影机的OnPostRender';s Unity3D

Camera 带多个摄影机的OnPostRender';s Unity3D,camera,unity3d,Camera,Unity3d,我正在尝试使用GL&OnPostRender在Unity3D中渲染线条。如果我只有一个摄影机,效果很好,但是如果我有多个摄影机(oculus rift需要),无论我尝试了什么,我都无法在两个摄影机视口中渲染线条。我试着将脚本附加到两个摄像头上——设置视口等等,但没有任何效果。如果将脚本附加到两个摄影机,则会为每个摄影机调用OnPostRender一次,但只绘制最后一个摄影机。如果我只将脚本附加到一个摄影机,并将视口设置为第二个摄影机,则无法让liones在第二个摄影机中绘制。以下是我认为有效的方

我正在尝试使用GL&OnPostRender在Unity3D中渲染线条。如果我只有一个摄影机,效果很好,但是如果我有多个摄影机(oculus rift需要),无论我尝试了什么,我都无法在两个摄影机视口中渲染线条。我试着将脚本附加到两个摄像头上——设置视口等等,但没有任何效果。如果将脚本附加到两个摄影机,则会为每个摄影机调用OnPostRender一次,但只绘制最后一个摄影机。如果我只将脚本附加到一个摄影机,并将视口设置为第二个摄影机,则无法让liones在第二个摄影机中绘制。以下是我认为有效的方法:

Rect[] viewports;

            Camera[] cameras = null;
            if (Params.riftEnabled)
            {
                viewports = new Rect[2];
                viewports[0] = new Rect(0, 0, Screen.width / 2, Screen.height);
                viewports[1] = viewports[0]; // new Rect(Screen.width / 2, 0, Screen.width / 2, Screen.height);
                GameObject ovrCameraController = (GameObject)GameObject.FindGameObjectWithTag("ovrcamera");
                cameras = (Camera[])ovrCameraController.GetComponentsInChildren<Camera>();

            }
            else
            {
                viewports = new Rect[1];
                viewports[0] = new Rect(0, 0, Screen.width, Screen.height);
                cameras = new Camera[1];
                cameras[0] = GameObject.FindObjectOfType<Camera>();
            }

            for (int i = 0; i < viewports.Length; i++)
            {
                SteeringManager.PrintVector("Cam " + i, cameras[i].transform.position);
                GL.PushMatrix();
                lineMaterial.SetPass(0);                                        
                GL.modelview = cameras[i].worldToCameraMatrix;
                GL.LoadProjectionMatrix(cameras[i].projectionMatrix);
                GL.Viewport(viewports[i]);
                lineMaterial.SetPass(0);
                GL.Begin(GL.LINES);
                foreach (Line line in lines)
                {
                     GL.Color(line.color);
                     GL.Vertex3(line.start.x, line.start.y, line.start.z);
                     GL.Vertex3(line.end.x, line.end.y, line.end.z);
                }
                GL.End();
                GL.PopMatrix();
            }
Rect[]视口;
摄像头[]摄像头=空;
if(参数可重复使用)
{
视口=新矩形[2];
视口[0]=新矩形(0,0,Screen.width/2,Screen.height);
视口[1]=视口[0];//新建矩形(Screen.width/2,0,Screen.width/2,Screen.height);
GameObject ovrCameraController=(GameObject)GameObject.FindGameObjectWithTag(“ovrcamera”);
cameras=(Camera[])ovrCameraController.GetComponentsInChildren();
}
其他的
{
视口=新矩形[1];
视口[0]=新矩形(0,0,Screen.width,Screen.height);
摄像机=新摄像机[1];
cameras[0]=GameObject.FindObjectOfType();
}
对于(int i=0;i<视口.长度;i++)
{
SteeringManager.PrintVector(“Cam”+i,摄像头[i].transform.position);
GL.PushMatrix();
lineMaterial.SetPass(0);
GL.modelview=cameras[i].worldToCameraMatrix;
GL.LoadProjectionMatrix(摄影机[i].projectionMatrix);
总图视口(视口[i]);
lineMaterial.SetPass(0);
总帐开始(总帐行);
foreach(行中的行)
{
总图颜色(线条颜色);
总图顶点3(线.start.x,线.start.y,线.start.z);
总图顶点3(线.end.x,线.end.y,线.end.z);
}
GL.End();
GL.PopMatrix();
}

只需将[yield WaitForEndOfFrame();]添加到OnPostRender函数中即可

function OnPostRenderer() {
    yield WaitForEndOfFrame();

    for (var i : int = 0; i < viewports.Length; i++)
    {
    GL.PushMatrix();
    lineMaterial.SetPass(0);                                    
    GL.modelview = cameras[i].worldToCameraMatrix;
    GL.LoadProjectionMatrix(cameras[i].projectionMatrix);
    GL.Viewport(viewports[i]);

    GL.Color(Color.white);
    GL.Begin(GL.LINES);
    for (var p : Vector3 in points) {
         GL.Vertex3(...);
         GL.Vertex3(...);
        }
    GL.End();
    GL.PopMatrix();
    }
}
函数OnPostRenderer(){
屈服WaitForEndOfFrame();
对于(变量i:int=0;i

然后将此脚本连接到两个摄像头,它应该可以工作。

嘿,谢谢你的回答。它几乎起作用了。。。现在,两个摄影机都正确显示了线,但是在两个视口中,线没有被正确遮挡。它似乎在使用主摄像机的深度值。。。例如,在主/全屏相机的3D对象遮挡线条的位置存在“孔”。这是一张截图:[图片]。这些圆形区域对应于在主/全屏摄像机上绘制球体的位置。。图片的链接应该是hey@Verv你看到我的评论了吗!我不知道,你试过换旗子吗?或者只增加一个摄像头来画线?我一直在玩它更多。。。这是连接到rift摄像机的脚本之一。如果我删除脚本,它会工作(但显然没有VR)。我会进一步调查的