* Anisotropic texture filtering (from Echon)

This commit is contained in:
Tim Angus 2006-04-22 22:14:15 +00:00
parent 40d5eee8ef
commit 68b9eb3fba
8 changed files with 126 additions and 25 deletions

59
README
View file

@ -92,34 +92,43 @@ The defaults for these variables differ depending on the target platform.
------------------------------------------------------------------ Console ----- ------------------------------------------------------------------ Console -----
New cvars New cvars
cl_autoRecordDemo - record a new demo on each map change cl_autoRecordDemo - record a new demo on each map change
cl_aviFrameRate - the framerate to use when capturing video cl_aviFrameRate - the framerate to use when capturing video
cl_aviMotionJpeg - use the mjpeg codec when capturing video cl_aviMotionJpeg - use the mjpeg codec when capturing video
s_useOpenAL - use the OpenAL sound backend if available s_useOpenAL - use the OpenAL sound backend if available
s_alPrecache - cache OpenAL sounds before use s_alPrecache - cache OpenAL sounds before use
s_alGain - the value of AL_GAIN for each source s_alGain - the value of AL_GAIN for each source
s_alSources - the total number of sources (memory) to allocate s_alSources - the total number of sources (memory) to
s_alDopplerFactor - the value passed to alDopplerFactor allocate
s_alDopplerSpeed - the value passed to alDopplerVelocity s_alDopplerFactor - the value passed to alDopplerFactor
s_alMinDistance - the value of AL_REFERENCE_DISTANCE for each source s_alDopplerSpeed - the value passed to alDopplerVelocity
s_alRolloff - the value of AL_ROLLOFF_FACTOR for each source s_alMinDistance - the value of AL_REFERENCE_DISTANCE for
s_alMaxSpeakerDistance - ET_SPEAKERS beyond this distance are culled each source
s_alDriver - which OpenAL library to use s_alRolloff - the value of AL_ROLLOFF_FACTOR for each
source
s_alMaxSpeakerDistance - ET_SPEAKERS beyond this distance are
culled
s_alDriver - which OpenAL library to use
s_sdlBits - SDL bit resolution s_sdlBits - SDL bit resolution
s_sdlSpeed - SDL sample rate s_sdlSpeed - SDL sample rate
s_sdlChannels - SDL number of channels s_sdlChannels - SDL number of channels
s_sdlDevSamps - SDL DMA buffer size override s_sdlDevSamps - SDL DMA buffer size override
s_sdlMixSamps - SDL mix buffer size override s_sdlMixSamps - SDL mix buffer size override
ttycon_ansicolor - enable use of ANSI escape codes in the tty ttycon_ansicolor - enable use of ANSI escape codes in the tty
r_GLlibCoolDownMsec - wait for some milliseconds to close GL library r_GLlibCoolDownMsec - wait for some milliseconds to close GL
com_altivec - enable use of altivec on PowerPC systems library
s_backend - read only, indicates the current sound backend com_altivec - enable use of altivec on PowerPC systems
in_shiftedKeys - non-SDL Linux only. Enables binding to shifted keys s_backend - read only, indicates the current sound
cl_consoleHistory - read only, stores the console history backend
cl_platformSensitivity - read only, indicates the mouse input scaling in_shiftedKeys - non-SDL Linux only. Enables binding to
shifted keys
cl_consoleHistory - read only, stores the console history
cl_platformSensitivity - read only, indicates the mouse input
scaling
r_ext_texture_filter_anisotropic - anisotropic texture filtering
New commands New commands
video [filename] - start video capture (use with demo command) video [filename] - start video capture (use with demo command)

View file

@ -699,11 +699,18 @@ done:
if (mipmap) if (mipmap)
{ {
if ( glConfig.textureFilterAnisotropic )
qglTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT,
(GLint)Com_Clamp( 1, glConfig.maxAnisotropy, r_ext_max_anisotropy->integer ) );
qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, gl_filter_min); qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, gl_filter_min);
qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gl_filter_max); qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gl_filter_max);
} }
else else
{ {
if ( glConfig.textureFilterAnisotropic )
qglTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1 );
qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
} }

