mirror of
https://github.com/overte-org/overte.git
synced 2025-04-30 00:42:46 +02:00
Working on mac oculus rendering
This commit is contained in:
parent
ea74aac1d6
commit
14b0f7d159
3 changed files with 57 additions and 32 deletions
|
@ -49,7 +49,7 @@ void OculusBaseDisplayPlugin::preRender() {
|
||||||
ovrHmd_GetEyePoses(_hmd, _frameIndex, _eyeOffsets, _eyePoses, nullptr);
|
ovrHmd_GetEyePoses(_hmd, _frameIndex, _eyeOffsets, _eyePoses, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
glm::mat4 OculusBaseDisplayPlugin::getProjection(Eye eye, const glm::mat4& baseProjection) const {
|
glm::mat4 OculusBaseDisplayPlu gin::getProjection(Eye eye, const glm::mat4& baseProjection) const {
|
||||||
return _eyeProjections[eye];
|
return _eyeProjections[eye];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -52,18 +52,18 @@ bool Oculus_0_5_DisplayPlugin::isSupported() const {
|
||||||
|
|
||||||
static const char* OVR_DISTORTION_VS = R"SHADER(#version 120
|
static const char* OVR_DISTORTION_VS = R"SHADER(#version 120
|
||||||
#pragma line __LINE__
|
#pragma line __LINE__
|
||||||
uniform vec2 EyeToSourceUVScale;
|
|
||||||
|
//uniform vec2 EyeToSourceUVScale;
|
||||||
|
const vec2 EyeToSourceUVScale = vec2(0.232447237, 0.375487238);
|
||||||
uniform vec2 EyeToSourceUVOffset;
|
uniform vec2 EyeToSourceUVOffset;
|
||||||
uniform mat4 EyeRotationStart;
|
uniform mat4 EyeRotationStart;
|
||||||
uniform mat4 EyeRotationEnd;
|
uniform mat4 EyeRotationEnd;
|
||||||
|
|
||||||
attribute vec2 Position;
|
attribute vec4 Position;
|
||||||
attribute vec4 Color;
|
|
||||||
attribute vec2 TexCoord0;
|
attribute vec2 TexCoord0;
|
||||||
attribute vec2 TexCoord1;
|
attribute vec2 TexCoord1;
|
||||||
attribute vec2 TexCoord2;
|
attribute vec2 TexCoord2;
|
||||||
|
|
||||||
varying vec4 oColor;
|
|
||||||
varying vec2 oTexCoord0;
|
varying vec2 oTexCoord0;
|
||||||
varying vec2 oTexCoord1;
|
varying vec2 oTexCoord1;
|
||||||
varying vec2 oTexCoord2;
|
varying vec2 oTexCoord2;
|
||||||
|
@ -73,6 +73,10 @@ void main() {
|
||||||
gl_Position.y = Position.y;
|
gl_Position.y = Position.y;
|
||||||
gl_Position.z = 0.0;
|
gl_Position.z = 0.0;
|
||||||
gl_Position.w = 1.0;
|
gl_Position.w = 1.0;
|
||||||
|
oTexCoord0 = TexCoord0;
|
||||||
|
oTexCoord1 = TexCoord1;
|
||||||
|
oTexCoord2 = TexCoord2;
|
||||||
|
|
||||||
// Vertex inputs are in TanEyeAngle space for the R,G,B channels (i.e. after chromatic aberration and distortion).
|
// Vertex inputs are in TanEyeAngle space for the R,G,B channels (i.e. after chromatic aberration and distortion).
|
||||||
// These are now "real world" vectors in direction (x,y,1) relative to the eye of the HMD.
|
// These are now "real world" vectors in direction (x,y,1) relative to the eye of the HMD.
|
||||||
vec3 TanEyeAngleR = vec3 ( TexCoord0.x, TexCoord0.y, 1.0 );
|
vec3 TanEyeAngleR = vec3 ( TexCoord0.x, TexCoord0.y, 1.0 );
|
||||||
|
@ -86,9 +90,9 @@ void main() {
|
||||||
vec3 TransformedGEnd = (EyeRotationEnd * vec4(TanEyeAngleG, 0)).xyz;
|
vec3 TransformedGEnd = (EyeRotationEnd * vec4(TanEyeAngleG, 0)).xyz;
|
||||||
vec3 TransformedBEnd = (EyeRotationEnd * vec4(TanEyeAngleB, 0)).xyz;
|
vec3 TransformedBEnd = (EyeRotationEnd * vec4(TanEyeAngleB, 0)).xyz;
|
||||||
// And blend between them.
|
// And blend between them.
|
||||||
vec3 TransformedR = mix ( TransformedRStart, TransformedREnd, Color.a );
|
vec3 TransformedR = mix ( TransformedRStart, TransformedREnd, Position.z );
|
||||||
vec3 TransformedG = mix ( TransformedGStart, TransformedGEnd, Color.a );
|
vec3 TransformedG = mix ( TransformedGStart, TransformedGEnd, Position.z );
|
||||||
vec3 TransformedB = mix ( TransformedBStart, TransformedBEnd, Color.a );
|
vec3 TransformedB = mix ( TransformedBStart, TransformedBEnd, Position.z );
|
||||||
|
|
||||||
// Project them back onto the Z=1 plane of the rendered images.
|
// Project them back onto the Z=1 plane of the rendered images.
|
||||||
float RecipZR = 1.0 / TransformedR.z;
|
float RecipZR = 1.0 / TransformedR.z;
|
||||||
|
@ -103,10 +107,13 @@ void main() {
|
||||||
vec2 SrcCoordR = FlattenedR * EyeToSourceUVScale + EyeToSourceUVOffset;
|
vec2 SrcCoordR = FlattenedR * EyeToSourceUVScale + EyeToSourceUVOffset;
|
||||||
vec2 SrcCoordG = FlattenedG * EyeToSourceUVScale + EyeToSourceUVOffset;
|
vec2 SrcCoordG = FlattenedG * EyeToSourceUVScale + EyeToSourceUVOffset;
|
||||||
vec2 SrcCoordB = FlattenedB * EyeToSourceUVScale + EyeToSourceUVOffset;
|
vec2 SrcCoordB = FlattenedB * EyeToSourceUVScale + EyeToSourceUVOffset;
|
||||||
|
// vec2 SrcCoordR = FlattenedR + EyeToSourceUVOffset;
|
||||||
|
// vec2 SrcCoordG = FlattenedG + EyeToSourceUVOffset;
|
||||||
|
// vec2 SrcCoordB = FlattenedB + EyeToSourceUVOffset;
|
||||||
|
|
||||||
oTexCoord0 = SrcCoordR;
|
oTexCoord0 = SrcCoordR;
|
||||||
oTexCoord1 = SrcCoordG;
|
oTexCoord1 = SrcCoordG;
|
||||||
oTexCoord2 = SrcCoordB;
|
oTexCoord2 = SrcCoordB;
|
||||||
oColor = vec4(Color.r, Color.r, Color.r, Color.r); // Used for vignette fade.
|
|
||||||
}
|
}
|
||||||
|
|
||||||
)SHADER";
|
)SHADER";
|
||||||
|
@ -118,11 +125,13 @@ uniform sampler2D Texture0;
|
||||||
#extension GL_ARB_draw_buffers : enable
|
#extension GL_ARB_draw_buffers : enable
|
||||||
#extension GL_EXT_gpu_shader4 : enable
|
#extension GL_EXT_gpu_shader4 : enable
|
||||||
|
|
||||||
varying vec4 oColor;
|
|
||||||
varying vec2 oTexCoord0;
|
varying vec2 oTexCoord0;
|
||||||
|
varying vec2 oTexCoord1;
|
||||||
|
varying vec2 oTexCoord2;
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
gl_FragColor = vec4(0, 0, 0, 1); // texture2D(Texture0, oTexCoord0, 0.0);
|
gl_FragColor = vec4(oTexCoord0, 0, 1);
|
||||||
|
gl_FragColor = texture2D(Texture0, oTexCoord0, 0.0);
|
||||||
//gl_FragColor.a = 1.0;
|
//gl_FragColor.a = 1.0;
|
||||||
}
|
}
|
||||||
)SHADER";
|
)SHADER";
|
||||||
|
@ -147,8 +156,8 @@ void Oculus_0_5_DisplayPlugin::activate(PluginContainer * container) {
|
||||||
_hmdWindow->setFlags(Qt::FramelessWindowHint);
|
_hmdWindow->setFlags(Qt::FramelessWindowHint);
|
||||||
_hmdWindow->setFormat(format);
|
_hmdWindow->setFormat(format);
|
||||||
_hmdWindow->create();
|
_hmdWindow->create();
|
||||||
//_hmdWindow->setGeometry(_hmd->WindowsPos.x, _hmd->WindowsPos.y, _hmd->Resolution.w, _hmd->Resolution.h);
|
_hmdWindow->setGeometry(_hmd->WindowsPos.x, _hmd->WindowsPos.y, _hmd->Resolution.w, _hmd->Resolution.h);
|
||||||
_hmdWindow->setGeometry(0, -1080, _hmd->Resolution.w, _hmd->Resolution.h);
|
//_hmdWindow->setGeometry(0, -1080, _hmd->Resolution.w, _hmd->Resolution.h);
|
||||||
_hmdWindow->show();
|
_hmdWindow->show();
|
||||||
_hmdWindow->installEventFilter(this);
|
_hmdWindow->installEventFilter(this);
|
||||||
_hmdWindow->makeCurrent();
|
_hmdWindow->makeCurrent();
|
||||||
|
@ -180,7 +189,7 @@ void Oculus_0_5_DisplayPlugin::activate(PluginContainer * container) {
|
||||||
compileProgram(_distortProgram, OVR_DISTORTION_VS, OVR_DISTORTION_FS);
|
compileProgram(_distortProgram, OVR_DISTORTION_VS, OVR_DISTORTION_FS);
|
||||||
|
|
||||||
auto uniforms = _distortProgram->ActiveUniforms();
|
auto uniforms = _distortProgram->ActiveUniforms();
|
||||||
for (int i = 0; i < uniforms.Size(); ++i) {
|
for (size_t i = 0; i < uniforms.Size(); ++i) {
|
||||||
auto uniform = uniforms.At(i);
|
auto uniform = uniforms.At(i);
|
||||||
qDebug() << uniform.Name().c_str() << " @ " << uniform.Index();
|
qDebug() << uniform.Name().c_str() << " @ " << uniform.Index();
|
||||||
if (uniform.Name() == String("EyeToSourceUVScale")) {
|
if (uniform.Name() == String("EyeToSourceUVScale")) {
|
||||||
|
@ -195,7 +204,7 @@ void Oculus_0_5_DisplayPlugin::activate(PluginContainer * container) {
|
||||||
}
|
}
|
||||||
|
|
||||||
auto attribs = _distortProgram->ActiveAttribs();
|
auto attribs = _distortProgram->ActiveAttribs();
|
||||||
for (int i = 0; i < attribs.Size(); ++i) {
|
for (size_t i = 0; i < attribs.Size(); ++i) {
|
||||||
auto attrib = attribs.At(i);
|
auto attrib = attribs.At(i);
|
||||||
qDebug() << attrib.Name().c_str() << " @ " << attrib.Index();
|
qDebug() << attrib.Name().c_str() << " @ " << attrib.Index();
|
||||||
if (attrib.Name() == String("Position")) {
|
if (attrib.Name() == String("Position")) {
|
||||||
|
@ -230,7 +239,7 @@ void Oculus_0_5_DisplayPlugin::activate(PluginContainer * container) {
|
||||||
}
|
}
|
||||||
ovrHmd_DestroyDistortionMesh(&meshData);
|
ovrHmd_DestroyDistortionMesh(&meshData);
|
||||||
const auto& header = _eyeTextures[eye].Header;
|
const auto& header = _eyeTextures[eye].Header;
|
||||||
ovrHmd_GetRenderScaleAndOffset(_eyeFovs[eye], header.TextureSize, header.RenderViewport, _offsetAndScale[eye]);
|
ovrHmd_GetRenderScaleAndOffset(_eyeFovs[eye], header.TextureSize, header.RenderViewport, _scaleAndOffset[eye]);
|
||||||
});
|
});
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -283,19 +292,35 @@ void Oculus_0_5_DisplayPlugin::display(GLuint finalTexture, const glm::uvec2& sc
|
||||||
_distortProgram->Bind();
|
_distortProgram->Bind();
|
||||||
glBindTexture(GL_TEXTURE_2D, finalTexture);
|
glBindTexture(GL_TEXTURE_2D, finalTexture);
|
||||||
glViewport(0, 0, _hmd->Resolution.w, _hmd->Resolution.h);
|
glViewport(0, 0, _hmd->Resolution.w, _hmd->Resolution.h);
|
||||||
// Generates internal compiler error on MSVC 12
|
|
||||||
ovr_for_each_eye([&](ovrEyeType eye){
|
ovr_for_each_eye([&](ovrEyeType eye){
|
||||||
glUniform2fv(_uniformOffset, 1, &_offsetAndScale[eye][0].x);
|
// ovrMatrix4f timeWarpMatrices[2];
|
||||||
glUniform2fv(_uniformScale, 1, &_offsetAndScale[eye][1].x);
|
// ovrHmd_GetEyeTimewarpMatrices(_hmd, eye, _eyePoses[eye], timeWarpMatrices);
|
||||||
|
// glUniformMatrix4fv(_uniformEyeRotStart, 1, GL_TRUE, &(timeWarpMatrices[0].M[0][0]));
|
||||||
|
// glUniformMatrix4fv(_uniformEyeRotEnd, 1, GL_TRUE, &(timeWarpMatrices[1].M[0][0]));
|
||||||
|
mat4 identity;
|
||||||
|
glUniformMatrix4fv(_uniformEyeRotStart, 1, GL_FALSE, &identity[0][0]);
|
||||||
|
glUniformMatrix4fv(_uniformEyeRotEnd, 1, GL_FALSE, &identity[0][0]);
|
||||||
|
|
||||||
|
vec2 scale(1);
|
||||||
|
// glUniform2fv(_uniformScale, 1, &_scaleAndOffset[eye][0].x);
|
||||||
|
glUniform2fv(_uniformScale, 1, &scale.x);
|
||||||
|
|
||||||
|
glUniform2fv(_uniformOffset, 1, &_scaleAndOffset[eye][1].x);
|
||||||
|
|
||||||
_eyeVertexBuffers[eye]->Bind(Buffer::Target::Array);
|
_eyeVertexBuffers[eye]->Bind(Buffer::Target::Array);
|
||||||
glEnableVertexAttribArray(_attrPosition);
|
glEnableVertexAttribArray(_attrPosition);
|
||||||
glVertexAttribPointer(_attrPosition, 2, GL_FLOAT, GL_FALSE, sizeof(ovrDistortionVertex), (void*)offsetof(ovrDistortionVertex, ScreenPosNDC));
|
size_t offset;
|
||||||
|
offset = offsetof(ovrDistortionVertex, ScreenPosNDC);
|
||||||
|
glVertexAttribPointer(_attrPosition, 2, GL_FLOAT, GL_FALSE, sizeof(ovrDistortionVertex), (void*)offset);
|
||||||
glEnableVertexAttribArray(_attrTexCoord0);
|
glEnableVertexAttribArray(_attrTexCoord0);
|
||||||
glVertexAttribPointer(_attrTexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(ovrDistortionVertex), (void*)offsetof(ovrDistortionVertex, TanEyeAnglesR));
|
offset = offsetof(ovrDistortionVertex, TanEyeAnglesR);
|
||||||
|
glVertexAttribPointer(_attrTexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(ovrDistortionVertex), (void*)offset);
|
||||||
glEnableVertexAttribArray(_attrTexCoord1);
|
glEnableVertexAttribArray(_attrTexCoord1);
|
||||||
glVertexAttribPointer(_attrTexCoord1, 2, GL_FLOAT, GL_FALSE, sizeof(ovrDistortionVertex), (void*)offsetof(ovrDistortionVertex, TanEyeAnglesG));
|
offset = offsetof(ovrDistortionVertex, TanEyeAnglesG);
|
||||||
|
glVertexAttribPointer(_attrTexCoord1, 2, GL_FLOAT, GL_FALSE, sizeof(ovrDistortionVertex), (void*)offset);
|
||||||
glEnableVertexAttribArray(_attrTexCoord2);
|
glEnableVertexAttribArray(_attrTexCoord2);
|
||||||
glVertexAttribPointer(_attrTexCoord2, 2, GL_FLOAT, GL_FALSE, sizeof(ovrDistortionVertex), (void*)offsetof(ovrDistortionVertex, TanEyeAnglesB));
|
offset = offsetof(ovrDistortionVertex, TanEyeAnglesB);
|
||||||
|
glVertexAttribPointer(_attrTexCoord2, 2, GL_FLOAT, GL_FALSE, sizeof(ovrDistortionVertex), (void*)offset);
|
||||||
_eyeIndexBuffers[eye]->Bind(Buffer::Target::ElementArray);
|
_eyeIndexBuffers[eye]->Bind(Buffer::Target::ElementArray);
|
||||||
glDrawElements(GL_TRIANGLES, _indexCount[eye], GL_UNSIGNED_SHORT, 0);
|
glDrawElements(GL_TRIANGLES, _indexCount[eye], GL_UNSIGNED_SHORT, 0);
|
||||||
glDisableVertexAttribArray(_attrPosition);
|
glDisableVertexAttribArray(_attrPosition);
|
||||||
|
|
|
@ -42,20 +42,20 @@ private:
|
||||||
ovrTexture _eyeTextures[2];
|
ovrTexture _eyeTextures[2];
|
||||||
#if RIFT_SDK_DISTORTION
|
#if RIFT_SDK_DISTORTION
|
||||||
#else
|
#else
|
||||||
ovrVector2f _offsetAndScale[2][2];
|
ovrVector2f _scaleAndOffset[2][2];
|
||||||
ProgramPtr _distortProgram;
|
ProgramPtr _distortProgram;
|
||||||
BufferPtr _eyeIndexBuffers[2];
|
BufferPtr _eyeIndexBuffers[2];
|
||||||
BufferPtr _eyeVertexBuffers[2];
|
BufferPtr _eyeVertexBuffers[2];
|
||||||
GLuint _indexCount[2];
|
GLuint _indexCount[2];
|
||||||
|
|
||||||
GLuint _uniformScale{ -1 };
|
GLint _uniformScale{ -1 };
|
||||||
GLuint _uniformOffset{ -1 };
|
GLint _uniformOffset{ -1 };
|
||||||
GLuint _uniformEyeRotStart{ -1 };
|
GLint _uniformEyeRotStart{ -1 };
|
||||||
GLuint _uniformEyeRotEnd{ -1 };
|
GLint _uniformEyeRotEnd{ -1 };
|
||||||
GLuint _attrPosition{ -1 };
|
GLint _attrPosition{ -1 };
|
||||||
GLuint _attrTexCoord0{ -1 };
|
GLint _attrTexCoord0{ -1 };
|
||||||
GLuint _attrTexCoord1{ -1 };
|
GLint _attrTexCoord1{ -1 };
|
||||||
GLuint _attrTexCoord2{ -1 };
|
GLint _attrTexCoord2{ -1 };
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
static const QString NAME;
|
static const QString NAME;
|
||||||
|
|
Loading…
Reference in a new issue