我正在尝试将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();
答案 0 :(得分:1)
我正在尝试将OculusRift支持内置到我们学院的汽车模拟器软件中。由于模拟器软件的设置方式,我们决定修复失真,因为镜头客户端使用OpenGL构建显示列表来运行第一次测试。
停在那里!您的目标是VR显示,这意味着您必须使用最高性能的绘图方法来绘制动态网格(时间扭曲所需)。显示列表无法执行此操作。实际上,立即模式(glBegin
... glEnd
)会产生大量的CPU开销,这正是您不想要的。
答案 1 :(得分: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
混淆?