godjilla
10 years agoHonored Guest
struggling with rendering on Oculus [sdk 0.7 / 0.8]
Hi. I'm an Oculus development beginner.
I use OpenGL to deal with Oculus and I could easily get HMD sensor variables but I had difficulties with rendering images on HMD.
What I tried were.
- Create a framebuffer and render images on a texture which is bound with the framebuffer. And blit it.
[when I display on viewport of PC (framebuffer 0) it worked but on Oculus it didn't).
- change 'tex->OGL.TexID with' id of texture where images are rendered.
-etc..
I failed every tries.. and now I'm in panic.
Of course I searched for example source codes but I couldn't find any codes that I needed.
(my OS is Windows10, and I needed sdk 0.7 or 0.8 codes)
Can i get any help?
Below is the source code I'm using.
- Source.cpp
-GlobalVariable.h
I use OpenGL to deal with Oculus and I could easily get HMD sensor variables but I had difficulties with rendering images on HMD.
What I tried were.
- Create a framebuffer and render images on a texture which is bound with the framebuffer. And blit it.
[when I display on viewport of PC (framebuffer 0) it worked but on Oculus it didn't).
- change 'tex->OGL.TexID with' id of texture where images are rendered.
-etc..
I failed every tries.. and now I'm in panic.
Of course I searched for example source codes but I couldn't find any codes that I needed.
(my OS is Windows10, and I needed sdk 0.7 or 0.8 codes)
Can i get any help?
Below is the source code I'm using.
- Source.cpp
#include "GlobalVariable.h"
void InitApp(){
//Generate a framebuffer
glEnable(GL_FRAMEBUFFER_SRGB);
FramebufferName = 0;
glGenFramebuffers(1, &FramebufferName);
//Bind generated framebuffer
glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName);
//Generate a texture
glGenTextures(1, &RenderedTexture);
//Bind generated texture
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, RenderedTexture);
//Set texparameters
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
//Bind generated FRAMEBUFFER & TEXTURE
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, RenderedTexture, 0);
}
void hmdInit(){
result = ovr_Initialize(nullptr);
if (OVR_FAILURE(result)){
//return;
}
result = ovr_Create(&hmd, &luid);
if (OVR_FAILURE(result)){
ovr_Shutdown();
//return;
}
desc = ovr_GetHmdDesc(hmd);
resolution = desc.Resolution;
}
void hmdTexInit(){
recommenedTex0Size = ovr_GetFovTextureSize(hmd, ovrEye_Left, desc.DefaultEyeFov[0], 1.0f);
recommenedTex1Size = ovr_GetFovTextureSize(hmd, ovrEye_Right, desc.DefaultEyeFov[1], 1.0f);
EyeWidth = recommenedTex0Size.w;
EyeHeight = recommenedTex0Size.h;
}
void hmdSensorInit(){
//ovrResult ovr_ConfigureTracking(ovrHmd hmd, unsigned int requestedTrackingCaps, unsigned int requiredTrackingCaps);
//ovr_ConfigureTracking(session, ovrTrackingCap_Orientation | ovrTrackingCap_MagYawCorrection | ovrTrackingCap_Position,0);
//ts = ovr_GetTrackingState(session, ovr_GetTimeInSeconds());
if (ts.StatusFlags & (ovrStatus_OrientationTracked | ovrStatus_PositionTracked))
{
}
}
void hmdRenderInit(){
// Configure Stereo settings.
bufferSize.w = recommenedTex0Size.w + recommenedTex1Size.w;
bufferSize.h = recommenedTex0Size.h;
glEnable(GL_FRAMEBUFFER_SRGB);
glGenFramebuffers(1, &ovrFramebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, ovrFramebuffer);
pTextureSet0 = 0;
pTextureSet1 = 0;
if (ovr_CreateSwapTextureSetGL(hmd, GL_SRGB8_ALPHA8, bufferSize.w, bufferSize.h, &pTextureSet0) == ovrSuccess){
// Sample texture access:
tex0 = (ovrGLTexture*)&pTextureSet0->Textures[0];
glGenTextures(1, &(tex0->OGL.TexId));
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, tex0->OGL.TexId);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
tex0->OGL.TexId = RenderedTexture;
//Bind generated FRAMEBUFFER & TEXTURE
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, ovrFramebuffer, 0);
}
if (ovr_CreateSwapTextureSetGL(hmd, GL_SRGB8_ALPHA8, bufferSize.w, bufferSize.h, &pTextureSet1) == ovrSuccess){
tex1 = (ovrGLTexture*)&pTextureSet1->Textures[1];
glGenTextures(1, &(tex1->OGL.TexId));
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, tex1->OGL.TexId);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
//tex1->OGL.TexId = RenderedTexture;
//Bind generated FRAMEBUFFER & TEXTURE
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, ovrFramebuffer, 0);
}
glGenTextures(1, &depthBuffID);
glBindTexture(GL_TEXTURE_2D, depthBuffID);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
internalFormat = GL_DEPTH_COMPONENT24;
type = GL_UNSIGNED_INT;
glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, bufferSize.w, bufferSize.h, 0, GL_DEPTH_COMPONENT, type, NULL);
// Initialize VR structures, filling out description.
desc = ovr_GetHmdDesc(hmd);
eyeRenderDesc[0] = ovr_GetRenderDesc(hmd, ovrEye_Left, desc.DefaultEyeFov[0]);
eyeRenderDesc[1] = ovr_GetRenderDesc(hmd, ovrEye_Right, desc.DefaultEyeFov[1]);
hmdToEyeViewOffset[0] = eyeRenderDesc[0].HmdToEyeViewOffset;
hmdToEyeViewOffset[1] = eyeRenderDesc[1].HmdToEyeViewOffset;
// Initialize our single full screen Fov layer.
layer.Header.Type = ovrLayerType_EyeFov;
layer.Header.Flags = 0;
layer.ColorTexture[0] = pTextureSet0;
layer.ColorTexture[1] = pTextureSet1;
layer.Fov[0] = eyeRenderDesc[0].Fov;
layer.Fov[1] = eyeRenderDesc[1].Fov;
layer.Viewport[0].Pos.x = 0;
layer.Viewport[0].Pos.y = 0;
layer.Viewport[0].Size.w = bufferSize.w / 2;
layer.Viewport[0].Size.h = bufferSize.h;
layer.Viewport[1].Pos.x = bufferSize.w / 2;
layer.Viewport[1].Pos.y = 0;
layer.Viewport[1].Size.w = bufferSize.w / 2;
layer.Viewport[1].Size.h = bufferSize.h;
viewOffset[0] = eyeRenderDesc[0].HmdToEyeViewOffset;
viewOffset[1] = eyeRenderDesc[1].HmdToEyeViewOffset;
viewScaleDesc.HmdSpaceToWorldScaleInMeters = 1.0f;
viewScaleDesc.HmdToEyeViewOffset[0] = viewOffset[0];
viewScaleDesc.HmdToEyeViewOffset[1] = viewOffset[1];
layers = &layer.Header;
// ld.RenderPose is updated later per frame.
// Enable the oculus capabilities:
layer.Header.Flags = ovrLayerFlag_TextureOriginAtBottomLeft;
tex0->OGL.TexId = RenderedTexture;
tex0->OGL.Header.API = ovrRenderAPI_OpenGL;
tex0->OGL.Header.TextureSize = bufferSize;
tex0->Texture.Header.TextureSize = bufferSize;
tex0->Texture.Header.API = ovrRenderAPI_OpenGL;
tex1->OGL.TexId = RenderedTexture;
}
void Render(){
//Render on generated Framebuffer & Texture
glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName);
glBindTexture(GL_TEXTURE_2D, RenderedTexture);
glClearColor(1, 1, 0, 0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glBegin(GL_TRIANGLES);
glColor3f(1.f, 0.f, 0.f);
glVertex3f(-0.6f, -0.4f, 0.f);
glColor3f(0.f, 1.f, 0.f);
glVertex3f(0.6f, -0.4f, 0.f);
glColor3f(0.f, 0.f, 1.f);
glVertex3f(0.f, 0.6f, 0.f);
glEnd();
}
void TextureMapping(){
// release state
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glClearColor(0, 0, 0.5f, 0.f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBindTexture(GL_TEXTURE_2D, RenderedTexture);
glLoadIdentity();
glTexImage2D(GL_TEXTURE_2D, 0, GL_SRGB8_ALPHA8, EyeWidth, EyeHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glColor4f(1.f, 1.f, 1.f, 1.f);
glBegin(GL_QUADS);
glNormal3f(0, 0, 1.0f);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-0.6f, -0.6f, 1.f);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(0.6f, -0.6f, 1.f);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(0.6f, 0.6f, 1.f);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-0.6f, 0.6f, 1.f);
glEnd();
}
void hmdRender(){
pTextureSet0->CurrentIndex = (pTextureSet0->CurrentIndex + 1) % pTextureSet0->TextureCount;
//Render on generated Framebuffer & Texture
glBindFramebuffer(GL_READ_FRAMEBUFFER, FramebufferName);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, ovrFramebuffer);
//glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex0->OGL.TexId, 0);
// Set its depth layer as our depth buffer
//glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex1->OGL.TexId, 0);
// Clear the frame buffer
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthBuffID, 0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
// Bind the left or right ZED image
glBindTexture(GL_TEXTURE_2D, tex0->OGL.TexId);
//glTexImage2D(GL_TEXTURE_2D, 0, GL_SRGB8_ALPHA8, EyeWidth, EyeHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
//displayMidpointSeconds = ovr_GetPredictedDisplayTime(hmd, 0);
hmdState = ovr_GetTrackingState(hmd, displayMidpointSeconds);
result = ovr_SubmitFrame(hmd, 0, nullptr, &layers, 1);
// specify source, destination drawing (sub)rectangles.
}
void ErrorCallback(int error, const char* description) {
std::cout << description << std::endl;
}
void main(){
hmdInit();
hmdSensorInit();
hmdTexInit();
GLFWwindow* window = NULL;
glfwSetErrorCallback(ErrorCallback);
if (!glfwInit())
exit(EXIT_FAILURE);
//hmdInit();
//hmdRenderInit();
window = glfwCreateWindow(EyeWidth, EyeHeight, "Tutorial 00: Test", NULL, NULL);
if (!window) {
glfwTerminate();
exit(EXIT_FAILURE);
}
glfwMakeContextCurrent(window);
glfwSwapInterval(0);
//glfwSetWindowSizeCallback(window, WindowSizeChangeCallback);
glewInit();
hmdRenderInit();
InitApp();
while (!glfwWindowShouldClose(window))
{
glfwSwapBuffers(window);
Render();
TextureMapping();
hmdRender();
glfwPollEvents();
}
glfwDestroyWindow(window);
glfwTerminate();
return ;
}
-GlobalVariable.h
//header, library, etc
#define GLFW_DLL
#define GLFW_INCLUDE_GLU
#include "glew-1.13.0-win32\glew-1.13.0\include\GL\glew.h"
#include "glfw-3.1.2.bin.WIN32\glfw-3.1.2.bin.WIN32\include\GLFW\glfw3.h"
#include "OculusSDK\LibOVR\Include\OVR_CAPI_GL.h"
#include <gl/GL.h>
#include <gl/GLU.h>
#include <iostream>
#include <fstream>
#pragma comment(lib, "opengl32.lib")
#pragma comment(lib, "glew32.lib")
#pragma comment(lib, "glfw3dll.lib")
#pragma comment(lib, "glu32.lib")
#pragma comment(lib, "LibOVR.lib")
//Variables
GLuint FramebufferName;
GLuint RenderedTexture;
GLuint ovrFramebuffer;
//OVR
ovrResult result;
ovrHmd hmd;
ovrGraphicsLuid luid;
ovrHmdDesc desc;
ovrSizei resolution;
ovrTrackingState ts;
double ftiming;
//eyes
int EyeWidth = 100;
int EyeHeight = 100;
ovrSizei recommenedTex0Size;
ovrSizei recommenedTex1Size;
ovrEyeRenderDesc eyeRenderDesc[2];
ovrVector3f hmdToEyeViewOffset[2];
ovrVector3f viewOffset[2];
ovrViewScaleDesc viewScaleDesc;
//ovr Texture
ovrSizei bufferSize;
ovrSwapTextureSet * pTextureSet0;
ovrSwapTextureSet * pTextureSet1;
ovrGLTexture* tex0;
ovrGLTexture* tex1;
ovrLayerEyeFov layer;
ovrLayerHeader* layers;
double displayMidpointSeconds;
ovrTrackingState hmdState;
GLuint depthBuffID;
GLenum internalFormat;
GLenum type;