Extra shaders for rendering with lightmaps vs transparent surfaces

This commit is contained in:
Daniel Gibson 2017-03-18 15:41:11 +01:00
parent b6f68cd532
commit e6a534aef2
4 changed files with 65 additions and 28 deletions

View file

@ -212,7 +212,7 @@ GL3_Register(void)
vid_fullscreen = ri.Cvar_Get("vid_fullscreen", "0", CVAR_ARCHIVE);
vid_gamma = ri.Cvar_Get("vid_gamma", "1.0", CVAR_ARCHIVE);
intensity = ri.Cvar_Get("intensity", "1.0", CVAR_ARCHIVE);
intensity = ri.Cvar_Get("intensity", "2.0", CVAR_ARCHIVE);
gl_lightlevel = ri.Cvar_Get("gl_lightlevel", "0", 0);
gl_overbrightbits = ri.Cvar_Get("gl_overbrightbits", "0", CVAR_ARCHIVE);
@ -244,8 +244,8 @@ GL3_Register(void)
//gl_lerpmodels = ri.Cvar_Get("gl_lerpmodels", "1", 0); NOTE: screw this, it looks horrible without
//gl_speeds = ri.Cvar_Get("gl_speeds", "0", 0);
gl_lightlevel = ri.Cvar_Get("gl_lightlevel", "0", 0);
gl_overbrightbits = ri.Cvar_Get("gl_overbrightbits", "0", CVAR_ARCHIVE);
//gl_lightlevel = ri.Cvar_Get("gl_lightlevel", "0", 0);
//gl_overbrightbits = ri.Cvar_Get("gl_overbrightbits", "0", CVAR_ARCHIVE);
gl_particle_min_size = ri.Cvar_Get("gl_particle_min_size", "2", CVAR_ARCHIVE);
gl_particle_max_size = ri.Cvar_Get("gl_particle_max_size", "40", CVAR_ARCHIVE);

View file

