0

我正在尝试将 OculusRift 支持内置到我们研究所的汽车模拟器软件中。由于模拟器软件的设置方式,我们决定修复由于镜头客户端使用 OpenGL 构建显示列表以运行第一次测试而导致的失真。

基本上我有点挣扎的是理解OpenGL是如何绘制的(用于显示列表)。我使用了来自不同教程的信息,如果我理解正确,下面的 for 循环将选择 Tex 0、1、2 的坐标做一些暗角并将其绑定到每个 vetice。会glBegin(GL_TRIANGLES)自动从顶点绘制三角形。

顶点的坐标存储在地址ov指向的结构中。此外,我们为每个颜色通道设置了偏移量。

以下代码从 OpenGL 角度截取是否正确?

ovrHmd_CreateDistortionMesh(pHmd, eyeRenderDesc[eyeNum].Eye, eyeRenderDesc[eyeNum].Fov,
ovrDistortionCap_Chromatic | ovrDistortionCap_Vignette, &meshData);

ovrDistortionVertex * ov = meshData.pVertexData;

// New compiled distortion-rendering display list
glNewList(drList, GL_COMPILE);

// Make triangles out of the vertices
glBegin(GL_TRIANGLES);

for (unsigned int vertNum = 0; vertNum < meshData.VertexCount; vertNum++) {
    // Tex0,1,2 have already been activated
    glMultiTexCoord2f(GL_TEXTURE0, ov->TanEyeAnglesR.x, ov->TanEyeAnglesR.y);
    glMultiTexCoord2f(GL_TEXTURE1, ov->TanEyeAnglesG.x, ov->TanEyeAnglesG.y);
    glMultiTexCoord2f(GL_TEXTURE2, ov->TanEyeAnglesB.x, ov->TanEyeAnglesB.y);
    glColor4f(
    (OVR::UByte)(ov->VignetteFactor * 255.99f),
    (OVR::UByte)(ov->VignetteFactor * 255.99f),
    (OVR::UByte)(ov->VignetteFactor * 255.99f),
    (OVR::UByte)(ov->TimeWarpFactor * 255.99f));
    glVertex3f(ov->ScreenPosNDC.x, ov->ScreenPosNDC.y, 0.5); // z: constant
    ov++;
}

glEnd();
glEndList();
4

2 回答 2

1

我正在尝试将 OculusRift 支持内置到我们研究所的汽车模拟器软件中。由于模拟器软件的设置方式,我们决定修复由于镜头客户端使用 OpenGL 构建显示列表以运行第一次测试而导致的失真。

停在那儿!您的目标是 VR 显示器,这意味着您必须使用性能最高的绘制方法来绘制动态网格(时间扭曲所需)。显示列表无法做到这一点。实际上,立即模式 ( glBegin... glEnd) 会产生大量 CPU 开销,而这正是您不希望拥有的。

于 2014-11-27T11:46:25.123 回答
0
glColor4f(
  (OVR::UByte)(ov->VignetteFactor * 255.99f),
  (OVR::UByte)(ov->VignetteFactor * 255.99f),
  (OVR::UByte)(ov->VignetteFactor * 255.99f),
  (OVR::UByte)(ov->TimeWarpFactor * 255.99f));

glColor4f期望浮点值介于 0 和 1 之间。但是,您传递的是字节。也许你把它和 混淆了glColor4b

于 2014-11-28T11:01:28.097 回答