Add support for anisotropic filtering

This commit is contained in:
Yamagi Burmeister 2011-10-17 10:43:48 +00:00
parent 0a9585ee1b
commit 55f51eb680
4 changed files with 62 additions and 27 deletions

6
README
View file

@ -275,6 +275,12 @@ the most common questions are answered.
likely want to set "gl_stecilshadow" to 1 too. This enables high
quality stencil buffer shadows.
- Yamagi Quake II has support for anisotropic filtering. Activating it
gives a small benefit in texture drawing over large distances. Check
"gl_anisotropic_avail" for the maximum amount af filtering supported
by your video card and set the desired value "gl_anisotropic". The
value must be a power of 4, in most cases 2, 4, 8 or 16.
3.2 Input
---------
Quake II had a rather simple input system, even back then in 1997. It

View file

@ -224,6 +224,8 @@ extern cvar_t *gl_drawbuffer;
extern cvar_t *gl_3dlabs_broken;
extern cvar_t *gl_driver;
extern cvar_t *gl_swapinterval;
extern cvar_t *gl_anisotropic;
extern cvar_t *gl_anisotropic_avail;
extern cvar_t *gl_texturemode;
extern cvar_t *gl_texturealphamode;
extern cvar_t *gl_texturesolidmode;
@ -343,6 +345,9 @@ typedef struct
qboolean allow_cds;
qboolean mtexcombine;
qboolean anisotropic;
float max_anisotropy;
} glconfig_t;
typedef struct

View file

@ -290,6 +290,19 @@ R_TextureMode ( char *string )
gl_filter_min = modes [ i ].minimize;
gl_filter_max = modes [ i ].maximize;
/* clamp selected anisotropy */
if (gl_config.anisotropic)
{
if (gl_anisotropic->value > gl_config.max_anisotropy)
{
ri.Cvar_SetValue("gl_anisotropic", gl_config.max_anisotropy);
}
else if (gl_anisotropic->value < 1.0)
{
ri.Cvar_SetValue("gl_anisotropic", 1.0);
}
}
/* change all the existing mipmap texture objects */
for ( i = 0, glt = gltextures; i < numgltextures; i++, glt++ )
{
@ -298,6 +311,12 @@ R_TextureMode ( char *string )
R_Bind( glt->texnum );
qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, gl_filter_min );
qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gl_filter_max );
/* Set anisotropic filter if supported and enabled */
if (gl_config.anisotropic && gl_anisotropic->value)
{
qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, gl_anisotropic->value);
}
}
}
}
@ -706,15 +725,8 @@ R_Upload32 ( unsigned *data, int width, int height, qboolean mipmap )
{
uploaded_paletted = true;
R_BuildPalettedTexture( paletted_texture, (unsigned char *) data, scaled_width, scaled_height );
qglTexImage2D( GL_TEXTURE_2D,
0,
GL_COLOR_INDEX8_EXT,
scaled_width,
scaled_height,
0,
GL_COLOR_INDEX,
GL_UNSIGNED_BYTE,
paletted_texture );
qglTexImage2D( GL_TEXTURE_2D, 0, GL_COLOR_INDEX8_EXT, scaled_width,
scaled_height, 0, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, paletted_texture );
}
else
{
@ -737,15 +749,8 @@ R_Upload32 ( unsigned *data, int width, int height, qboolean mipmap )
{
uploaded_paletted = true;
R_BuildPalettedTexture( paletted_texture, (unsigned char *) scaled, scaled_width, scaled_height );
qglTexImage2D( GL_TEXTURE_2D,
0,
GL_COLOR_INDEX8_EXT,
scaled_width,
scaled_height,
0,
GL_COLOR_INDEX,
GL_UNSIGNED_BYTE,
paletted_texture );
qglTexImage2D( GL_TEXTURE_2D, 0, GL_COLOR_INDEX8_EXT, scaled_width, scaled_height,
0, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, paletted_texture );
}
else
{
@ -780,15 +785,8 @@ R_Upload32 ( unsigned *data, int width, int height, qboolean mipmap )
{
uploaded_paletted = true;
R_BuildPalettedTexture( paletted_texture, (unsigned char *) scaled, scaled_width, scaled_height );
qglTexImage2D( GL_TEXTURE_2D,
miplevel,
GL_COLOR_INDEX8_EXT,
scaled_width,
scaled_height,
0,
GL_COLOR_INDEX,
GL_UNSIGNED_BYTE,
paletted_texture );
qglTexImage2D( GL_TEXTURE_2D, miplevel, GL_COLOR_INDEX8_EXT, scaled_width, scaled_height,
0, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, paletted_texture );
}
else
{
@ -810,6 +808,11 @@ done:
qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gl_filter_max );
}
if (mipmap && gl_config.anisotropic && gl_anisotropic->value)
{
qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, gl_anisotropic->value);
}
return ( samples == gl_alpha_format );
}

View file

@ -152,6 +152,8 @@ cvar_t *gl_swapinterval;
cvar_t *gl_texturemode;
cvar_t *gl_texturealphamode;
cvar_t *gl_texturesolidmode;
cvar_t *gl_anisotropic;
cvar_t *gl_anisotropic_avail;
cvar_t *gl_lockpvs;
cvar_t *vid_fullscreen;
@ -979,6 +981,8 @@ R_Register ( void )
gl_texturemode = ri.Cvar_Get( "gl_texturemode", "GL_LINEAR_MIPMAP_NEAREST", CVAR_ARCHIVE );
gl_texturealphamode = ri.Cvar_Get( "gl_texturealphamode", "default", CVAR_ARCHIVE );
gl_texturesolidmode = ri.Cvar_Get( "gl_texturesolidmode", "default", CVAR_ARCHIVE );
gl_anisotropic = ri.Cvar_Get( "gl_anisotropic", "0", CVAR_ARCHIVE );
gl_anisotropic_avail = ri.Cvar_Get( "gl_anisotropic_avail", "0", 0 );
gl_lockpvs = ri.Cvar_Get( "gl_lockpvs", "0", 0 );
gl_vertex_arrays = ri.Cvar_Get( "gl_vertex_arrays", "0", CVAR_ARCHIVE );
@ -1235,6 +1239,23 @@ R_Init ( void *hinstance, void *hWnd )
ri.Con_Printf( PRINT_ALL, "...GL_SGIS_multitexture not found\n" );
}
gl_config.anisotropic = false;
if ( strstr(gl_config.extensions_string,"GL_EXT_texture_filter_anisotropic") )
{
ri.Con_Printf (PRINT_ALL,"...using GL_EXT_texture_filter_anisotropic\n" );
gl_config.anisotropic = true;
qglGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &gl_config.max_anisotropy);
ri.Cvar_SetValue("gl_anisotropic_avail", gl_config.max_anisotropy);
}
else
{
ri.Con_Printf (PRINT_ALL,"..GL_EXT_texture_filter_anisotropic not found\n" );
gl_config.anisotropic = false;
gl_config.max_anisotropy = 0.0;
ri.Cvar_SetValue("gl_anisotropic_avail", 0.0);
}
gl_config.mtexcombine = false;
if ( strstr( gl_config.extensions_string, "GL_ARB_texture_env_combine" ) )