使用Oculus Rift的本地渲染插件

9
我正在开发一个项目,将一些渲染工作转移到我为Unity编写的本地插件中,以利用实例化和其他高级图形功能。我正在开发它以进行跨平台发布,但我使用的是Mac电脑,因此测试主要使用OpenGL进行。目前,该插件仅渲染一个位于屏幕中心的带有十六进制颜色的矩形。插件在空白的Unity项目中按预期工作,但一旦我将其纳入我的Oculus项目中,它就会表现得不稳定。
在Rift中,插件的几何图形会绘制两次,一次跨越两只眼睛的范围,另一次仅在右眼的范围内绘制。此外,我应用于几何图形的任何基本颜色都将丢失,并且几何图形似乎会拾取周围的颜色;在黑色屏幕上,红色文本,几何图形将主要是黑色,并且有一些红色渗入线条中。一旦加载了我的绿色地形,插件绘制的几何图形就变成了绿色。
下面是在空白的Unity项目中绘制几何图形的截图(仅有这个): Blank Unity project 这里是在我的Oculus Rift应用程序上绘制同一几何图形的截图: Native rendering on top of Oculus Rift 以下是我正在渲染的顶点的创建(三个坐标和颜色):
Vertex verts[4] =
{
    { -0.5f,  0.5f,  0, 0xFF0000ff },
    {  0.5f,  0.5f,  0, 0xFFff0000 },
    {  0.5f, -0.5f,  0, 0xFF00ff00 },
    { -0.5f, -0.5f,  0, 0xFFff0000 },
};

这是绘制函数,每帧都在插件中被调用:
// OpenGL case
if (g_DeviceType == kGfxRendererOpenGL)
{
    //initialize model view matrices
    glMatrixMode (GL_MODELVIEW);
    float modelMatrix[16] =
    {
        1,0,0,0,
        0,1,0,0,
        0,0,1,0,
        0,0,0,1,
    };
    glLoadMatrixf (modelMatrix); //assign our matrix to the current MatrixMode

    //initialize projection matrix
    glMatrixMode (GL_PROJECTION);
    projectionMatrix[10] = 2.0f; //tweak projection matrix to match D3D
    projectionMatrix[14] = -1.0f;
    glLoadMatrixf (projectionMatrix);

    // Vertex layout
    glVertexPointer (3, GL_FLOAT, sizeof(verts[0]), &verts[0].x);
    glEnableClientState (GL_VERTEX_ARRAY);
    glColorPointer (4, GL_UNSIGNED_BYTE, sizeof(verts[0]), &verts[0].color);
    glEnableClientState (GL_COLOR_ARRAY);

    glDrawArrays(GL_LINE_LOOP, 0, 4);

}

希望有经验的本地插件/Rift图形编码人员提供任何见解!


为什么要投票关闭? - datenwolf
请注意,在渲染之前通常还需要设置视口。OVR SDK明确提供了一个函数来查询渲染目标中的目标视口。我目前没有访问我的密码存储和Oculus开发者登录的计算机,因此无法提供参考链接。 - datenwolf
因为我正在使用Unity,所以我目前并没有将SDK融入我的代码中;只是简单地使用Oculus整合包并在其之上进行编码。事实上,我甚至不确定在Unity运行时期间是否可以从外部C++插件访问OVR SDK属性。我很愿意将Oculus SDK添加到我的插件中作为依赖项,但如果能够工作的话,这似乎有点多余。 - Jyakku
你能让这个工作起来了吗?我也遇到了类似的问题。 - 3Dave
1
不,我从未解决过这个问题,尽管自从Unity推出内置VR集成以来,我还没有尝试运行这段代码。考虑到新的VR管道中添加了一个合成器,我认为尝试一下是有意义的,所以如果当我尝试之后产生了积极的结果,我会在这里发布。 - Jyakku
1个回答

0

您可以利用Unity UI系统根据您的需求渲染精灵。以下是Oculus的一篇文章,介绍如何调整Unity UI系统以适应VR:https://developer.oculus.com/blog/unitys-ui-system-in-vr/

在Unity之外,您可以使用四边形图层来渲染眼睛FOV上方的内容。以下是Oculus Rift文档中描述的图层:https://developer.oculus.com/documentation/pcsdk/latest/concepts/dg-render/#dg_render_layers

四边形图层:

单眼图像,在虚拟世界中以给定的姿态和大小显示为矩形。这对于抬头显示、文本信息、物体标签等非常有用。默认情况下,姿态是相对于用户的真实世界空间指定的,四边形将保持固定而不随用户的头部或身体运动而移动。对于头锁定的四边形,请使用下面描述的ovrLayerFlag_HeadLocked标志。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接