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