Я пытаюсь встроить поддержку OculusRift в наше программное обеспечение для автосимулятора в нашем институте. В связи с тем, как настроено программное обеспечение симулятора, мы решили исправить искажения, связанные с тем, что на стороне линз клиентская сторона создала список отображения с OpenGL для запуска первых тестов.
В основном, я немного борюсь с пониманием того, как OpenGL рисует (для списка отображения). Я использовал информацию из разных уроков, и если я правильно понял, следующий цикл for выбрал бы координаты для Tex 0,1,2, выполнил некоторое виньетирование и привязал бы его к каждой вете. 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();
Я пытаюсь встроить поддержку OculusRift в наше программное обеспечение для автосимулятора в нашем институте. В связи с тем, как настроено программное обеспечение симулятора, мы решили исправить искажения, связанные с тем, что на стороне линз клиентская сторона создала список отображения с OpenGL для запуска первых тестов.
Остановись прямо там! Вы нацелены на отображение VR, что означает, что вы должны использовать метод рисования с максимальной производительностью, который вы можете получить для рисования динамических сеток (требуется для изменения времени). Списки отображения не могут этого сделать. Собственно непосредственный режим (glBegin
… glEnd
) создает большую нагрузку на процессор, а это именно то, чего вы не хотите.
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
?