Implementation of OpenGL ES Multiview

Now render thread takes 50% CPU time since it only runs once.

More work is needed as GUIs are messed up
This commit is contained in:
Simon 2020-10-07 19:05:09 +01:00
parent 531a24c236
commit 74acf16f9d
40 changed files with 744 additions and 460 deletions

View file

@ -256,8 +256,8 @@ static void EglInitExtensions()
glExtensions.multi_view = strstr( allExtensions, "GL_OVR_multiview2" ) &&
strstr( allExtensions, "GL_OVR_multiview_multisampled_render_to_texture" );
glExtensions.EXT_texture_border_clamp = false;//strstr( allExtensions, "GL_EXT_texture_border_clamp" ) ||
//strstr( allExtensions, "GL_OES_texture_border_clamp" );
glExtensions.EXT_texture_border_clamp = strstr( allExtensions, "GL_EXT_texture_border_clamp" ) ||
strstr( allExtensions, "GL_OES_texture_border_clamp" );
}
}
@ -500,114 +500,222 @@ static void ovrFramebuffer_Clear( ovrFramebuffer * frameBuffer )
typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples);
#if !defined(GL_OVR_multiview)
/// static const int GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_OVR = 0x9630;
/// static const int GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_OVR = 0x9632;
/// static const int GL_MAX_VIEWS_OVR = 0x9631;
typedef void(GL_APIENTRY* PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC)(
GLenum target,
GLenum attachment,
GLuint texture,
GLint level,
GLint baseViewIndex,
GLsizei numViews);
#endif
static bool ovrFramebuffer_Create( ovrFramebuffer * frameBuffer, const GLenum colorFormat, const int width, const int height, const int multisamples )
{
frameBuffer->Width = width;
#if !defined(GL_OVR_multiview_multisampled_render_to_texture)
typedef void(GL_APIENTRY* PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC)(
GLenum target,
GLenum attachment,
GLuint texture,
GLint level,
GLsizei samples,
GLint baseViewIndex,
GLsizei numViews);
#endif
static bool ovrFramebuffer_Create(
ovrFramebuffer* frameBuffer,
const bool useMultiview,
const GLenum colorFormat,
const int width,
const int height,
const int multisamples) {
PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC glRenderbufferStorageMultisampleEXT =
(PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)eglGetProcAddress(
"glRenderbufferStorageMultisampleEXT");
PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC glFramebufferTexture2DMultisampleEXT =
(PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC)eglGetProcAddress(
"glFramebufferTexture2DMultisampleEXT");
PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC glFramebufferTextureMultiviewOVR =
(PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC)eglGetProcAddress(
"glFramebufferTextureMultiviewOVR");
PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC glFramebufferTextureMultisampleMultiviewOVR =
(PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC)eglGetProcAddress(
"glFramebufferTextureMultisampleMultiviewOVR");
frameBuffer->Width = width;
frameBuffer->Height = height;
frameBuffer->Multisamples = multisamples;
frameBuffer->UseMultiview =
(useMultiview && (glFramebufferTextureMultiviewOVR != NULL)) ? true : false;
frameBuffer->ColorTextureSwapChain = vrapi_CreateTextureSwapChain3( VRAPI_TEXTURE_TYPE_2D, colorFormat, frameBuffer->Width, frameBuffer->Height, 1, 3 );
if (frameBuffer->ColorTextureSwapChain == NULL)
{
ALOGE("Couldn't create swap chain");
return false;
}
frameBuffer->ColorTextureSwapChain = vrapi_CreateTextureSwapChain3(
frameBuffer->UseMultiview ? VRAPI_TEXTURE_TYPE_2D_ARRAY : VRAPI_TEXTURE_TYPE_2D,
colorFormat,
width,
height,
1,
3);
frameBuffer->TextureSwapChainLength =
vrapi_GetTextureSwapChainLength(frameBuffer->ColorTextureSwapChain);
frameBuffer->DepthBuffers =
(GLuint*)malloc(frameBuffer->TextureSwapChainLength * sizeof(GLuint));
frameBuffer->FrameBuffers =
(GLuint*)malloc(frameBuffer->TextureSwapChainLength * sizeof(GLuint));
frameBuffer->TextureSwapChainLength = vrapi_GetTextureSwapChainLength( frameBuffer->ColorTextureSwapChain );
frameBuffer->DepthBuffers = (GLuint *)malloc( frameBuffer->TextureSwapChainLength * sizeof( GLuint ) );
frameBuffer->FrameBuffers = (GLuint *)malloc( frameBuffer->TextureSwapChainLength * sizeof( GLuint ) );
ALOGV(" frameBuffer->UseMultiview = %d", frameBuffer->UseMultiview);
PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC glRenderbufferStorageMultisampleEXT =
(PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)eglGetProcAddress("glRenderbufferStorageMultisampleEXT");
PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC glFramebufferTexture2DMultisampleEXT =
(PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC)eglGetProcAddress("glFramebufferTexture2DMultisampleEXT");
for ( int i = 0; i < frameBuffer->TextureSwapChainLength; i++ )
{
for (int i = 0; i < frameBuffer->TextureSwapChainLength; i++) {
// Create the color buffer texture.
const GLuint colorTexture = vrapi_GetTextureSwapChainHandle( frameBuffer->ColorTextureSwapChain, i );
GLenum colorTextureTarget = GL_TEXTURE_2D;
GL( glBindTexture( colorTextureTarget, colorTexture ) );
// Just clamp to edge. However, this requires manually clearing the border
// around the layer to clear the edge texels.
GL( glTexParameteri( colorTextureTarget, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE ) );
GL( glTexParameteri( colorTextureTarget, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE ) );
const GLuint colorTexture =
vrapi_GetTextureSwapChainHandle(frameBuffer->ColorTextureSwapChain, i);
GLenum colorTextureTarget = frameBuffer->UseMultiview ? GL_TEXTURE_2D_ARRAY : GL_TEXTURE_2D;
GL(glBindTexture(colorTextureTarget, colorTexture));
GL(glTexParameteri(colorTextureTarget, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER));
GL(glTexParameteri(colorTextureTarget, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER));
GLfloat borderColor[] = {0.0f, 0.0f, 0.0f, 0.0f};
GL(glTexParameterfv(colorTextureTarget, GL_TEXTURE_BORDER_COLOR, borderColor));
GL(glTexParameteri(colorTextureTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR));
GL(glTexParameteri(colorTextureTarget, GL_TEXTURE_MAG_FILTER, GL_LINEAR));
GL(glBindTexture(colorTextureTarget, 0));
GL( glTexParameteri( colorTextureTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR ) );
GL( glTexParameteri( colorTextureTarget, GL_TEXTURE_MAG_FILTER, GL_LINEAR ) );
GL( glBindTexture( colorTextureTarget, 0 ) );
if (frameBuffer->UseMultiview) {
// Create the depth buffer texture.
GL(glGenTextures(1, &frameBuffer->DepthBuffers[i]));
GL(glBindTexture(GL_TEXTURE_2D_ARRAY, frameBuffer->DepthBuffers[i]));
GL(glTexStorage3D(GL_TEXTURE_2D_ARRAY, 1, GL_DEPTH_COMPONENT24, width, height, 2));
GL(glBindTexture(GL_TEXTURE_2D_ARRAY, 0));
if (multisamples > 1 && glRenderbufferStorageMultisampleEXT != NULL && glFramebufferTexture2DMultisampleEXT != NULL)
{
// Create the frame buffer.
GL(glGenFramebuffers(1, &frameBuffer->FrameBuffers[i]));
GL(glBindFramebuffer(GL_DRAW_FRAMEBUFFER, frameBuffer->FrameBuffers[i]));
if (multisamples > 1 && (glFramebufferTextureMultisampleMultiviewOVR != NULL)) {
GL(glFramebufferTextureMultisampleMultiviewOVR(
GL_DRAW_FRAMEBUFFER,
GL_DEPTH_ATTACHMENT,
frameBuffer->DepthBuffers[i],
0 /* level */,
multisamples /* samples */,
0 /* baseViewIndex */,
2 /* numViews */));
GL(glFramebufferTextureMultisampleMultiviewOVR(
GL_DRAW_FRAMEBUFFER,
GL_COLOR_ATTACHMENT0,
colorTexture,
0 /* level */,
multisamples /* samples */,
0 /* baseViewIndex */,
2 /* numViews */));
} else {
GL(glFramebufferTextureMultiviewOVR(
GL_DRAW_FRAMEBUFFER,
GL_DEPTH_ATTACHMENT,
frameBuffer->DepthBuffers[i],
0 /* level */,
0 /* baseViewIndex */,
2 /* numViews */));
GL(glFramebufferTextureMultiviewOVR(
GL_DRAW_FRAMEBUFFER,
GL_COLOR_ATTACHMENT0,
colorTexture,
0 /* level */,
0 /* baseViewIndex */,
2 /* numViews */));
}
// Create multisampled depth buffer.
GL(glGenRenderbuffers(1, &frameBuffer->DepthBuffers[i]));
GL(glBindRenderbuffer(GL_RENDERBUFFER, frameBuffer->DepthBuffers[i]));
GL(glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, multisamples, GL_DEPTH24_STENCIL8, width, height));
GL(glBindRenderbuffer(GL_RENDERBUFFER, 0));
GL(GLenum renderFramebufferStatus = glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER));
GL(glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0));
if (renderFramebufferStatus != GL_FRAMEBUFFER_COMPLETE) {
ALOGE(
"Incomplete frame buffer object: %s",
GlFrameBufferStatusString(renderFramebufferStatus));
return false;
}
} else {
if (multisamples > 1 && glRenderbufferStorageMultisampleEXT != NULL &&
glFramebufferTexture2DMultisampleEXT != NULL) {
// Create multisampled depth buffer.
GL(glGenRenderbuffers(1, &frameBuffer->DepthBuffers[i]));
GL(glBindRenderbuffer(GL_RENDERBUFFER, frameBuffer->DepthBuffers[i]));
GL(glRenderbufferStorageMultisampleEXT(
GL_RENDERBUFFER, multisamples, GL_DEPTH_COMPONENT24, width, height));
GL(glBindRenderbuffer(GL_RENDERBUFFER, 0));
// Create the frame buffer.
GL(glGenFramebuffers(1, &frameBuffer->FrameBuffers[i]));
GL(glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer->FrameBuffers[i]));
GL(glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTexture, 0, multisamples));
GL(glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, frameBuffer->DepthBuffers[i]));
GL(GLenum renderFramebufferStatus = glCheckFramebufferStatus(GL_FRAMEBUFFER));
GL(glBindFramebuffer(GL_FRAMEBUFFER, 0));
if (renderFramebufferStatus != GL_FRAMEBUFFER_COMPLETE)
{
ALOGE("OVRHelper::Incomplete frame buffer object: %s", GlFrameBufferStatusString(renderFramebufferStatus));
return false;
}
}
else
{
{
// Create depth buffer.
GL( glGenRenderbuffers( 1, &frameBuffer->DepthBuffers[i] ) );
GL( glBindRenderbuffer( GL_RENDERBUFFER, frameBuffer->DepthBuffers[i] ) );
GL( glRenderbufferStorage( GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, frameBuffer->Width, frameBuffer->Height ) );
GL( glBindRenderbuffer( GL_RENDERBUFFER, 0 ) );
// Create the frame buffer.
// NOTE: glFramebufferTexture2DMultisampleEXT only works with GL_FRAMEBUFFER.
GL(glGenFramebuffers(1, &frameBuffer->FrameBuffers[i]));
GL(glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer->FrameBuffers[i]));
GL(glFramebufferTexture2DMultisampleEXT(
GL_FRAMEBUFFER,
GL_COLOR_ATTACHMENT0,
GL_TEXTURE_2D,
colorTexture,
0,
multisamples));
GL(glFramebufferRenderbuffer(
GL_FRAMEBUFFER,
GL_DEPTH_ATTACHMENT,
GL_RENDERBUFFER,
frameBuffer->DepthBuffers[i]));
GL(GLenum renderFramebufferStatus = glCheckFramebufferStatus(GL_FRAMEBUFFER));
GL(glBindFramebuffer(GL_FRAMEBUFFER, 0));
if (renderFramebufferStatus != GL_FRAMEBUFFER_COMPLETE) {
ALOGE(
"Incomplete frame buffer object: %s",
GlFrameBufferStatusString(renderFramebufferStatus));
return false;
}
} else {
// Create depth buffer.
GL(glGenRenderbuffers(1, &frameBuffer->DepthBuffers[i]));
GL(glBindRenderbuffer(GL_RENDERBUFFER, frameBuffer->DepthBuffers[i]));
GL(glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, width, height));
GL(glBindRenderbuffer(GL_RENDERBUFFER, 0));
// Create the frame buffer.
GL( glGenFramebuffers( 1, &frameBuffer->FrameBuffers[i] ) );
GL( glBindFramebuffer( GL_DRAW_FRAMEBUFFER, frameBuffer->FrameBuffers[i] ) );
GL( glFramebufferRenderbuffer( GL_DRAW_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, frameBuffer->DepthBuffers[i] ) );
GL( glFramebufferTexture2D( GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTexture, 0 ) );
GL( GLenum renderFramebufferStatus = glCheckFramebufferStatus( GL_DRAW_FRAMEBUFFER ) );
GL( glBindFramebuffer( GL_DRAW_FRAMEBUFFER, 0 ) );
if ( renderFramebufferStatus != GL_FRAMEBUFFER_COMPLETE )
{
ALOGE( "Incomplete frame buffer object: %s", GlFrameBufferStatusString( renderFramebufferStatus ) );
return false;
}
}
}
// Create the frame buffer.
GL(glGenFramebuffers(1, &frameBuffer->FrameBuffers[i]));
GL(glBindFramebuffer(GL_DRAW_FRAMEBUFFER, frameBuffer->FrameBuffers[i]));
GL(glFramebufferRenderbuffer(
GL_DRAW_FRAMEBUFFER,
GL_DEPTH_ATTACHMENT,
GL_RENDERBUFFER,
frameBuffer->DepthBuffers[i]));
GL(glFramebufferTexture2D(
GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTexture, 0));
GL(GLenum renderFramebufferStatus = glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER));
GL(glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0));
if (renderFramebufferStatus != GL_FRAMEBUFFER_COMPLETE) {
ALOGE(
"Incomplete frame buffer object: %s",
GlFrameBufferStatusString(renderFramebufferStatus));
return false;
}
}
}
}
return true;
}
void ovrFramebuffer_Destroy( ovrFramebuffer * frameBuffer )
{
GL( glDeleteFramebuffers( frameBuffer->TextureSwapChainLength, frameBuffer->FrameBuffers ) );
GL( glDeleteRenderbuffers( frameBuffer->TextureSwapChainLength, frameBuffer->DepthBuffers ) );
void ovrFramebuffer_Destroy(ovrFramebuffer* frameBuffer) {
GL(glDeleteFramebuffers(frameBuffer->TextureSwapChainLength, frameBuffer->FrameBuffers));
if (frameBuffer->UseMultiview) {
GL(glDeleteTextures(frameBuffer->TextureSwapChainLength, frameBuffer->DepthBuffers));
} else {
GL(glDeleteRenderbuffers(frameBuffer->TextureSwapChainLength, frameBuffer->DepthBuffers));
}
vrapi_DestroyTextureSwapChain(frameBuffer->ColorTextureSwapChain);
vrapi_DestroyTextureSwapChain( frameBuffer->ColorTextureSwapChain );
free(frameBuffer->DepthBuffers);
free(frameBuffer->FrameBuffers);
free( frameBuffer->DepthBuffers );
free( frameBuffer->FrameBuffers );
ovrFramebuffer_Clear( frameBuffer );
ovrFramebuffer_Clear(frameBuffer);
}
void ovrFramebuffer_SetCurrent( ovrFramebuffer * frameBuffer )
{
while (glGetError() != GL_NO_ERROR)
{
}
GL( glBindFramebuffer( GL_FRAMEBUFFER, frameBuffer->FrameBuffers[frameBuffer->ProcessingTextureSwapChainIndex] ) );
}
@ -621,9 +729,6 @@ void ovrFramebuffer_Resolve( ovrFramebuffer * frameBuffer )
// Discard the depth buffer, so the tiler won't need to write it back out to memory.
const GLenum depthAttachment[1] = { GL_DEPTH_ATTACHMENT };
glInvalidateFramebuffer( GL_DRAW_FRAMEBUFFER, 1, depthAttachment );
// Flush this frame worth of commands.
glFlush();
}
void ovrFramebuffer_Advance( ovrFramebuffer * frameBuffer )
@ -673,10 +778,7 @@ ovrRenderer
void ovrRenderer_Clear( ovrRenderer * renderer )
{
for ( int eye = 0; eye < VRAPI_FRAME_LAYER_EYE_MAX; eye++ )
{
ovrFramebuffer_Clear( &renderer->FrameBuffer[eye] );
}
ovrFramebuffer_Clear( &renderer->FrameBuffer );
renderer->ProjectionMatrix = ovrMatrix4f_CreateIdentity();
renderer->NumBuffers = VRAPI_FRAME_LAYER_EYE_MAX;
}
@ -684,20 +786,18 @@ void ovrRenderer_Clear( ovrRenderer * renderer )
void ovrRenderer_Create( int width, int height, ovrRenderer * renderer, const ovrJava * java )
{
renderer->NumBuffers = VRAPI_FRAME_LAYER_EYE_MAX;
renderer->NumBuffers = 1; // Multiview
//Now using a symmetrical render target, based on the horizontal FOV
vrFOV = vrapi_GetSystemPropertyInt( java, VRAPI_SYS_PROP_SUGGESTED_EYE_FOV_DEGREES_X);
// Create the render Textures.
for ( int eye = 0; eye < VRAPI_FRAME_LAYER_EYE_MAX; eye++ )
{
ovrFramebuffer_Create( &renderer->FrameBuffer[eye],
GL_RGBA8,
width,
height,
NUM_MULTI_SAMPLES );
}
// Create the multi view frame buffer
ovrFramebuffer_Create( &renderer->FrameBuffer,
true,
GL_RGBA8,
width,
height,
NUM_MULTI_SAMPLES );
// Setup the projection matrix.
renderer->ProjectionMatrix = ovrMatrix4f_CreateProjectionFov(
@ -707,10 +807,7 @@ void ovrRenderer_Create( int width, int height, ovrRenderer * renderer, const ov
void ovrRenderer_Destroy( ovrRenderer * renderer )
{
for ( int eye = 0; eye < renderer->NumBuffers; eye++ )
{
ovrFramebuffer_Destroy( &renderer->FrameBuffer[eye] );
}
ovrFramebuffer_Destroy( &renderer->FrameBuffer );
renderer->ProjectionMatrix = ovrMatrix4f_CreateIdentity();
}
@ -1266,15 +1363,15 @@ void VR_Init()
shutdown = false;
}
long renderThreadCPUTime[2] = {0, 0};
long renderThreadCPUTime = 0;
void Doom3Quest_prepareEyeBuffer(int eye )
{
renderThreadCPUTime[eye] = GetTimeInMilliSeconds();
renderThreadCPUTime = GetTimeInMilliSeconds();
ovrRenderer *renderer = Doom3Quest_useScreenLayer() ? &gAppState.Scene.CylinderRenderer : &gAppState.Renderer;
ovrFramebuffer *frameBuffer = &(renderer->FrameBuffer[eye]);
ovrFramebuffer *frameBuffer = &(renderer->FrameBuffer);
ovrFramebuffer_SetCurrent(frameBuffer);
GL(glEnable(GL_SCISSOR_TEST));
@ -1291,23 +1388,19 @@ void Doom3Quest_prepareEyeBuffer(int eye )
GL(glDisable(GL_SCISSOR_TEST));
}
void Doom3Quest_finishEyeBuffer(int eye )
void Doom3Quest_finishEyeBuffer( )
{
renderThreadCPUTime[eye] = GetTimeInMilliSeconds() - renderThreadCPUTime[eye];
renderThreadCPUTime = GetTimeInMilliSeconds() - renderThreadCPUTime;
if (eye == 1)
{
int totalTime = renderThreadCPUTime[0] + renderThreadCPUTime[1];
//__android_log_print(ANDROID_LOG_INFO, "Doom3Quest", "RENDER THREAD LEFT EYE CPU TIME: %i", renderThreadCPUTime[0]);
//__android_log_print(ANDROID_LOG_INFO, "Doom3Quest", "RENDER THREAD RIGHT EYE CPU TIME: %i", renderThreadCPUTime[1]);
__android_log_print(ANDROID_LOG_INFO, "Doom3Quest", "RENDER THREAD TOTAL CPU TIME: %i", totalTime);
__android_log_print(ANDROID_LOG_INFO, "Doom3Quest", "RENDER THREAD TOTAL CPU TIME: %i", renderThreadCPUTime);
}
GLCheckErrors( __LINE__ );
ovrRenderer *renderer = Doom3Quest_useScreenLayer() ? &gAppState.Scene.CylinderRenderer : &gAppState.Renderer;
ovrFramebuffer *frameBuffer = &(renderer->FrameBuffer[eye]);
ovrFramebuffer *frameBuffer = &(renderer->FrameBuffer);
//Clear edge to prevent smearing
ovrFramebuffer_ClearEdgeTexels(frameBuffer);
@ -1654,7 +1747,7 @@ void Doom3Quest_submitFrame()
layer.HeadPose = gAppState.Tracking[renderThreadFrameIndex % MAX_TRACKING_SAMPLES].HeadPose;
for ( int eye = 0; eye < VRAPI_FRAME_LAYER_EYE_MAX; eye++ )
{
ovrFramebuffer * frameBuffer = &gAppState.Renderer.FrameBuffer[gAppState.Renderer.NumBuffers == 1 ? 0 : eye];
ovrFramebuffer * frameBuffer = &gAppState.Renderer.FrameBuffer;
layer.Textures[eye].ColorSwapChain = frameBuffer->ColorTextureSwapChain;
layer.Textures[eye].SwapChainIndex = frameBuffer->ReadyTextureSwapChainIndex;

View file

@ -84,9 +84,9 @@ void Doom3Quest_getHMDOrientation();
void Doom3Quest_getTrackedRemotesOrientation(int controlscheme);
void Doom3Quest_prepareEyeBuffer(int eye);
void Doom3Quest_prepareEyeBuffer();
void Doom3Quest_finishEyeBuffer(int eye);
void Doom3Quest_finishEyeBuffer();
void Doom3Quest_submitFrame();

View file

@ -118,10 +118,10 @@ ovrLayerCylinder2 BuildCylinderLayer( ovrRenderer * cylinderRenderer,
const float circScale = density * 0.5f / textureWidth;
const float circBias = -circScale * ( 0.5f * ( 1.0f - 1.0f / circScale ) );
ovrFramebuffer * cylinderFrameBuffer = &cylinderRenderer->FrameBuffer;
for ( int eye = 0; eye < VRAPI_FRAME_LAYER_EYE_MAX; eye++ )
{
ovrFramebuffer * cylinderFrameBuffer = &cylinderRenderer->FrameBuffer[eye];
ovrMatrix4f modelViewMatrix = ovrMatrix4f_Multiply( &tracking->Eye[eye].ViewMatrix, &cylinderTransform );
layer.Textures[eye].TexCoordsFromTanAngles = ovrMatrix4f_Inverse( &modelViewMatrix );
layer.Textures[eye].ColorSwapChain = cylinderFrameBuffer->ColorTextureSwapChain;

View file

@ -64,6 +64,7 @@ typedef struct
ovrTextureSwapChain * ColorTextureSwapChain;
GLuint * DepthBuffers;
GLuint * FrameBuffers;
bool UseMultiview;
} ovrFramebuffer;
void ovrFramebuffer_SetCurrent( ovrFramebuffer * frameBuffer );
@ -83,7 +84,7 @@ ovrRenderer
typedef struct
{
ovrFramebuffer FrameBuffer[VRAPI_FRAME_LAYER_EYE_MAX];
ovrFramebuffer FrameBuffer;
ovrMatrix4f ProjectionMatrix;
int NumBuffers;
} ovrRenderer;

View file

@ -206,39 +206,29 @@ float SCR_DrawFPS( float y ) {
int new_y = idMath::FtoiFast(y) + 300;
int eye = cvarSystem->GetCVarInteger("vr_eye");
if (eye == 0) {
// don't use serverTime, because that will be drifting to
// correct for internet lag changes, timescales, timedemos, etc
t = Sys_Milliseconds();
frameTime = t - previous;
previous = t;
// don't use serverTime, because that will be drifting to
// correct for internet lag changes, timescales, timedemos, etc
t = Sys_Milliseconds();
frameTime = t - previous;
previous = t;
previousTimes[index % FPS_FRAMES] = frameTime;
index++;
if (index > FPS_FRAMES) {
// average multiple frames together to smooth changes out a bit
total = 0;
for (i = 0; i < FPS_FRAMES; i++) {
total += previousTimes[i];
}
if (!total) {
total = 1;
}
fps = 10000 * FPS_FRAMES / total;
fps = (fps + 5) / 10;
s = va("%ifps", fps);
w = strlen(s) * SMALLCHAR_WIDTH;
renderSystem->DrawSmallStringExt((634 / 2) - w, new_y, s, colorWhite, true,
localConsole.charSetShader);
previousTimes[index % FPS_FRAMES] = frameTime;
index++;
if (index > FPS_FRAMES) {
// average multiple frames together to smooth changes out a bit
total = 0;
for (i = 0; i < FPS_FRAMES; i++) {
total += previousTimes[i];
}
}
else {
//For right eye just use same value
if (!total) {
total = 1;
}
fps = 10000 * FPS_FRAMES / total;
fps = (fps + 5) / 10;
s = va("%ifps", fps);
w = strlen(s) * SMALLCHAR_WIDTH;
renderSystem->DrawSmallStringExt((634 / 2) - w, new_y, s, colorWhite, true,
localConsole.charSetShader);
}

View file

@ -2509,21 +2509,16 @@ void idSessionLocal::UpdateScreen( bool outOfSequence ) {
Sys_GrabMouseCursor( false );
}
for (int eye = 0; eye < 2; ++eye) {
renderSystem->BeginFrame(renderSystem->GetScreenWidth(), renderSystem->GetScreenHeight());
cvarSystem->SetCVarInteger("vr_eye", eye);
// draw everything
Draw();
renderSystem->BeginFrame(renderSystem->GetScreenWidth(), renderSystem->GetScreenHeight());
// draw everything
Draw();
if (com_speeds.GetBool()) {
renderSystem->EndFrame(&time_frontend, &time_backend);
} else {
renderSystem->EndFrame(NULL, NULL);
}
}
if (com_speeds.GetBool()) {
renderSystem->EndFrame(&time_frontend, &time_backend);
} else {
renderSystem->EndFrame(NULL, NULL);
}
insideUpdateScreen = false;
}

View file

@ -730,12 +730,12 @@ void idPlayerView::RenderPlayerView( idUserInterface *hud ) {
{
renderView_t *eyeView = view ? new renderView_t(*view) : NULL;
if (eyeView &&
/* if (eyeView &&
!game->InCinematic())
{
eyeView->vieworg += (vr_eye.GetInteger() == 0 ? 1.0f : -1.0f) * eyeView->viewaxis[1] *
(vr_ipd.GetFloat() / 2.0f) * vr_worldscale.GetFloat();
}
}*/
if (g_skipViewEffects.GetBool()) {
SingleView(hud, eyeView);

View file

@ -341,7 +341,6 @@ idCVar net_serverDlTable( "net_serverDlTable", "", CVAR_GAME | CVAR_ARCHIV
idCVar vr_ipd( "vr_ipd", "0.065", CVAR_GAME | CVAR_FLOAT | CVAR_ARCHIVE, "VR IPD" );
idCVar vr_worldscale( "vr_worldscale", "43.0", CVAR_GAME | CVAR_FLOAT | CVAR_ARCHIVE, "VR World Scale" );
idCVar vr_heightoffset( "vr_heightoffset", "0.0", CVAR_GAME | CVAR_FLOAT | CVAR_ARCHIVE, "VR Height Offset" );
idCVar vr_eye( "vr_eye", "0", CVAR_GAME | CVAR_INTEGER, "VR Eye currently being drawn" );
idCVar vr_controlscheme( "vr_controlscheme", "0", CVAR_GAME | CVAR_INTEGER, "VR Control Scheme: 0 = right handed, 10 = left handed" );
idCVar vr_shakeamplitude( "vr_shakeamplitude", "0.8", CVAR_FLOAT | CVAR_ARCHIVE, "Screen shake amplitude 0.0 = disabled to 1.0 = full\n", 0.0f, 1.0f );
idCVar vr_knockback( "vr_knockback", "0", CVAR_BOOL | CVAR_ARCHIVE | CVAR_GAME, "Enable damage knockback in VR. 0 = Disabled, 1 = Enabled" );

View file

@ -254,7 +254,6 @@ extern idCVar net_clientLagOMeter;
//VR CVARS
extern idCVar vr_ipd;
extern idCVar vr_worldscale;
extern idCVar vr_eye;
extern idCVar vr_heightoffset;
extern idCVar vr_controlscheme;
extern idCVar vr_shakeamplitude;

View file

@ -161,7 +161,7 @@ void idGuiModel::ReadFromDemo( idDemoFile *demo ) {
EmitSurface
================
*/
void idGuiModel::EmitSurface( guiModelSurface_t *surf, float modelMatrix[16], float modelViewMatrix[16], bool depthHack ) {
void idGuiModel::EmitSurface( guiModelSurface_t *surf, float modelMatrix[16], float centerModelViewMatrix[16], bool depthHack ) {
srfTriangles_t *tri;
if ( surf->numVerts == 0 ) {
@ -193,7 +193,9 @@ void idGuiModel::EmitSurface( guiModelSurface_t *surf, float modelMatrix[16], fl
viewEntity_t *guiSpace = (viewEntity_t *)R_ClearedFrameAlloc( sizeof( *guiSpace ) );
memcpy( guiSpace->modelMatrix, modelMatrix, sizeof( guiSpace->modelMatrix ) );
memcpy( guiSpace->modelViewMatrix, modelViewMatrix, sizeof( guiSpace->modelViewMatrix ) );
memcpy( guiSpace->centerModelViewMatrix, centerModelViewMatrix, sizeof( guiSpace->centerModelViewMatrix ) );
memcpy( guiSpace->modelViewMatrix[0], centerModelViewMatrix, sizeof( guiSpace->centerModelViewMatrix ) );
memcpy( guiSpace->modelViewMatrix[1], centerModelViewMatrix, sizeof( guiSpace->centerModelViewMatrix ) );
guiSpace->weaponDepthHack = depthHack;
// add the surface, which might recursively create another gui
@ -206,13 +208,13 @@ EmitToCurrentView
====================
*/
void idGuiModel::EmitToCurrentView( float modelMatrix[16], bool depthHack ) {
float modelViewMatrix[16];
float centerModelViewMatrix[16];
myGlMultMatrix( modelMatrix, tr.viewDef->worldSpace.modelViewMatrix,
modelViewMatrix );
myGlMultMatrix( modelMatrix, tr.viewDef->worldSpace.centerModelViewMatrix,
centerModelViewMatrix );
for ( int i = 0 ; i < surfaces.Num() ; i++ ) {
EmitSurface( &surfaces[i], modelMatrix, modelViewMatrix, depthHack );
EmitSurface( &surfaces[i], modelMatrix, centerModelViewMatrix, depthHack );
}
}
@ -273,10 +275,20 @@ void idGuiModel::EmitFullScreen( void ) {
viewDef->projectionMatrix[14] = -1.0f;
viewDef->projectionMatrix[15] = 1.0f;
viewDef->worldSpace.modelViewMatrix[0] = 1.0f;
viewDef->worldSpace.modelViewMatrix[5] = 1.0f;
viewDef->worldSpace.modelViewMatrix[10] = 1.0f;
viewDef->worldSpace.modelViewMatrix[15] = 1.0f;
for (int i = 0; i < 3; ++i) {
if (i < 2)
{
viewDef->worldSpace.modelViewMatrix[i][0] = 1.0f;
viewDef->worldSpace.modelViewMatrix[i][5] = 1.0f;
viewDef->worldSpace.modelViewMatrix[i][10] = 1.0f;
viewDef->worldSpace.modelViewMatrix[i][15] = 1.0f;
} else {
viewDef->worldSpace.centerModelViewMatrix[0] = 1.0f;
viewDef->worldSpace.centerModelViewMatrix[5] = 1.0f;
viewDef->worldSpace.centerModelViewMatrix[10] = 1.0f;
viewDef->worldSpace.centerModelViewMatrix[15] = 1.0f;
}
}
viewDef->maxDrawSurfs = surfaces.Num();
viewDef->drawSurfs = (drawSurf_t **)R_FrameAlloc( viewDef->maxDrawSurfs * sizeof( viewDef->drawSurfs[0] ) );
@ -287,7 +299,7 @@ void idGuiModel::EmitFullScreen( void ) {
// add the surfaces to this view
for ( int i = 0 ; i < surfaces.Num() ; i++ ) {
EmitSurface( &surfaces[i], viewDef->worldSpace.modelMatrix, viewDef->worldSpace.modelViewMatrix, false );
EmitSurface( &surfaces[i], viewDef->worldSpace.modelMatrix, viewDef->worldSpace.centerModelViewMatrix, false );
}
tr.viewDef = oldViewDef;

View file

@ -258,7 +258,9 @@ void R_LockSurfaceScene( viewDef_t *parms ) {
// update the view origin and axis, and all
// the entity matricies
for (vModel = tr.lockSurfacesCmd.viewDef->viewEntitys; vModel; vModel = vModel->next) {
myGlMultMatrix(vModel->modelMatrix, tr.lockSurfacesCmd.viewDef->worldSpace.modelViewMatrix, vModel->modelViewMatrix);
myGlMultMatrix(vModel->modelMatrix, tr.lockSurfacesCmd.viewDef->worldSpace.modelViewMatrix[0], vModel->modelViewMatrix[0]);
myGlMultMatrix(vModel->modelMatrix, tr.lockSurfacesCmd.viewDef->worldSpace.modelViewMatrix[1], vModel->modelViewMatrix[1]);
myGlMultMatrix(vModel->modelMatrix, tr.lockSurfacesCmd.viewDef->worldSpace.centerModelViewMatrix, vModel->centerModelViewMatrix);
}
// add the stored off surface commands again
@ -583,7 +585,7 @@ void idRenderSystemLocal::BeginFrame( int windowWidth, int windowHeight ) {
cmd = (setBufferCommand_t *)R_GetCommandBuffer( sizeof( *cmd ) );
cmd->commandId = RC_SET_BUFFER;
cmd->frameCount = frameCount;
cmd->buffer = cvarSystem->GetCVarInteger("vr_eye");
cmd->buffer = 0;
}

View file

@ -128,10 +128,10 @@ bool idRenderWorldLocal::PortalIsFoggedOut( const portal_t *p ) {
a = -0.5f / alpha;
}
forward[0] = a * tr.viewDef->worldSpace.modelViewMatrix[2];
forward[1] = a * tr.viewDef->worldSpace.modelViewMatrix[6];
forward[2] = a * tr.viewDef->worldSpace.modelViewMatrix[10];
forward[3] = a * tr.viewDef->worldSpace.modelViewMatrix[14];
forward[0] = a * tr.viewDef->worldSpace.centerModelViewMatrix[2];
forward[1] = a * tr.viewDef->worldSpace.centerModelViewMatrix[6];
forward[2] = a * tr.viewDef->worldSpace.centerModelViewMatrix[10];
forward[3] = a * tr.viewDef->worldSpace.centerModelViewMatrix[14];
w = p->w;
for ( i = 0 ; i < w->GetNumPoints() ; i++ ) {

View file

@ -15,6 +15,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <GLES3/gl3.h>
#include "sys/platform.h"
#include "renderer/VertexCache.h"
@ -91,6 +92,33 @@ static void GL_UniformMatrix4fv(GLint location, const GLfloat* value) {
qglUniformMatrix4fv(*( GLint * )((char*) backEnd.glState.currentProgram + location), 1, GL_FALSE, value);
}
/*
====================
GL_UniformMatrix4fv
====================
*/
static void GL_UniformBuffer(GLint location, const float value[32]) {
// Update the scene matrices.
glBindBuffer(GL_UNIFORM_BUFFER, *( GLint * )((char*) backEnd.glState.currentProgram + location));
float* shaderMatrices = (float*)glMapBufferRange(
GL_UNIFORM_BUFFER,
0,
32 * sizeof(float),
GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT);
if (shaderMatrices == NULL)
{
common->Error("Shader Matrices Uniform Buffer is NULL");
return;
}
memcpy((char*)shaderMatrices, value, 32 * sizeof(float));
glUnmapBuffer(GL_UNIFORM_BUFFER);
qglBindBuffer(GL_UNIFORM_BUFFER, 0);
}
/*
====================
GL_EnableVertexAttribArray
@ -247,7 +275,27 @@ static void RB_GLSL_GetUniformLocations(shaderProgram_t* shader) {
shader->glColor = qglGetUniformLocation(shader->program, "u_glColor");
shader->alphaTest = qglGetUniformLocation(shader->program, "u_alphaTest");
shader->specularExponent = qglGetUniformLocation(shader->program, "u_specularExponent");
shader->modelViewProjectionMatrix = qglGetUniformLocation(shader->program, "u_modelViewProjectionMatrix");
GLuint shaderMatricesUniformLocation = glGetUniformBlockIndex(shader->program, "ShaderMatrices");
int numBufferBindings = 0;
shader->shaderMatricesBinding = numBufferBindings++;
glUniformBlockBinding(
shader->program,
shaderMatricesUniformLocation,
shader->shaderMatricesBinding);
//Create the buffer
qglGenBuffers(1, &shader->shaderMatricesBuffer);
glBindBuffer(GL_UNIFORM_BUFFER, shader->shaderMatricesBuffer);
glBufferData(
GL_UNIFORM_BUFFER,
2 * 16 * sizeof(float),
NULL,
GL_STATIC_DRAW);
glBindBuffer(GL_UNIFORM_BUFFER, 0);
shader->modelViewMatrix = qglGetUniformLocation(shader->program, "u_modelViewMatrix");
shader->textureMatrix = qglGetUniformLocation(shader->program, "u_textureMatrix");
shader->clipPlane = qglGetUniformLocation(shader->program, "u_clipPlane");
@ -475,7 +523,7 @@ RB_ComputeMVP
Compute the model view matrix, with eventually required projection matrix depth hacks
=================
*/
void RB_ComputeMVP( const drawSurf_t * const surf, float mvp[16] ) {
void RB_ComputeMVP( const drawSurf_t * const surf, float mvp[32] ) {
// Get the projection matrix
float localProjectionMatrix[16];
memcpy(localProjectionMatrix, backEnd.viewDef->projectionMatrix, sizeof(localProjectionMatrix));
@ -488,7 +536,8 @@ void RB_ComputeMVP( const drawSurf_t * const surf, float mvp[16] ) {
localProjectionMatrix[14] = backEnd.viewDef->projectionMatrix[14] - surf->space->modelDepthHack;
}
myGlMultMatrix(surf->space->modelViewMatrix, localProjectionMatrix, mvp);
myGlMultMatrix(surf->space->modelViewMatrix[0], localProjectionMatrix, mvp);
myGlMultMatrix(surf->space->modelViewMatrix[1], localProjectionMatrix, (mvp + 16) );
}
/*
@ -747,6 +796,12 @@ static void RB_GLSL_CreateDrawInteractions(const drawSurf_t* surf, const viewLig
GL_UseProgram(&interactionShader);
}
glBindBufferBase(
GL_UNIFORM_BUFFER,
backEnd.glState.currentProgram->shaderMatricesBinding,
backEnd.glState.currentProgram->shaderMatricesBuffer);
// Setup attributes arrays
// Vertex attribute is always enabled
// Color attribute is always enabled
@ -762,9 +817,9 @@ static void RB_GLSL_CreateDrawInteractions(const drawSurf_t* surf, const viewLig
// perform setup here that will not change over multiple interaction passes
if ( surf->space != backEnd.currentSpace ) {
float mvp[16];
float mvp[32];
RB_ComputeMVP(surf, mvp);
GL_UniformMatrix4fv(offsetof(shaderProgram_t, modelViewProjectionMatrix), mvp);
GL_UniformBuffer(offsetof(shaderProgram_t, shaderMatricesBuffer), mvp);
}
// Hack Depth Range if necessary
@ -922,10 +977,10 @@ void RB_GLSL_RenderDrawSurfChainWithFunction(const drawSurf_t* drawSurfs,
// Change the MVP matrix if needed
if ( drawSurf->space != backEnd.currentSpace ) {
float mvp[16];
float mvp[32];
RB_ComputeMVP(drawSurf, mvp);
// We can set the uniform now, as the shader is already bound
GL_UniformMatrix4fv(offsetof(shaderProgram_t, modelViewProjectionMatrix), mvp);
GL_UniformBuffer(offsetof(shaderProgram_t, shaderMatricesBuffer), mvp);
}
// Hack Depth Range if necessary
@ -996,6 +1051,11 @@ void RB_GLSL_StencilShadowPass(const drawSurf_t* drawSurfs, const viewLight_t* v
// Use the stencil shadow shader
GL_UseProgram(&stencilShadowShader);
glBindBufferBase(
GL_UNIFORM_BUFFER,
backEnd.glState.currentProgram->shaderMatricesBinding,
backEnd.glState.currentProgram->shaderMatricesBuffer);
// Setup attributes arrays
// Vertex attribute is always enabled
// Disable Color attribute (as it is enabled by default)
@ -1186,6 +1246,11 @@ void RB_GLSL_FogPass(const drawSurf_t* drawSurfs, const drawSurf_t* drawSurfs2,
GL_UseProgram(&fogShader);
glBindBufferBase(
GL_UNIFORM_BUFFER,
backEnd.glState.currentProgram->shaderMatricesBinding,
backEnd.glState.currentProgram->shaderMatricesBuffer);
// Setup attributes arrays
// Vertex attribute is always enabled
// Disable Color attribute (as it is enabled by default)
@ -1225,15 +1290,15 @@ void RB_GLSL_FogPass(const drawSurf_t* drawSurfs, const drawSurf_t* drawSurfs2,
// It is expected to be already active
globalImages->fogImage->Bind();
fogPlanes[0][0] = a * backEnd.viewDef->worldSpace.modelViewMatrix[2];
fogPlanes[0][1] = a * backEnd.viewDef->worldSpace.modelViewMatrix[6];
fogPlanes[0][2] = a * backEnd.viewDef->worldSpace.modelViewMatrix[10];
fogPlanes[0][3] = a * backEnd.viewDef->worldSpace.modelViewMatrix[14];
fogPlanes[0][0] = a * backEnd.viewDef->worldSpace.centerModelViewMatrix[2];
fogPlanes[0][1] = a * backEnd.viewDef->worldSpace.centerModelViewMatrix[6];
fogPlanes[0][2] = a * backEnd.viewDef->worldSpace.centerModelViewMatrix[10];
fogPlanes[0][3] = a * backEnd.viewDef->worldSpace.centerModelViewMatrix[14];
fogPlanes[1][0] = a * backEnd.viewDef->worldSpace.modelViewMatrix[0];
fogPlanes[1][1] = a * backEnd.viewDef->worldSpace.modelViewMatrix[4];
fogPlanes[1][2] = a * backEnd.viewDef->worldSpace.modelViewMatrix[8];
fogPlanes[1][3] = a * backEnd.viewDef->worldSpace.modelViewMatrix[12];
fogPlanes[1][0] = a * backEnd.viewDef->worldSpace.centerModelViewMatrix[0];
fogPlanes[1][1] = a * backEnd.viewDef->worldSpace.centerModelViewMatrix[4];
fogPlanes[1][2] = a * backEnd.viewDef->worldSpace.centerModelViewMatrix[8];
fogPlanes[1][3] = a * backEnd.viewDef->worldSpace.centerModelViewMatrix[12];
// texture 1 is the entering plane fade correction
GL_SelectTexture(1);
@ -1549,6 +1614,11 @@ void RB_GLSL_FillDepthBuffer(drawSurf_t** drawSurfs, int numDrawSurfs) {
GL_UseProgram(&zfillShader);
}
glBindBufferBase(
GL_UNIFORM_BUFFER,
backEnd.glState.currentProgram->shaderMatricesBinding,
backEnd.glState.currentProgram->shaderMatricesBuffer);
// Setup attributes arrays
// Vertex attribute is always enabled
// TexCoord attribute is always enabled
@ -1589,10 +1659,10 @@ void RB_GLSL_FillDepthBuffer(drawSurf_t** drawSurfs, int numDrawSurfs) {
// Change the MVP matrix if needed
if ( drawSurf->space != backEnd.currentSpace ) {
float mvp[16];
float mvp[32];
RB_ComputeMVP(drawSurf, mvp);
// We can set the uniform now as it shader is already bound
GL_UniformMatrix4fv(offsetof(shaderProgram_t, modelViewProjectionMatrix), mvp);
GL_UniformBuffer(offsetof(shaderProgram_t, shaderMatricesBuffer), mvp);
}
// Hack Depth Range if necessary
@ -1811,6 +1881,11 @@ void RB_GLSL_T_RenderShaderPasses(const drawSurf_t* surf, const float mvp[16]) {
// This is diffuse cube mapping
GL_UseProgram(&diffuseCubeShader);
glBindBufferBase(
GL_UNIFORM_BUFFER,
backEnd.glState.currentProgram->shaderMatricesBinding,
backEnd.glState.currentProgram->shaderMatricesBuffer);
// Possible that normals should be transformed by a normal matrix in the shader ? I am not sure...
// Setup texcoord array to use the normals
@ -1827,6 +1902,11 @@ void RB_GLSL_T_RenderShaderPasses(const drawSurf_t* surf, const float mvp[16]) {
// This is skybox cube mapping
GL_UseProgram(&skyboxCubeShader);
glBindBufferBase(
GL_UNIFORM_BUFFER,
backEnd.glState.currentProgram->shaderMatricesBinding,
backEnd.glState.currentProgram->shaderMatricesBuffer);
// Disable TexCoord attribute
GL_DisableVertexAttribArray(ATTR_TEXCOORD);
@ -1843,6 +1923,11 @@ void RB_GLSL_T_RenderShaderPasses(const drawSurf_t* surf, const float mvp[16]) {
// This is skybox cube mapping, with special texture matrix
GL_UseProgram(&skyboxCubeShader);
glBindBufferBase(
GL_UNIFORM_BUFFER,
backEnd.glState.currentProgram->shaderMatricesBinding,
backEnd.glState.currentProgram->shaderMatricesBuffer);
// Disable TexCoord attribute
GL_DisableVertexAttribArray(ATTR_TEXCOORD);
@ -1873,6 +1958,11 @@ void RB_GLSL_T_RenderShaderPasses(const drawSurf_t* surf, const float mvp[16]) {
// This is reflection cubemapping
GL_UseProgram(&reflectionCubeShader);
glBindBufferBase(
GL_UNIFORM_BUFFER,
backEnd.glState.currentProgram->shaderMatricesBinding,
backEnd.glState.currentProgram->shaderMatricesBuffer);
// NB: in original D3, if the surface had a bump map it would lead to the "Bumpy reflection cubemaping" shader being used.
// This is not implemented for now, we only do standard reflection cubemaping. Visual difference is really minor.
@ -1881,17 +1971,22 @@ void RB_GLSL_T_RenderShaderPasses(const drawSurf_t* surf, const float mvp[16]) {
ac->normal.ToFloatPtr());
// Setup the modelViewMatrix, we will need it to compute the reflection
GL_UniformMatrix4fv(offsetof(shaderProgram_t, modelViewMatrix), surf->space->modelViewMatrix);
GL_UniformMatrix4fv(offsetof(shaderProgram_t, modelViewMatrix), surf->space->centerModelViewMatrix);
// Setup the texture matrix like original D3 code does: using the transpose modelViewMatrix of the view
// NB: this is curious, not sure why this is done like this....
float mat[16];
R_TransposeGLMatrix(backEnd.viewDef->worldSpace.modelViewMatrix, mat);
R_TransposeGLMatrix(backEnd.viewDef->worldSpace.centerModelViewMatrix, mat);
GL_UniformMatrix4fv(offsetof(shaderProgram_t, textureMatrix), mat);
} else { // TG_EXPLICIT
// Otherwise, this is just regular surface shader with explicit texcoords
GL_UseProgram(&diffuseMapShader);
glBindBufferBase(
GL_UNIFORM_BUFFER,
backEnd.glState.currentProgram->shaderMatricesBinding,
backEnd.glState.currentProgram->shaderMatricesBuffer);
// Setup the TexCoord pointer
GL_VertexAttribPointer(offsetof(shaderProgram_t, attr_TexCoord), 2, GL_FLOAT, false, sizeof(idDrawVert),
ac->st.ToFloatPtr());
@ -1926,7 +2021,7 @@ void RB_GLSL_T_RenderShaderPasses(const drawSurf_t* surf, const float mvp[16]) {
// MVP
if ( !bMVPSet[pStage->texture.texgen] ) {
// Setup the MVP uniform
GL_UniformMatrix4fv(offsetof(shaderProgram_t, modelViewProjectionMatrix), mvp);
GL_UniformBuffer(offsetof(shaderProgram_t, shaderMatricesBuffer), mvp);
bMVPSet[pStage->texture.texgen] = true;
}
}
@ -2102,7 +2197,7 @@ int RB_GLSL_DrawShaderPasses(drawSurf_t** drawSurfs, int numDrawSurfs) {
// For each surface loop
/////////////////////////
float mvp[16];
float mvp[32];
backEnd.currentSpace = NULL;
int i;
@ -2258,6 +2353,11 @@ void RB_GLSL_BlendLight(const drawSurf_t *drawSurfs, const drawSurf_t *drawSurfs
// Use blendLight shader
GL_UseProgram(&blendLightShader);
glBindBufferBase(
GL_UNIFORM_BUFFER,
backEnd.glState.currentProgram->shaderMatricesBinding,
backEnd.glState.currentProgram->shaderMatricesBuffer);
// Texture 1 will get the falloff texture
GL_SelectTexture(1);
vLight->falloffImage->Bind();

View file

@ -18,24 +18,33 @@
#include "glsl_shaders.h"
const char * const blendLightShaderVP = R"(
#version 100
#version 300 es
// Multiview
#define NUM_VIEWS 2
#extension GL_OVR_multiview2 : enable
layout(num_views=NUM_VIEWS) in;
precision mediump float;
// In
attribute highp vec4 attr_Vertex;
in highp vec4 attr_Vertex;
// Uniforms
uniform highp mat4 u_modelViewProjectionMatrix;
uniform ShaderMatrices
{
uniform highp mat4 modelViewProjectionMatrix[NUM_VIEWS];
} u_shaderMatrices;
uniform mat4 u_fogMatrix;
// Out
// gl_Position
varying vec2 var_TexFog;
varying vec2 var_TexFogEnter;
out vec2 var_TexFog;
out vec2 var_TexFogEnter;
void main(void)
void main()
{
gl_Position = u_modelViewProjectionMatrix * attr_Vertex;
gl_Position = u_shaderMatrices.modelViewProjectionMatrix[gl_ViewID_OVR] * attr_Vertex;
// What will be computed:
//

View file

@ -18,22 +18,22 @@
#include "glsl_shaders.h"
const char * const cubeMapShaderFP = R"(
#version 100
#version 300 es
precision mediump float;
// In
varying vec3 var_TexCoord;
varying lowp vec4 var_Color;
in vec3 var_TexCoord;
in lowp vec4 var_Color;
// Uniforms
uniform samplerCube u_fragmentCubeMap0;
uniform lowp vec4 u_glColor;
// Out
// gl_FragColor
layout(location = 0) out vec4 fragColor;
void main(void)
void main()
{
gl_FragColor = textureCube(u_fragmentCubeMap0, var_TexCoord) * u_glColor * var_Color;
fragColor = texture(u_fragmentCubeMap0, var_TexCoord) * u_glColor * var_Color;
}
)";

View file

@ -18,26 +18,35 @@
#include "glsl_shaders.h"
const char * const diffuseCubeShaderVP = R"(
#version 100
#version 300 es
// Multiview
#define NUM_VIEWS 2
#extension GL_OVR_multiview2 : enable
layout(num_views=NUM_VIEWS) in;
precision mediump float;
// In
attribute highp vec4 attr_Vertex;
attribute lowp vec4 attr_Color;
attribute vec3 attr_TexCoord;
in highp vec4 attr_Vertex;
in lowp vec4 attr_Color;
in vec3 attr_TexCoord;
// Uniforms
uniform highp mat4 u_modelViewProjectionMatrix;
uniform ShaderMatrices
{
uniform highp mat4 modelViewProjectionMatrix[NUM_VIEWS];
} u_shaderMatrices;
uniform mat4 u_textureMatrix;
uniform lowp float u_colorAdd;
uniform lowp float u_colorModulate;
// Out
// gl_Position
varying vec3 var_TexCoord;
varying lowp vec4 var_Color;
out vec3 var_TexCoord;
out lowp vec4 var_Color;
void main(void)
void main()
{
var_TexCoord = (u_textureMatrix * vec4(attr_TexCoord, 0.0)).xyz;
@ -47,6 +56,6 @@ void main(void)
var_Color = (attr_Color * u_colorModulate) + vec4(u_colorAdd);
}
gl_Position = u_modelViewProjectionMatrix * attr_Vertex;
gl_Position = u_shaderMatrices.modelViewProjectionMatrix[gl_ViewID_OVR] * attr_Vertex;
}
)";

View file

@ -18,22 +18,22 @@
#include "glsl_shaders.h"
const char * const diffuseMapShaderFP = R"(
#version 100
#version 300 es
precision mediump float;
// In
varying vec2 var_TexCoord;
varying lowp vec4 var_Color;
in vec2 var_TexCoord;
in lowp vec4 var_Color;
// Uniforms
uniform sampler2D u_fragmentMap0;
uniform lowp vec4 u_glColor;
// Out
// gl_FragCoord
layout(location = 0) out vec4 fragColor;
void main(void)
void main()
{
gl_FragColor = texture2D(u_fragmentMap0, var_TexCoord) * u_glColor * var_Color;
fragColor = texture(u_fragmentMap0, var_TexCoord) * u_glColor * var_Color;
}
)";

View file

@ -18,26 +18,36 @@
#include "glsl_shaders.h"
const char * const diffuseMapShaderVP = R"(
#version 100
#version 300 es
// Multiview
#define NUM_VIEWS 2
#extension GL_OVR_multiview2 : enable
layout(num_views=NUM_VIEWS) in;
precision mediump float;
// In
attribute highp vec4 attr_Vertex;
attribute lowp vec4 attr_Color;
attribute vec4 attr_TexCoord;
in highp vec4 attr_Vertex;
in lowp vec4 attr_Color;
in vec4 attr_TexCoord;
// Uniforms
uniform highp mat4 u_modelViewProjectionMatrix;
uniform ShaderMatrices
{
uniform highp mat4 modelViewProjectionMatrix[NUM_VIEWS];
} u_shaderMatrices;
uniform mat4 u_textureMatrix;
uniform lowp float u_colorAdd;
uniform lowp float u_colorModulate;
// Out
// gl_Position
varying vec2 var_TexCoord;
varying lowp vec4 var_Color;
out vec2 var_TexCoord;
out lowp vec4 var_Color;
void main(void)
void main()
{
var_TexCoord = (u_textureMatrix * attr_TexCoord).xy; // Homogeneous coordinates of textureMatrix supposed to be 1
@ -47,6 +57,6 @@ void main(void)
var_Color = (attr_Color * u_colorModulate) + vec4(u_colorAdd);
}
gl_Position = u_modelViewProjectionMatrix * attr_Vertex;
gl_Position = u_shaderMatrices.modelViewProjectionMatrix[gl_ViewID_OVR] * attr_Vertex;
}
)";

View file

@ -18,12 +18,12 @@
#include "glsl_shaders.h"
const char * const fogShaderFP = R"(
#version 100
#version 300 es
precision mediump float;
// In
varying vec2 var_TexFog; // input Fog TexCoord
varying vec2 var_TexFogEnter; // input FogEnter TexCoord
in vec2 var_TexFog; // input Fog TexCoord
in vec2 var_TexFogEnter; // input FogEnter TexCoord
// Uniforms
uniform sampler2D u_fragmentMap0; // Fog Image
@ -31,10 +31,10 @@ uniform sampler2D u_fragmentMap1; // Fog Enter Image
uniform lowp vec4 u_fogColor; // Fog Color
// Out
// gl_FragCoord // output Fragment color
layout(location = 0) out vec4 fragColor;
void main(void)
void main()
{
gl_FragColor = texture2D( u_fragmentMap0, var_TexFog ) * texture2D( u_fragmentMap1, var_TexFogEnter ) * vec4(u_fogColor.rgb, 1.0);
fragColor = texture( u_fragmentMap0, var_TexFog ) * texture( u_fragmentMap1, var_TexFogEnter ) * vec4(u_fogColor.rgb, 1.0);
}
)";

View file

@ -18,24 +18,33 @@
#include "glsl_shaders.h"
const char * const fogShaderVP = R"(
#version 100
#version 300 es
// Multiview
#define NUM_VIEWS 2
#extension GL_OVR_multiview2 : enable
layout(num_views=NUM_VIEWS) in;
precision mediump float;
// In
attribute highp vec4 attr_Vertex; // input Vertex Coordinates
in highp vec4 attr_Vertex; // input Vertex Coordinates
// Uniforms
uniform highp mat4 u_modelViewProjectionMatrix;
uniform ShaderMatrices
{
uniform highp mat4 modelViewProjectionMatrix[NUM_VIEWS];
} u_shaderMatrices;
uniform mat4 u_fogMatrix; // fogPlanes 0, 1, 3 (CATION: not 2!), 2
// Out
// gl_Position // output Vertex Coordinates
varying vec2 var_TexFog; // output Fog TexCoord
varying vec2 var_TexFogEnter; // output FogEnter TexCoord
out vec2 var_TexFog; // output Fog TexCoord
out vec2 var_TexFogEnter; // output FogEnter TexCoord
void main(void)
void main()
{
gl_Position = u_modelViewProjectionMatrix * attr_Vertex;
gl_Position = u_shaderMatrices.modelViewProjectionMatrix[gl_ViewID_OVR] * attr_Vertex;
// What will be computed:
//

View file

@ -18,17 +18,17 @@
#include "glsl_shaders.h"
const char * const interactionPhongShaderFP = R"(
#version 100
#version 300 es
precision highp float;
// In
varying vec2 var_TexDiffuse;
varying vec2 var_TexNormal;
varying vec2 var_TexSpecular;
varying vec4 var_TexLight;
varying lowp vec4 var_Color;
varying vec3 var_L;
varying vec3 var_V;
in vec2 var_TexDiffuse;
in vec2 var_TexNormal;
in vec2 var_TexSpecular;
in vec4 var_TexLight;
in lowp vec4 var_Color;
in vec3 var_L;
in vec3 var_V;
// Uniforms
uniform lowp vec4 u_diffuseColor;
@ -41,20 +41,20 @@ uniform sampler2D u_fragmentMap3; // u_diffuseTexture
uniform sampler2D u_fragmentMap4; // u_specularTexture
// Out
// gl_FragCoord
layout(location = 0) out vec4 fragColor;
void main(void)
void main()
{
vec3 L = normalize(var_L);
vec3 V = normalize(var_V);
vec3 N = normalize(2.0 * texture2D(u_fragmentMap0, var_TexNormal.st).agb - 1.0);
vec3 N = normalize(2.0 * texture(u_fragmentMap0, var_TexNormal.st).agb - 1.0);
float NdotL = clamp(dot(N, L), 0.0, 1.0);
vec3 lightProjection = texture2DProj(u_fragmentMap2, var_TexLight.xyw).rgb;
vec3 lightFalloff = texture2D(u_fragmentMap1, vec2(var_TexLight.z, 0.5)).rgb;
vec3 diffuseColor = texture2D(u_fragmentMap3, var_TexDiffuse).rgb * u_diffuseColor.rgb;
vec3 specularColor = 2.0 * texture2D(u_fragmentMap4, var_TexSpecular).rgb * u_specularColor.rgb;
vec3 lightProjection = textureProj(u_fragmentMap2, var_TexLight.xyw).rgb;
vec3 lightFalloff = texture(u_fragmentMap1, vec2(var_TexLight.z, 0.5)).rgb;
vec3 diffuseColor = texture(u_fragmentMap3, var_TexDiffuse).rgb * u_diffuseColor.rgb;
vec3 specularColor = 2.0 * texture(u_fragmentMap4, var_TexSpecular).rgb * u_specularColor.rgb;
vec3 R = -reflect(L, N);
float RdotV = clamp(dot(R, V), 0.0, 1.0);
@ -66,6 +66,6 @@ void main(void)
color *= NdotL * lightProjection;
color *= lightFalloff;
gl_FragColor = vec4(color, 1.0) * var_Color;
fragColor = vec4(color, 1.0) * var_Color;
}
)";

View file

@ -18,19 +18,28 @@
#include "glsl_shaders.h"
const char * const interactionPhongShaderVP = R"(
#version 100
#version 300 es
// Multiview
#define NUM_VIEWS 2
#extension GL_OVR_multiview2 : enable
layout(num_views=NUM_VIEWS) in;
precision highp float;
// In
attribute highp vec4 attr_Vertex;
attribute lowp vec4 attr_Color;
attribute vec4 attr_TexCoord;
attribute vec3 attr_Tangent;
attribute vec3 attr_Bitangent;
attribute vec3 attr_Normal;
in highp vec4 attr_Vertex;
in lowp vec4 attr_Color;
in vec4 attr_TexCoord;
in vec3 attr_Tangent;
in vec3 attr_Bitangent;
in vec3 attr_Normal;
// Uniforms
uniform highp mat4 u_modelViewProjectionMatrix;
uniform ShaderMatrices
{
uniform highp mat4 modelViewProjectionMatrix[NUM_VIEWS];
} u_shaderMatrices;
uniform mat4 u_lightProjection;
uniform lowp float u_colorModulate;
uniform lowp float u_colorAdd;
@ -45,15 +54,15 @@ uniform vec4 u_specularMatrixT;
// Out
// gl_Position
varying vec2 var_TexDiffuse;
varying vec2 var_TexNormal;
varying vec2 var_TexSpecular;
varying vec4 var_TexLight;
varying lowp vec4 var_Color;
varying vec3 var_L;
varying vec3 var_V;
out vec2 var_TexDiffuse;
out vec2 var_TexNormal;
out vec2 var_TexSpecular;
out vec4 var_TexLight;
out lowp vec4 var_Color;
out vec3 var_L;
out vec3 var_V;
void main(void)
void main()
{
mat3 M = mat3(attr_Tangent, attr_Bitangent, attr_Normal);
@ -83,6 +92,6 @@ void main(void)
var_Color = (attr_Color * u_colorModulate) + vec4(u_colorAdd);
}
gl_Position = u_modelViewProjectionMatrix * attr_Vertex;
gl_Position = u_shaderMatrices.modelViewProjectionMatrix[gl_ViewID_OVR] * attr_Vertex;
}
)";

View file

@ -18,17 +18,17 @@
#include "glsl_shaders.h"
const char * const interactionShaderFP = R"(
#version 100
#version 300 es
precision highp float;
// In
varying vec2 var_TexDiffuse;
varying vec2 var_TexNormal;
varying vec2 var_TexSpecular;
varying vec4 var_TexLight;
varying lowp vec4 var_Color;
varying vec3 var_L;
varying vec3 var_H;
in vec2 var_TexDiffuse;
in vec2 var_TexNormal;
in vec2 var_TexSpecular;
in vec4 var_TexLight;
in lowp vec4 var_Color;
in vec3 var_L;
in vec3 var_H;
// Uniforms
uniform lowp vec4 u_diffuseColor;
@ -41,21 +41,21 @@ uniform sampler2D u_fragmentMap3; // u_diffuseTexture
uniform sampler2D u_fragmentMap4; // u_specularTexture
// Out
// gl_FragCoord
layout(location = 0) out vec4 fragColor;
void main(void)
void main()
{
vec3 L = normalize(var_L);
vec3 H = normalize(var_H);
vec3 N = 2.0 * texture2D(u_fragmentMap0, var_TexNormal.st).agb - 1.0;
vec3 N = 2.0 * texture(u_fragmentMap0, var_TexNormal.st).agb - 1.0;
float NdotL = clamp(dot(N, L), 0.0, 1.0);
float NdotH = clamp(dot(N, H), 0.0, 1.0);
vec3 lightProjection = texture2DProj(u_fragmentMap2, var_TexLight.xyw).rgb;
vec3 lightFalloff = texture2D(u_fragmentMap1, vec2(var_TexLight.z, 0.5)).rgb;
vec3 diffuseColor = texture2D(u_fragmentMap3, var_TexDiffuse).rgb * u_diffuseColor.rgb;
vec3 specularColor = 2.0 * texture2D(u_fragmentMap4, var_TexSpecular).rgb * u_specularColor.rgb;
vec3 lightProjection = textureProj(u_fragmentMap2, var_TexLight.xyw).rgb;
vec3 lightFalloff = texture(u_fragmentMap1, vec2(var_TexLight.z, 0.5)).rgb;
vec3 diffuseColor = texture(u_fragmentMap3, var_TexDiffuse).rgb * u_diffuseColor.rgb;
vec3 specularColor = 2.0 * texture(u_fragmentMap4, var_TexSpecular).rgb * u_specularColor.rgb;
float specularFalloff = pow(NdotH, 12.0); // Hardcoded to try to match with original D3 look
@ -65,6 +65,6 @@ void main(void)
color *= NdotL * lightProjection;
color *= lightFalloff;
gl_FragColor = vec4(color, 1.0) * var_Color;
fragColor = vec4(color, 1.0) * var_Color;
}
)";

View file

@ -18,19 +18,28 @@
#include "glsl_shaders.h"
const char * const interactionShaderVP = R"(
#version 100
#version 300 es
// Multiview
#define NUM_VIEWS 2
#extension GL_OVR_multiview2 : enable
layout(num_views=NUM_VIEWS) in;
precision highp float;
// In
attribute highp vec4 attr_Vertex;
attribute lowp vec4 attr_Color;
attribute vec4 attr_TexCoord;
attribute vec3 attr_Tangent;
attribute vec3 attr_Bitangent;
attribute vec3 attr_Normal;
in highp vec4 attr_Vertex;
in lowp vec4 attr_Color;
in vec4 attr_TexCoord;
in vec3 attr_Tangent;
in vec3 attr_Bitangent;
in vec3 attr_Normal;
// Uniforms
uniform highp mat4 u_modelViewProjectionMatrix;
uniform ShaderMatrices
{
uniform highp mat4 modelViewProjectionMatrix[NUM_VIEWS];
} u_shaderMatrices;
uniform mat4 u_lightProjection;
uniform lowp float u_colorModulate;
uniform lowp float u_colorAdd;
@ -45,15 +54,15 @@ uniform vec4 u_specularMatrixT;
// Out
// gl_Position
varying vec2 var_TexDiffuse;
varying vec2 var_TexNormal;
varying vec2 var_TexSpecular;
varying vec4 var_TexLight;
varying lowp vec4 var_Color;
varying vec3 var_L;
varying vec3 var_H;
out vec2 var_TexDiffuse;
out vec2 var_TexNormal;
out vec2 var_TexSpecular;
out vec4 var_TexLight;
out lowp vec4 var_Color;
out vec3 var_L;
out vec3 var_H;
void main(void)
void main()
{
mat3 M = mat3(attr_Tangent, attr_Bitangent, attr_Normal);
@ -84,6 +93,6 @@ void main(void)
var_Color = (attr_Color * u_colorModulate) + vec4(u_colorAdd);
}
gl_Position = u_modelViewProjectionMatrix * attr_Vertex;
gl_Position = u_shaderMatrices.modelViewProjectionMatrix[gl_ViewID_OVR] * attr_Vertex;
}
)";

View file

@ -18,16 +18,32 @@
#include "glsl_shaders.h"
const char * const reflectionCubeShaderVP = R"(
#version 100
#version 300 es
// Multiview
#define NUM_VIEWS 2
#if defined( GL_OVR_multiview2 )
#extension GL_OVR_multiview2 : enable
layout(num_views=NUM_VIEWS) in;
#define VIEW_ID gl_ViewID_OVR
#else
uniform lowp int ViewID;
#define VIEW_ID ViewID
#endif
precision mediump float;
// In
attribute highp vec4 attr_Vertex;
attribute lowp vec4 attr_Color;
attribute vec3 attr_TexCoord;
in highp vec4 attr_Vertex;
in lowp vec4 attr_Color;
in vec3 attr_TexCoord;
// Uniforms
uniform highp mat4 u_modelViewProjectionMatrix;
uniform ShaderMatrices
{
uniform highp mat4 modelViewProjectionMatrix[NUM_VIEWS];
} u_shaderMatrices;
uniform mat4 u_modelViewMatrix;
uniform mat4 u_textureMatrix;
uniform lowp float u_colorAdd;
@ -35,10 +51,10 @@ uniform lowp float u_colorModulate;
// Out
// gl_Position
varying vec3 var_TexCoord;
varying lowp vec4 var_Color;
out vec3 var_TexCoord;
out lowp vec4 var_Color;
void main(void)
void main()
{
var_TexCoord = (u_textureMatrix * reflect( normalize( u_modelViewMatrix * attr_Vertex ),
// This suppose the modelView matrix is orthogonal
@ -51,6 +67,6 @@ void main(void)
var_Color = (attr_Color * u_colorModulate) + vec4(u_colorAdd);
}
gl_Position = u_modelViewProjectionMatrix * attr_Vertex;
gl_Position = u_shaderMatrices.modelViewProjectionMatrix[gl_ViewID_OVR] * attr_Vertex;
}
)";

View file

@ -18,15 +18,24 @@
#include "glsl_shaders.h"
const char * const skyboxCubeShaderVP = R"(
#version 100
#version 300 es
// Multiview
#define NUM_VIEWS 2
#extension GL_OVR_multiview2 : enable
layout(num_views=NUM_VIEWS) in;
precision mediump float;
// In
attribute highp vec4 attr_Vertex;
attribute lowp vec4 attr_Color;
in highp vec4 attr_Vertex;
in lowp vec4 attr_Color;
// Uniforms
uniform highp mat4 u_modelViewProjectionMatrix;
uniform ShaderMatrices
{
uniform highp mat4 modelViewProjectionMatrix[NUM_VIEWS];
} u_shaderMatrices;
uniform mat4 u_textureMatrix;
uniform lowp float u_colorAdd;
uniform lowp float u_colorModulate;
@ -34,10 +43,10 @@ uniform vec4 u_viewOrigin;
// Out
// gl_Position
varying vec3 var_TexCoord;
varying lowp vec4 var_Color;
out vec3 var_TexCoord;
out lowp vec4 var_Color;
void main(void)
void main()
{
var_TexCoord = (u_textureMatrix * (attr_Vertex - u_viewOrigin)).xyz;
@ -47,6 +56,6 @@ void main(void)
var_Color = (attr_Color * u_colorModulate) + vec4(u_colorAdd);
}
gl_Position = u_modelViewProjectionMatrix * attr_Vertex;
gl_Position = u_shaderMatrices.modelViewProjectionMatrix[gl_ViewID_OVR] * attr_Vertex;
}
)";

View file

@ -18,14 +18,14 @@
#include "glsl_shaders.h"
const char * const stencilShadowShaderFP = R"(
#version 100
#version 300 es
precision lowp float;
// Out
// gl_FragColor
layout(location = 0) out vec4 fragColor;
void main(void)
void main()
{
gl_FragColor = vec4(0,0,0,1.0);
fragColor = vec4(0,0,0,1.0);
}
)";

View file

@ -18,21 +18,30 @@
#include "glsl_shaders.h"
const char * const stencilShadowShaderVP = R"(
#version 100
#version 300 es
// Multiview
#define NUM_VIEWS 2
#extension GL_OVR_multiview2 : enable
layout(num_views=NUM_VIEWS) in;
precision mediump float;
// In
attribute highp vec4 attr_Vertex;
in highp vec4 attr_Vertex;
// Uniforms
uniform highp mat4 u_modelViewProjectionMatrix;
uniform ShaderMatrices
{
uniform highp mat4 modelViewProjectionMatrix[NUM_VIEWS];
} u_shaderMatrices;
uniform vec4 u_lightOrigin;
// Out
// gl_Position
void main(void)
void main()
{
gl_Position = u_modelViewProjectionMatrix * (attr_Vertex.w * u_lightOrigin + attr_Vertex - u_lightOrigin);
gl_Position = u_shaderMatrices.modelViewProjectionMatrix[gl_ViewID_OVR] * (attr_Vertex.w * u_lightOrigin + attr_Vertex - u_lightOrigin);
}
)";

View file

@ -18,12 +18,12 @@
#include "glsl_shaders.h"
const char * const zfillClipShaderFP = R"(
#version 100
#version 300 es
precision mediump float;
// In
varying vec2 var_TexDiffuse;
varying vec2 var_TexClip;
in vec2 var_TexDiffuse;
in vec2 var_TexClip;
// Uniforms
uniform sampler2D u_fragmentMap0;
@ -32,14 +32,14 @@ uniform lowp float u_alphaTest;
uniform lowp vec4 u_glColor;
// Out
// gl_FragCoord
layout(location = 0) out vec4 fragColor;
void main(void)
void main()
{
if (u_alphaTest > (texture2D(u_fragmentMap0, var_TexDiffuse).a * texture2D(u_fragmentMap1, var_TexClip).a) ) {
if (u_alphaTest > (texture(u_fragmentMap0, var_TexDiffuse).a * texture(u_fragmentMap1, var_TexClip).a) ) {
discard;
}
gl_FragColor = u_glColor;
fragColor = u_glColor;
}
)";

View file

@ -18,29 +18,38 @@
#include "glsl_shaders.h"
const char * const zfillClipShaderVP = R"(
#version 100
#version 300 es
// Multiview
#define NUM_VIEWS 2
#extension GL_OVR_multiview2 : enable
layout(num_views=NUM_VIEWS) in;
precision mediump float;
// In
attribute highp vec4 attr_Vertex;
attribute vec4 attr_TexCoord;
in highp vec4 attr_Vertex;
in vec4 attr_TexCoord;
// Uniforms
uniform highp mat4 u_modelViewProjectionMatrix;
uniform ShaderMatrices
{
uniform highp mat4 modelViewProjectionMatrix[NUM_VIEWS];
} u_shaderMatrices;
uniform mat4 u_textureMatrix;
uniform vec4 u_clipPlane;
// Out
// gl_Position
varying vec2 var_TexDiffuse;
varying vec2 var_TexClip;
out vec2 var_TexDiffuse;
out vec2 var_TexClip;
void main(void)
void main()
{
var_TexDiffuse = (u_textureMatrix * attr_TexCoord).xy; // Homogeneous coordinates of textureMatrix supposed to be 1
var_TexClip = vec2( dot( u_clipPlane, attr_Vertex), 0.5 );
gl_Position = u_modelViewProjectionMatrix * attr_Vertex;
gl_Position = u_shaderMatrices.modelViewProjectionMatrix[gl_ViewID_OVR] * attr_Vertex;
}
)";

View file

@ -18,11 +18,11 @@
#include "glsl_shaders.h"
const char * const zfillShaderFP = R"(
#version 100
#version 300 es
precision mediump float;
// In
varying vec2 var_TexDiffuse;
in vec2 var_TexDiffuse;
// Uniforms
uniform sampler2D u_fragmentMap0;
@ -30,14 +30,14 @@ uniform lowp float u_alphaTest;
uniform lowp vec4 u_glColor;
// Out
// gl_FragCoord
layout(location = 0) out vec4 fragColor;
void main(void)
void main()
{
if (u_alphaTest > texture2D(u_fragmentMap0, var_TexDiffuse).a) {
if (u_alphaTest > texture(u_fragmentMap0, var_TexDiffuse).a) {
discard;
}
gl_FragColor = u_glColor;
fragColor = u_glColor;
}
)";

View file

@ -18,25 +18,34 @@
#include "glsl_shaders.h"
const char * const zfillShaderVP = R"(
#version 100
#version 300 es
// Multiview
#define NUM_VIEWS 2
#extension GL_OVR_multiview2 : enable
layout(num_views=NUM_VIEWS) in;
precision mediump float;
// In
attribute highp vec4 attr_Vertex;
attribute vec4 attr_TexCoord;
in highp vec4 attr_Vertex;
in vec4 attr_TexCoord;
// Uniforms
uniform highp mat4 u_modelViewProjectionMatrix;
uniform ShaderMatrices
{
uniform highp mat4 modelViewProjectionMatrix[NUM_VIEWS];
} u_shaderMatrices;
uniform mat4 u_textureMatrix;
// Out
// gl_Position
varying vec2 var_TexDiffuse;
out vec2 var_TexDiffuse;
void main(void)
void main()
{
var_TexDiffuse = (u_textureMatrix * attr_TexCoord).xy; // Homogeneous coordinates of textureMatrix supposed to be 1
gl_Position = u_modelViewProjectionMatrix * attr_Vertex;
gl_Position = u_shaderMatrices.modelViewProjectionMatrix[gl_ViewID_OVR] * attr_Vertex;
}
)";

View file

@ -272,7 +272,9 @@ viewEntity_t* R_SetEntityDefViewEntity(idRenderEntityLocal* def) {
// we may not have a viewDef if we are just creating shadows at entity creation time
if ( tr.viewDef ) {
myGlMultMatrix(vModel->modelMatrix, tr.viewDef->worldSpace.modelViewMatrix, vModel->modelViewMatrix);
myGlMultMatrix(vModel->modelMatrix, tr.viewDef->worldSpace.modelViewMatrix[0], vModel->modelViewMatrix[0]);
myGlMultMatrix(vModel->modelMatrix, tr.viewDef->worldSpace.modelViewMatrix[1], vModel->modelViewMatrix[1]);
myGlMultMatrix(vModel->modelMatrix, tr.viewDef->worldSpace.centerModelViewMatrix, vModel->centerModelViewMatrix);
vModel->next = tr.viewDef->viewEntitys;
tr.viewDef->viewEntitys = vModel;
@ -627,7 +629,7 @@ idScreenRect R_ClippedLightScissorRectangle(viewLight_t* vLight) {
idPlane eye, clip;
idVec3 ndc;
R_TransformModelToClip(w[j].ToVec3(), tr.viewDef->worldSpace.modelViewMatrix, tr.viewDef->projectionMatrix, eye,
R_TransformModelToClip(w[j].ToVec3(), tr.viewDef->worldSpace.centerModelViewMatrix, tr.viewDef->projectionMatrix, eye,
clip);
if ( clip[3] <= 0.01f ) {
@ -692,7 +694,7 @@ idScreenRect R_CalcLightScissorRectangle(viewLight_t* vLight) {
tri = vLight->lightDef->frustumTris;
for ( int i = 0; i < tri->numVerts; i++ ) {
R_TransformModelToClip(tri->verts[i].xyz, tr.viewDef->worldSpace.modelViewMatrix,
R_TransformModelToClip(tri->verts[i].xyz, tr.viewDef->worldSpace.centerModelViewMatrix,
tr.viewDef->projectionMatrix, eye, clip);
// if it is near clipped, clip the winding polygons to the view frustum
@ -1049,7 +1051,7 @@ idRenderModel* R_EntityDefDynamicModel(idRenderEntityLocal* def) {
if ( def->dynamicModel && model->DepthHack() != 0.0f && tr.viewDef ) {
idPlane eye, clip;
idVec3 ndc;
R_TransformModelToClip(def->parms.origin, tr.viewDef->worldSpace.modelViewMatrix, tr.viewDef->projectionMatrix,
R_TransformModelToClip(def->parms.origin, tr.viewDef->worldSpace.centerModelViewMatrix, tr.viewDef->projectionMatrix,
eye,
clip);
R_TransformClipToDevice(clip, tr.viewDef, ndc);

View file

@ -369,7 +369,8 @@ typedef struct viewEntity_s {
float modelDepthHack;
float modelMatrix[16]; // local coords to global coords
float modelViewMatrix[16]; // local coords to eye coords
float modelViewMatrix[2][16]; // local coords to left/right eye coords
float centerModelViewMatrix[16]; // local coords to center eye coords
} viewEntity_t;
@ -1253,7 +1254,11 @@ typedef struct shaderProgram_s {
GLint alphaTest;
GLint specularExponent;
GLint modelViewProjectionMatrix;
// GLint modelViewProjectionMatrix;
//New for multiview
GLuint shaderMatricesBuffer;
GLuint shaderMatricesBinding;
GLint modelViewMatrix;
GLint textureMatrix;
GLint localLightOrigin;

View file

@ -734,10 +734,10 @@ void R_GlobalToNormalizedDeviceCoordinates( const idVec3 &global, idVec3 &ndc )
for ( i = 0 ; i < 4 ; i ++ ) {
view[i] =
global[0] * tr.primaryView->worldSpace.modelViewMatrix[ i + 0 * 4 ] +
global[1] * tr.primaryView->worldSpace.modelViewMatrix[ i + 1 * 4 ] +
global[2] * tr.primaryView->worldSpace.modelViewMatrix[ i + 2 * 4 ] +
tr.primaryView->worldSpace.modelViewMatrix[ i + 3 * 4 ];
global[0] * tr.primaryView->worldSpace.centerModelViewMatrix[ i + 0 * 4 ] +
global[1] * tr.primaryView->worldSpace.centerModelViewMatrix[ i + 1 * 4 ] +
global[2] * tr.primaryView->worldSpace.centerModelViewMatrix[ i + 2 * 4 ] +
tr.primaryView->worldSpace.centerModelViewMatrix[ i + 3 * 4 ];
}
for ( i = 0 ; i < 4 ; i ++ ) {
@ -752,10 +752,10 @@ void R_GlobalToNormalizedDeviceCoordinates( const idVec3 &global, idVec3 &ndc )
for ( i = 0 ; i < 4 ; i ++ ) {
view[i] =
global[0] * tr.viewDef->worldSpace.modelViewMatrix[ i + 0 * 4 ] +
global[1] * tr.viewDef->worldSpace.modelViewMatrix[ i + 1 * 4 ] +
global[2] * tr.viewDef->worldSpace.modelViewMatrix[ i + 2 * 4 ] +
tr.viewDef->worldSpace.modelViewMatrix[ i + 3 * 4 ];
global[0] * tr.viewDef->worldSpace.centerModelViewMatrix[ i + 0 * 4 ] +
global[1] * tr.viewDef->worldSpace.centerModelViewMatrix[ i + 1 * 4 ] +
global[2] * tr.viewDef->worldSpace.centerModelViewMatrix[ i + 2 * 4 ] +
tr.viewDef->worldSpace.centerModelViewMatrix[ i + 3 * 4 ];
}
@ -871,35 +871,46 @@ void R_SetViewMatrix( viewDef_t *viewDef ) {
world->modelMatrix[1 * 4 + 1] = 1;
world->modelMatrix[2 * 4 + 2] = 1;
// transform by the camera placement
origin = viewDef->renderView.vieworg;
for (int eye = 0; eye < 3; ++eye) {
// transform by the camera placement
origin = viewDef->renderView.vieworg;
viewerMatrix[0] = viewDef->renderView.viewaxis[0][0];
viewerMatrix[4] = viewDef->renderView.viewaxis[0][1];
viewerMatrix[8] = viewDef->renderView.viewaxis[0][2];
viewerMatrix[12] = -origin[0] * viewerMatrix[0] + -origin[1] * viewerMatrix[4] +
-origin[2] * viewerMatrix[8];
if (eye < 2) {
origin += (eye == 0 ? 1.0f : -1.0f) * viewDef->renderView.viewaxis[1] *
((0.065f) / 2.0f) * (43.0f);
}
viewerMatrix[1] = viewDef->renderView.viewaxis[1][0];
viewerMatrix[5] = viewDef->renderView.viewaxis[1][1];
viewerMatrix[9] = viewDef->renderView.viewaxis[1][2];
viewerMatrix[13] = -origin[0] * viewerMatrix[1] + -origin[1] * viewerMatrix[5] +
-origin[2] * viewerMatrix[9];
viewerMatrix[0] = viewDef->renderView.viewaxis[0][0];
viewerMatrix[4] = viewDef->renderView.viewaxis[0][1];
viewerMatrix[8] = viewDef->renderView.viewaxis[0][2];
viewerMatrix[12] = -origin[0] * viewerMatrix[0] + -origin[1] * viewerMatrix[4] +
-origin[2] * viewerMatrix[8];
viewerMatrix[2] = viewDef->renderView.viewaxis[2][0];
viewerMatrix[6] = viewDef->renderView.viewaxis[2][1];
viewerMatrix[10] = viewDef->renderView.viewaxis[2][2];
viewerMatrix[14] = -origin[0] * viewerMatrix[2] + -origin[1] * viewerMatrix[6] +
-origin[2] * viewerMatrix[10];
viewerMatrix[1] = viewDef->renderView.viewaxis[1][0];
viewerMatrix[5] = viewDef->renderView.viewaxis[1][1];
viewerMatrix[9] = viewDef->renderView.viewaxis[1][2];
viewerMatrix[13] = -origin[0] * viewerMatrix[1] + -origin[1] * viewerMatrix[5] +
-origin[2] * viewerMatrix[9];
viewerMatrix[3] = 0;
viewerMatrix[7] = 0;
viewerMatrix[11] = 0;
viewerMatrix[15] = 1;
viewerMatrix[2] = viewDef->renderView.viewaxis[2][0];
viewerMatrix[6] = viewDef->renderView.viewaxis[2][1];
viewerMatrix[10] = viewDef->renderView.viewaxis[2][2];
viewerMatrix[14] = -origin[0] * viewerMatrix[2] + -origin[1] * viewerMatrix[6] +
-origin[2] * viewerMatrix[10];
// convert from our coordinate system (looking down X)
// to OpenGL's coordinate system (looking down -Z)
myGlMultMatrix(viewerMatrix, s_flipMatrix, world->modelViewMatrix);
viewerMatrix[3] = 0;
viewerMatrix[7] = 0;
viewerMatrix[11] = 0;
viewerMatrix[15] = 1;
if (eye < 2) {
// convert from our coordinate system (looking down X)
// to OpenGL's coordinate system (looking down -Z)
myGlMultMatrix(viewerMatrix, s_flipMatrix, world->modelViewMatrix[eye]);
} else {
myGlMultMatrix(viewerMatrix, s_flipMatrix, world->centerModelViewMatrix);
}
}
}
}

View file

@ -473,10 +473,10 @@ void world_to_hclip( const viewDef_t *viewDef, const idVec4 &global, idVec4 &cli
for ( i = 0 ; i < 4 ; i ++ ) {
view[i] =
global[0] * viewDef->worldSpace.modelViewMatrix[ i + 0 * 4 ] +
global[1] * viewDef->worldSpace.modelViewMatrix[ i + 1 * 4 ] +
global[2] * viewDef->worldSpace.modelViewMatrix[ i + 2 * 4 ] +
global[3] * viewDef->worldSpace.modelViewMatrix[ i + 3 * 4 ];
global[0] * viewDef->worldSpace.centerModelViewMatrix[ i + 0 * 4 ] +
global[1] * viewDef->worldSpace.centerModelViewMatrix[ i + 1 * 4 ] +
global[2] * viewDef->worldSpace.centerModelViewMatrix[ i + 2 * 4 ] +
global[3] * viewDef->worldSpace.centerModelViewMatrix[ i + 3 * 4 ];
}

View file

@ -125,7 +125,7 @@ bool R_PreciseCullSurface( const drawSurf_t *drawSurf, idBounds &ndcBounds ) {
int j;
unsigned int pointFlags;
R_TransformModelToClip( tri->verts[i].xyz, drawSurf->space->modelViewMatrix,
R_TransformModelToClip( tri->verts[i].xyz, drawSurf->space->centerModelViewMatrix,
tr.viewDef->projectionMatrix, eye, clip );
pointFlags = 0;

View file

@ -139,16 +139,11 @@ GLimp_Shutdown
void GLimp_Shutdown() {
}
int stereoSide = 0;
void GLimp_SetupFrame(int eye) {
void GLimp_SetupFrame(int buffer /*unused*/) {
//Only do this if we have drawn both buffers and are back to the first buffer
stereoSide = eye;
if (eye == 0) {
Doom3Quest_processMessageQueue();
Doom3Quest_processMessageQueue();
Doom3Quest_prepareEyeBuffer(0);
}
Doom3Quest_prepareEyeBuffer();
}
@ -158,19 +153,10 @@ GLimp_SwapBuffers
===================
*/
void GLimp_SwapBuffers() {
Doom3Quest_finishEyeBuffer();
if (stereoSide == 0)
{
Doom3Quest_finishEyeBuffer(0);
Doom3Quest_prepareEyeBuffer(1);
}
else
{
Doom3Quest_finishEyeBuffer(1);
//We can now submit the stereo frame
Doom3Quest_submitFrame();
}
//We can now submit the stereo frame
Doom3Quest_submitFrame();
}
/*
@ -190,7 +176,6 @@ GLimp_ActivateContext
extern "C" void ActivateContext();
void GLimp_ActivateContext() {
stereoSide = 0;
ActivateContext();
}

View file

@ -291,22 +291,6 @@ void idDeviceContext::SetMenuScaleFix(bool enable) {
}
}
// DG: this is used for the "make sure menus are rendered as 4:3" hack
void idDeviceContext::SetMenuScaleForVR( bool enable ) {
int eye = cvarSystem->GetCVarInteger("vr_eye");
if(enable) {
float scaleX = 0.38;
float scaleY = 0.45;
float offsetX = (1.0f - scaleX) * (VIRTUAL_WIDTH * 0.5f);
float offsetY = (1.0f - scaleY) * (VIRTUAL_HEIGHT * 0.5f);
fixScaleForMenu.Set(scaleX, scaleY);
fixOffsetForMenu.Set(offsetX + (eye==0 ? 20 : -20), offsetY);
} else {
fixScaleForMenu.Set(1, 1);
fixOffsetForMenu.Set(0, 0);
}
}
void idDeviceContext::AdjustCoords(float *x, float *y, float *w, float *h) {
if (x) {

View file

@ -101,7 +101,6 @@ public:
// DG: this is used for the "make sure menus are rendered as 4:3" hack
void SetMenuScaleFix(bool enable);
void SetMenuScaleForVR( bool enable );
bool IsMenuScaleFixActive() const {
return fixOffsetForMenu.x != 0.0f || fixOffsetForMenu.y != 0.0f;
}