View file

@ -81,6 +81,8 @@ cvar_t *r_ext_gamma_control;
cvar_t *r_ext_multitexture; cvar_t *r_ext_multitexture;
cvar_t *r_ext_compiled_vertex_array; cvar_t *r_ext_compiled_vertex_array;
cvar_t *r_ext_texture_env_add; cvar_t *r_ext_texture_env_add;
cvar_t *r_ext_texture_filter_anisotropic;
cvar_t *r_ext_max_anisotropy;
cvar_t *r_ignoreGLErrors; cvar_t *r_ignoreGLErrors;
cvar_t *r_logFile; cvar_t *r_logFile;
@ -910,6 +912,10 @@ void R_Register( void )
r_ext_texture_env_add = ri.Cvar_Get( "r_ext_texture_env_add", "1", CVAR_ARCHIVE | CVAR_LATCH); r_ext_texture_env_add = ri.Cvar_Get( "r_ext_texture_env_add", "1", CVAR_ARCHIVE | CVAR_LATCH);
#endif #endif
r_ext_texture_filter_anisotropic = ri.Cvar_Get( "r_ext_texture_filter_anisotropic",
"0", CVAR_ARCHIVE | CVAR_LATCH );
r_ext_max_anisotropy = ri.Cvar_Get( "r_ext_max_anisotropy", "2", CVAR_ARCHIVE | CVAR_LATCH );
r_picmip = ri.Cvar_Get ("r_picmip", "1", CVAR_ARCHIVE | CVAR_LATCH ); r_picmip = ri.Cvar_Get ("r_picmip", "1", CVAR_ARCHIVE | CVAR_LATCH );
r_roundImagesDown = ri.Cvar_Get ("r_roundImagesDown", "1", CVAR_ARCHIVE | CVAR_LATCH ); r_roundImagesDown = ri.Cvar_Get ("r_roundImagesDown", "1", CVAR_ARCHIVE | CVAR_LATCH );
r_colorMipLevels = ri.Cvar_Get ("r_colorMipLevels", "0", CVAR_LATCH ); r_colorMipLevels = ri.Cvar_Get ("r_colorMipLevels", "0", CVAR_LATCH );

View file

@ -1041,6 +1041,9 @@ extern cvar_t *r_ext_multitexture;
extern cvar_t *r_ext_compiled_vertex_array; extern cvar_t *r_ext_compiled_vertex_array;
extern cvar_t *r_ext_texture_env_add; extern cvar_t *r_ext_texture_env_add;
extern cvar_t *r_ext_texture_filter_anisotropic;
extern cvar_t *r_ext_max_anisotropy;
extern cvar_t *r_nobind; // turns off binding to appropriate textures extern cvar_t *r_nobind; // turns off binding to appropriate textures
extern cvar_t *r_singleShader; // make most world faces use default shader extern cvar_t *r_singleShader; // make most world faces use default shader
extern cvar_t *r_roundImagesDown; extern cvar_t *r_roundImagesDown;

View file

@ -200,6 +200,9 @@ typedef struct {
qboolean isFullscreen; qboolean isFullscreen;
qboolean stereoEnabled; qboolean stereoEnabled;
qboolean smpActive; // dual processor qboolean smpActive; // dual processor
qboolean textureFilterAnisotropic;
int maxAnisotropy;
} glconfig_t; } glconfig_t;
// FIXME: VM should be OS agnostic .. in theory // FIXME: VM should be OS agnostic .. in theory

View file