@ -317,7 +317,7 @@ static const char* vertexSrc3D = MULTILINE_STRING(
}
);
static const char* vertexSrc3Dlm = MULTILINE_STRING(
static const char* vertexSrc3DlmOnly = MULTILINE_STRING(
// it gets attributes and uniforms from vertexCommon3D
@ -814,6 +814,7 @@ static void initUBOs(void)
glBindBuffer(GL_UNIFORM_BUFFER, gl3state.uni3DUBO);
glBindBufferBase(GL_UNIFORM_BUFFER, GL3_BINDINGPOINT_UNI3D, gl3state.uni3DUBO);
glBufferData(GL_UNIFORM_BUFFER, sizeof(gl3state.uni3DData), &gl3state.uni3DData, GL_DYNAMIC_DRAW);
gl3state.currentUBO = gl3state.uni3DUBO;
}
qboolean GL3_InitShaders(void)
@ -830,9 +831,14 @@ qboolean GL3_InitShaders(void)
R_Printf(PRINT_ALL, "WARNING: Failed to create shader program for color-only 2D rendering!\n");
return false;
}
if(!initShader3D(&gl3state.si3D, vertexSrc3D, fragmentSrc3Dlm))
if(!initShader3D(&gl3state.si3Dlm, vertexSrc3D, fragmentSrc3Dlm))
{
R_Printf(PRINT_ALL, "WARNING: Failed to create shader program for textured 3D rendering!\n");
R_Printf(PRINT_ALL, "WARNING: Failed to create shader program for textured 3D rendering with lightmap!\n");
return false;
}
if(!initShader3D(&gl3state.si3Dtrans, vertexSrc3D, fragmentSrc3D))
{
R_Printf(PRINT_ALL, "WARNING: Failed to create shader program for rendering translucent 3D things!\n");
return false;
}
if(!initShader3D(&gl3state.si3DcolorOnly, vertexSrc3D, fragmentSrc3Dcolor))
@ -852,9 +858,14 @@ qboolean GL3_InitShaders(void)
R_Printf(PRINT_ALL, "WARNING: Failed to create shader program for water rendering!\n");
return false;
}
if(!initShader3D(&gl3state.si3Dflow, vertexSrc3Dflow, fragmentSrc3Dlm))
if(!initShader3D(&gl3state.si3DlmFlow, vertexSrc3Dflow, fragmentSrc3Dlm))
{
R_Printf(PRINT_ALL, "WARNING: Failed to create shader program for scrolling textures 3D rendering!\n");
R_Printf(PRINT_ALL, "WARNING: Failed to create shader program for scrolling textured 3D rendering with lightmap!\n");
return false;
}
if(!initShader3D(&gl3state.si3DtransFlow, vertexSrc3Dflow, fragmentSrc3D))
{
R_Printf(PRINT_ALL, "WARNING: Failed to create shader program for scrolling textured translucent 3D rendering!\n");
return false;
}
if(!initShader3D(&gl3state.si3Dsky, vertexSrc3D, fragmentSrc3Dsky))
@ -911,9 +922,31 @@ void GL3_ShutdownShaders(void)
static inline void
updateUBO(GLuint ubo, GLsizeiptr size, void* data)
{
if(gl3state.currentUBO != ubo)
{
gl3state.currentUBO = ubo;
glBindBuffer(GL_UNIFORM_BUFFER, ubo);
}
// TODO: use glMapBufferRange() or something else instead?
glBindBuffer(GL_UNIFORM_BUFFER, ubo);
// http://docs.gl/gl3/glBufferSubData says "When replacing the entire data store,
// consider using glBufferSubData rather than completely recreating the data store
// with glBufferData. This avoids the cost of reallocating the data store."
// no idea why glBufferData() doesn't just do that when size doesn't change, but whatever..
// however, it also says glBufferSubData() might cause a stall so I DON'T KNOW!
// by just looking at the fps, glBufferData() and glBufferSubData() make no difference
// TODO: STREAM instead DYNAMIC?
#if 0
glBufferData(GL_UNIFORM_BUFFER, size, data, GL_DYNAMIC_DRAW);
#elif 1
glBufferSubData(GL_UNIFORM_BUFFER, 0, size, data);
#else // with my current nvidia-driver, the following *really* makes it slower. (<200fps instead of ~500)
glBufferData(GL_UNIFORM_BUFFER, size, NULL, GL_DYNAMIC_DRAW); // orphan
GLvoid* ptr = glMapBuffer(GL_UNIFORM_BUFFER, GL_WRITE_ONLY);
memcpy(ptr, data, size);
glUnmapBuffer(GL_UNIFORM_BUFFER);
#endif
}
void GL3_UpdateUBOCommon(void)

View file

@ -163,11 +163,12 @@ TextureAnimation(mtexinfo_t *tex)
}
void
GL3_DrawGLPoly(glpoly_t *p)
GL3_DrawGLPoly(glpoly_t *p, qboolean withAlpha)
{
float* v = p->verts[0];
GL3_UseProgram(gl3state.si3D.shaderProgram); // TODO: needed each time?! maybe call this once in DrawTextureChains()?
// TODO: needed each time?! maybe call this once in DrawTextureChains()?
GL3_UseProgram( withAlpha ? gl3state.si3Dtrans.shaderProgram : gl3state.si3Dlm.shaderProgram );
GL3_BindVAO(gl3state.vao3D);
GL3_BindVBO(gl3state.vbo3D);
@ -177,7 +178,7 @@ GL3_DrawGLPoly(glpoly_t *p)
}
void
GL3_DrawGLFlowingPoly(msurface_t *fa)
GL3_DrawGLFlowingPoly(msurface_t *fa, qboolean withAlpha)
{
int i;
float *v;
@ -199,7 +200,7 @@ GL3_DrawGLFlowingPoly(msurface_t *fa)
GL3_UpdateUBO3D();
}
GL3_UseProgram(gl3state.si3Dflow.shaderProgram);
GL3_UseProgram( withAlpha ? gl3state.si3DtransFlow.shaderProgram : gl3state.si3DlmFlow.shaderProgram );
GL3_BindVAO(gl3state.vao3D);
GL3_BindVBO(gl3state.vbo3D);
@ -553,11 +554,11 @@ RenderBrushPoly(msurface_t *fa)
if (fa->texinfo->flags & SURF_FLOWING)
{
GL3_DrawGLFlowingPoly(fa);
GL3_DrawGLFlowingPoly(fa, false);
}
else
{
GL3_DrawGLPoly(fa->polys);
GL3_DrawGLPoly(fa->polys, false);
}
STUB_ONCE("TODO: dynamic lightmap in shaders");
@ -682,11 +683,11 @@ GL3_DrawAlphaSurfaces(void)
}
else if (s->texinfo->flags & SURF_FLOWING)
{
GL3_DrawGLFlowingPoly(s);
GL3_DrawGLFlowingPoly(s, true);
}
else
{
GL3_DrawGLPoly(s->polys);
GL3_DrawGLPoly(s->polys, true);
}
}

View file

@ -177,20 +177,23 @@ typedef struct
GLuint currentVAO;
GLuint currentVBO;
GLuint currentShaderProgram;
GLuint currentUBO;
// NOTE: make sure si2D is always the first shaderInfo (or adapt GL3_ShutdownShaders())
gl3ShaderInfo_t si2D; // shader for rendering 2D with textures
gl3ShaderInfo_t si2D; // shader for rendering 2D with textures
gl3ShaderInfo_t si2Dcolor; // shader for rendering 2D with flat colors
gl3ShaderInfo_t si3D;
gl3ShaderInfo_t si3DcolorOnly; // used for beams
gl3ShaderInfo_t si3Dturb; // for water etc
gl3ShaderInfo_t si3Dflow; // for flowing/scrolling things (conveyor, ..?)
gl3ShaderInfo_t si3Dsky;
gl3ShaderInfo_t si3Dsprite; // for sprites
gl3ShaderInfo_t si3Dlm; // a regular opaque face (e.g. from brush) with lightmap
// TODO: lm-only variants for gl_lightmap 1
gl3ShaderInfo_t si3Dtrans; // transparent is always w/o lightmap
gl3ShaderInfo_t si3DcolorOnly; // used for beams - no lightmaps
gl3ShaderInfo_t si3Dturb; // for water etc - always without lightmap
gl3ShaderInfo_t si3DlmFlow; // for flowing/scrolling things with lightmap (conveyor, ..?)
gl3ShaderInfo_t si3DtransFlow; // for transparent flowing/scrolling things (=> no lightmap)
gl3ShaderInfo_t si3Dsky; // guess what..
gl3ShaderInfo_t si3Dsprite; // for sprites
gl3ShaderInfo_t si3DspriteAlpha; // for sprites with alpha-testing
//gl3ShaderInfo_t si3Dlm; // for blended lightmaps TODO: prolly remove and use multitexturing
gl3ShaderInfo_t si3Dalias; // for models
gl3ShaderInfo_t si3Dalias; // for models
gl3ShaderInfo_t si3DaliasColor; // for models w/ flat colors
// NOTE: make sure siParticle is always the last shaderInfo (or adapt GL3_ShutdownShaders())
@ -429,8 +432,8 @@ extern void GL3_AddSkySurface(msurface_t *fa);
// gl3_surf.c
extern void GL3_SurfInit(void);
extern void GL3_SurfShutdown(void);
extern void GL3_DrawGLPoly(glpoly_t *p);
extern void GL3_DrawGLFlowingPoly(msurface_t *fa);
extern void GL3_DrawGLPoly(glpoly_t *p, qboolean withAlpha);
extern void GL3_DrawGLFlowingPoly(msurface_t *fa, qboolean withAlpha);
extern void GL3_DrawTriangleOutlines(void);
extern void GL3_DrawAlphaSurfaces(void);
extern void GL3_DrawBrushModel(entity_t *e);