Opengl 使用Oculus Rift的本机渲染插件

Opengl 使用Oculus Rift的本机渲染插件,opengl,plugins,unity3d,rendering,oculus,Opengl,Plugins,Unity3d,Rendering,Oculus,我正在进行一个项目,该项目将一些渲染卸载到我为Unity编写的本机插件中,以便利用实例和其他高级图形功能。我正在为一个跨平台版本开发它,但我使用的是Mac,所以测试主要是用OpenGL完成的。此时,插件仅将一个四边形渲染到屏幕中心,并用十六进制值着色。该插件在一个空白的Unity项目中按预期工作,但一旦我将其纳入Oculus项目中,它就开始不稳定地运行 在裂缝中,插件的几何图形绘制两次,一次横跨双眼,另一次仅在右眼范围内绘制。此外,我应用于几何体的任何基本颜色都将丢失,几何体似乎会拾取周围的颜色

我正在进行一个项目,该项目将一些渲染卸载到我为Unity编写的本机插件中,以便利用实例和其他高级图形功能。我正在为一个跨平台版本开发它,但我使用的是Mac,所以测试主要是用OpenGL完成的。此时,插件仅将一个四边形渲染到屏幕中心,并用十六进制值着色。该插件在一个空白的Unity项目中按预期工作,但一旦我将其纳入Oculus项目中,它就开始不稳定地运行

在裂缝中,插件的几何图形绘制两次,一次横跨双眼,另一次仅在右眼范围内绘制。此外,我应用于几何体的任何基本颜色都将丢失,几何体似乎会拾取周围的颜色;在带有红色文本的黑屏上,几何体将大部分为黑色,并有一些红色渗入到线条中。加载绿色地形后,插件绘制的几何图形将变为绿色

下面是在空白Unity项目中绘制的几何图形的屏幕截图,没有其他内容:

下面是在我的Oculus Rift应用程序顶部绘制的相同几何图形的屏幕截图:

下面是我正在渲染的顶点的创建(三个坐标和颜色):

这是draw函数,称为插件中的每一帧:

// 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图形编码器有任何见解,将不胜感激

您可以使用Unity UI系统根据需要渲染精灵。以下是Oculus的一篇文章,介绍了如何调整Unity UI系统以实现VR:

在Unity之外,可以使用四元层在眼睛FOV上方进行渲染。以下是Oculus裂谷文件中描述的层:

四层:

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


为什么投票支持关闭?请注意,通常在渲染之前还必须设置视口。OVR SDK显式提供了一个在渲染目标中查询目标视口的函数。我目前没有使用Oculus开发者登录访问我的密码存储的计算机,因此我无法链接到引用,因为我在Unity中工作,我目前没有将SDK滚动到我的书面代码中;只需使用Oculus集成包并在其上编码即可。事实上,我甚至不确定是否可以在Unity运行时从外部C++插件访问OVR SDK属性。我愿意将Oculus SDK作为一个依赖项添加到我的插件中,但这似乎有点多余,如果它真的能工作的话。你曾经这样做过吗?我有一个类似的问题。不,我从来没有回避过这个问题,尽管自从Unity的内置VR集成问世以来,我还没有尝试过用它来运行这段代码。我认为考虑在新的虚拟现实管道中添加一个合成器是一件有效的事情,所以我将在这里发布,如果它在我尝试时产生积极的结果。
// 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);

}