@ -1323,6 +1323,30 @@ static void GLW_InitExtensions( void )
ri.Printf( PRINT_ALL, "...GL_EXT_compiled_vertex_array not found\n" ); ri.Printf( PRINT_ALL, "...GL_EXT_compiled_vertex_array not found\n" );
} }
glConfig.textureFilterAnisotropic = qfalse;
if ( strstr( glConfig.extensions_string, "GL_EXT_texture_filter_anisotropic" ) )
{
if ( r_ext_texture_filter_anisotropic->integer ) {
qglGetIntegerv( GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &glConfig.maxAnisotropy );
if ( glConfig.maxAnisotropy <= 0 ) {
ri.Printf( PRINT_ALL, "...GL_EXT_texture_filter_anisotropic not properly supported!\n" );
glConfig.maxAnisotropy = 0;
}
else
{
ri.Printf( PRINT_ALL, "...using GL_EXT_texture_filter_anisotropic (max: %i)\n", glConfig.maxAnisotropy );
glConfig.textureFilterAnisotropic = qtrue;
}
}
else
{
ri.Printf( PRINT_ALL, "...ignoring GL_EXT_texture_filter_anisotropic\n" );
}
}
else
{
ri.Printf( PRINT_ALL, "...GL_EXT_texture_filter_anisotropic not found\n" );
}
} }
static void GLW_InitGamma(void) static void GLW_InitGamma(void)

View file

@ -802,6 +802,30 @@ static void GLW_InitExtensions( void )
ri.Printf( PRINT_ALL, "...GL_EXT_compiled_vertex_array not found\n" ); ri.Printf( PRINT_ALL, "...GL_EXT_compiled_vertex_array not found\n" );
} }
glConfig.textureFilterAnisotropic = qfalse;
if ( strstr( glConfig.extensions_string, "GL_EXT_texture_filter_anisotropic" ) )
{
if ( r_ext_texture_filter_anisotropic->integer ) {
qglGetIntegerv( GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &glConfig.maxAnisotropy );
if ( glConfig.maxAnisotropy <= 0 ) {
ri.Printf( PRINT_ALL, "...GL_EXT_texture_filter_anisotropic not properly supported!\n" );
glConfig.maxAnisotropy = 0;
}
else
{
ri.Printf( PRINT_ALL, "...using GL_EXT_texture_filter_anisotropic (max: %i)\n", glConfig.maxAnisotropy );
glConfig.textureFilterAnisotropic = qtrue;
}
}
else
{
ri.Printf( PRINT_ALL, "...ignoring GL_EXT_texture_filter_anisotropic\n" );
}
}
else
{
ri.Printf( PRINT_ALL, "...GL_EXT_texture_filter_anisotropic not found\n" );
}
} }
static void GLW_InitGamma( void ) static void GLW_InitGamma( void )

View file

@ -1111,6 +1111,31 @@ static void GLW_InitExtensions( void )
{ {
ri.Printf( PRINT_ALL, "...WGL_3DFX_gamma_control not found\n" ); ri.Printf( PRINT_ALL, "...WGL_3DFX_gamma_control not found\n" );
} }
glConfig.textureFilterAnisotropic = qfalse;
if ( strstr( glConfig.extensions_string, "GL_EXT_texture_filter_anisotropic" ) )
{
if ( r_ext_texture_filter_anisotropic->integer ) {
qglGetIntegerv( GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &glConfig.maxAnisotropy );
if ( glConfig.maxAnisotropy <= 0 ) {
ri.Printf( PRINT_ALL, "...GL_EXT_texture_filter_anisotropic not properly supported!\n" );
glConfig.maxAnisotropy = 0;
}
else
{
ri.Printf( PRINT_ALL, "...using GL_EXT_texture_filter_anisotropic (max: %i)\n", glConfig.maxAnisotropy );
glConfig.textureFilterAnisotropic = qtrue;
}
}
else
{
ri.Printf( PRINT_ALL, "...ignoring GL_EXT_texture_filter_anisotropic\n" );
}
}
else
{
ri.Printf( PRINT_ALL, "...GL_EXT_texture_filter_anisotropic not found\n" );
}
} }
/* /*