mirror of
https://github.com/Shpoike/Quakespasm.git
synced 2025-02-15 08:31:03 +00:00
allow scaling and gamma correction independelty
This commit is contained in:
parent
c71d900e2d
commit
16921ee6db
1 changed files with 26 additions and 12 deletions
|
@ -181,18 +181,23 @@ static void GLSLGamma_CreateShaders (void)
|
||||||
/*
|
/*
|
||||||
=============
|
=============
|
||||||
GLSLGamma_GammaCorrect
|
GLSLGamma_GammaCorrect
|
||||||
|
|
||||||
|
Performs:
|
||||||
|
- GLSL gamma correction (requires OpenGL 2.0)
|
||||||
|
- framebuffer scaling (vid_scaled) (any OpenGL version)
|
||||||
=============
|
=============
|
||||||
*/
|
*/
|
||||||
void GLSLGamma_GammaCorrect (void)
|
void GLSLGamma_GammaCorrect (void)
|
||||||
{
|
{
|
||||||
|
qboolean wants_gamma, wants_scaling;
|
||||||
float smax, tmax;
|
float smax, tmax;
|
||||||
|
|
||||||
if (!gl_glsl_gamma_able)
|
wants_gamma = gl_glsl_gamma_able && (vid_gamma.value != 1 || vid_contrast.value != 1);
|
||||||
|
wants_scaling = (vid.unscaled_width != vid.width || vid.unscaled_height != vid.height);
|
||||||
|
|
||||||
|
if (!wants_gamma && !wants_scaling)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (vid_gamma.value == 1 && vid_contrast.value == 1)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// create render-to-texture texture if needed
|
// create render-to-texture texture if needed
|
||||||
if (!r_gamma_texture)
|
if (!r_gamma_texture)
|
||||||
{
|
{
|
||||||
|
@ -214,7 +219,7 @@ void GLSLGamma_GammaCorrect (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
// create shader if needed
|
// create shader if needed
|
||||||
if (!r_gamma_program)
|
if (wants_gamma && !r_gamma_program)
|
||||||
{
|
{
|
||||||
GLSLGamma_CreateShaders ();
|
GLSLGamma_CreateShaders ();
|
||||||
if (!r_gamma_program)
|
if (!r_gamma_program)
|
||||||
|
@ -229,15 +234,22 @@ void GLSLGamma_GammaCorrect (void)
|
||||||
glCopyTexSubImage2D (GL_TEXTURE_2D, 0, 0, 0, glx, gly, glwidth, glheight);
|
glCopyTexSubImage2D (GL_TEXTURE_2D, 0, 0, 0, glx, gly, glwidth, glheight);
|
||||||
|
|
||||||
// draw the texture back to the framebuffer with a fragment shader
|
// draw the texture back to the framebuffer with a fragment shader
|
||||||
GL_UseProgramFunc (r_gamma_program);
|
if (wants_gamma)
|
||||||
GL_Uniform1fFunc (gammaLoc, vid_gamma.value);
|
{
|
||||||
GL_Uniform1fFunc (contrastLoc, q_min(2.0, q_max(1.0, vid_contrast.value)));
|
GL_UseProgramFunc (r_gamma_program);
|
||||||
GL_Uniform1iFunc (textureLoc, 0); // use texture unit 0
|
GL_Uniform1fFunc (gammaLoc, vid_gamma.value);
|
||||||
|
GL_Uniform1fFunc (contrastLoc, q_min(2.0, q_max(1.0, vid_contrast.value)));
|
||||||
|
GL_Uniform1iFunc (textureLoc, 0); // use texture unit 0
|
||||||
|
}
|
||||||
|
|
||||||
glDisable (GL_ALPHA_TEST);
|
glDisable (GL_ALPHA_TEST);
|
||||||
glDisable (GL_DEPTH_TEST);
|
glDisable (GL_DEPTH_TEST);
|
||||||
|
|
||||||
glViewport (0, 0, vid.unscaled_width, vid.unscaled_height);
|
glViewport (0, 0, vid.unscaled_width, vid.unscaled_height);
|
||||||
|
glMatrixMode (GL_PROJECTION);
|
||||||
|
glLoadIdentity ();
|
||||||
|
glMatrixMode (GL_MODELVIEW);
|
||||||
|
glLoadIdentity ();
|
||||||
|
|
||||||
smax = glwidth/(float)r_gamma_texture_width;
|
smax = glwidth/(float)r_gamma_texture_width;
|
||||||
tmax = glheight/(float)r_gamma_texture_height;
|
tmax = glheight/(float)r_gamma_texture_height;
|
||||||
|
@ -253,9 +265,11 @@ void GLSLGamma_GammaCorrect (void)
|
||||||
glVertex2f (-1, 1);
|
glVertex2f (-1, 1);
|
||||||
glEnd ();
|
glEnd ();
|
||||||
|
|
||||||
GL_UseProgramFunc (0);
|
// unbind program if we enabled it
|
||||||
|
if (wants_gamma)
|
||||||
|
GL_UseProgramFunc (0);
|
||||||
|
|
||||||
// clear cached binding
|
// clear cached texture binding
|
||||||
GL_ClearBindings ();
|
GL_ClearBindings ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue