mirror of
https://github.com/DrBeef/Doom3Quest.git
synced 2024-11-23 12:22:20 +00:00
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:
parent
531a24c236
commit
74acf16f9d
40 changed files with 744 additions and 460 deletions
|
@ -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;
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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" );
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -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++ ) {
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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:
|
||||
//
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
)";
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
)";
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
)";
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
)";
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
)";
|
||||
|
|
|
@ -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:
|
||||
//
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
)";
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
)";
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
)";
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
)";
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
)";
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
)";
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
)";
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
)";
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
)";
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
)";
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
)";
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
)";
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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 ];
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue