mirror of
https://github.com/yquake2/yquake2remaster.git
synced 2025-02-21 11:21:52 +00:00
Extra shaders for rendering with lightmaps vs transparent surfaces
This commit is contained in:
parent
b6f68cd532
commit
e6a534aef2
4 changed files with 65 additions and 28 deletions
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue