Aniso-nearest texture filter mode.

This commit is contained in:
Lasse Öörni 2016-12-18 13:42:24 +02:00
parent 59be3a2a17
commit 6da62ecfe4
9 changed files with 48 additions and 15 deletions

View File

@ -1233,7 +1233,7 @@ Textures can have an accompanying XML file which specifies load-time parameters,
<texture>
<address coord="u|v|w" mode="wrap|mirror|clamp|border" />
<border color="r g b a" />
<filter mode="nearest|bilinear|trilinear|anisotropic|default" anisotropy="x" />
<filter mode="nearest|bilinear|trilinear|anisotropic|nearestanisotropic|default" anisotropy="x" />
<mipmap enable="false|true" />
<quality low="x" medium="y" high="z" />
<srgb enable="false|true" />

View File

@ -425,6 +425,7 @@ static void RegisterTextures(asIScriptEngine* engine)
engine->RegisterEnumValue("TextureFilterMode", "FILTER_BILINEAR", FILTER_BILINEAR);
engine->RegisterEnumValue("TextureFilterMode", "FILTER_TRILINEAR", FILTER_TRILINEAR);
engine->RegisterEnumValue("TextureFilterMode", "FILTER_ANISOTROPIC", FILTER_ANISOTROPIC);
engine->RegisterEnumValue("TextureFilterMode", "FILTER_NEAREST_ANISOTROPIC", FILTER_NEAREST_ANISOTROPIC);
engine->RegisterEnumValue("TextureFilterMode", "FILTER_DEFAULT", FILTER_DEFAULT);
engine->RegisterEnum("TextureAddressMode");

View File

@ -42,10 +42,12 @@ static const D3D11_FILTER d3dFilterMode[] =
D3D11_FILTER_MIN_MAG_LINEAR_MIP_POINT,
D3D11_FILTER_MIN_MAG_MIP_LINEAR,
D3D11_FILTER_ANISOTROPIC,
D3D11_FILTER_MIN_MAG_POINT_MIP_LINEAR,
D3D11_FILTER_COMPARISON_MIN_MAG_MIP_POINT,
D3D11_FILTER_COMPARISON_MIN_MAG_LINEAR_MIP_POINT,
D3D11_FILTER_COMPARISON_MIN_MAG_MIP_LINEAR,
D3D11_FILTER_COMPARISON_ANISOTROPIC
D3D11_FILTER_COMPARISON_ANISOTROPIC,
D3D11_FILTER_COMPARISON_MIN_MAG_POINT_MIP_LINEAR
};
static const D3D11_TEXTURE_ADDRESS_MODE d3dAddressMode[] =
@ -133,7 +135,7 @@ void Texture::UpdateParameters()
memset(&samplerDesc, 0, sizeof samplerDesc);
unsigned filterModeIndex = filterMode_ != FILTER_DEFAULT ? filterMode_ : graphics_->GetDefaultTextureFilterMode();
if (shadowCompare_)
filterModeIndex += 4;
filterModeIndex += 5;
samplerDesc.Filter = d3dFilterMode[filterModeIndex];
samplerDesc.AddressU = d3dAddressMode[addressMode_[0]];
samplerDesc.AddressV = d3dAddressMode[addressMode_[1]];

View File

@ -81,12 +81,22 @@ static const D3DCMPFUNC d3dCmpFunc[] =
D3DCMP_GREATEREQUAL
};
static const D3DTEXTUREFILTERTYPE d3dMinMagFilter[] =
static const D3DTEXTUREFILTERTYPE d3dMinFilter[] =
{
D3DTEXF_POINT,
D3DTEXF_LINEAR,
D3DTEXF_LINEAR,
D3DTEXF_ANISOTROPIC
D3DTEXF_ANISOTROPIC,
D3DTEXF_POINT
};
static const D3DTEXTUREFILTERTYPE d3dMagFilter[] =
{
D3DTEXF_POINT,
D3DTEXF_LINEAR,
D3DTEXF_LINEAR,
D3DTEXF_ANISOTROPIC,
D3DTEXF_POINT,
};
static const D3DTEXTUREFILTERTYPE d3dMipFilter[] =
@ -94,6 +104,7 @@ static const D3DTEXTUREFILTERTYPE d3dMipFilter[] =
D3DTEXF_POINT,
D3DTEXF_POINT,
D3DTEXF_LINEAR,
D3DTEXF_ANISOTROPIC,
D3DTEXF_ANISOTROPIC
};
@ -1446,13 +1457,18 @@ void Graphics::SetTexture(unsigned index, Texture* texture)
if (filterMode == FILTER_DEFAULT)
filterMode = defaultTextureFilterMode_;
D3DTEXTUREFILTERTYPE minMag, mip;
minMag = d3dMinMagFilter[filterMode];
if (minMag != impl_->minMagFilters_[index])
D3DTEXTUREFILTERTYPE min, mag, mip;
min = d3dMinFilter[filterMode];
if (min != impl_->minFilters_[index])
{
impl_->device_->SetSamplerState(index, D3DSAMP_MAGFILTER, minMag);
impl_->device_->SetSamplerState(index, D3DSAMP_MINFILTER, minMag);
impl_->minMagFilters_[index] = minMag;
impl_->device_->SetSamplerState(index, D3DSAMP_MINFILTER, min);
impl_->minFilters_[index] = min;
}
mag = d3dMagFilter[filterMode];
if (mag != impl_->magFilters_[index])
{
impl_->device_->SetSamplerState(index, D3DSAMP_MAGFILTER, mag);
impl_->magFilters_[index] = mag;
}
mip = d3dMipFilter[filterMode];
if (mip != impl_->mipFilters_[index])
@ -2571,7 +2587,8 @@ void Graphics::ResetCachedState()
for (unsigned i = 0; i < MAX_TEXTURE_UNITS; ++i)
{
textures_[i] = 0;
impl_->minMagFilters_[i] = D3DTEXF_POINT;
impl_->minFilters_[i] = D3DTEXF_POINT;
impl_->magFilters_[i] = D3DTEXF_POINT;
impl_->mipFilters_[i] = D3DTEXF_NONE;
impl_->uAddressModes_[i] = D3DTADDRESS_WRAP;
impl_->vAddressModes_[i] = D3DTADDRESS_WRAP;

View File

@ -83,8 +83,10 @@ private:
D3DADAPTER_IDENTIFIER9 adapterIdentifier_;
/// Direct3D presentation parameters.
D3DPRESENT_PARAMETERS presentParams_;
/// Texture min/mag filter modes in use.
D3DTEXTUREFILTERTYPE minMagFilters_[MAX_TEXTURE_UNITS];
/// Texture min filter modes in use.
D3DTEXTUREFILTERTYPE minFilters_[MAX_TEXTURE_UNITS];
/// Texture mag filter modes in use.
D3DTEXTUREFILTERTYPE magFilters_[MAX_TEXTURE_UNITS];
/// Texture mip filter modes in use.
D3DTEXTUREFILTERTYPE mipFilters_[MAX_TEXTURE_UNITS];
/// Texture U coordinate addressing modes in use.

View File

@ -229,6 +229,7 @@ enum TextureFilterMode
FILTER_BILINEAR,
FILTER_TRILINEAR,
FILTER_ANISOTROPIC,
FILTER_NEAREST_ANISOTROPIC,
FILTER_DEFAULT,
MAX_FILTERMODES
};

View File

@ -137,6 +137,14 @@ void Texture::UpdateParameters()
glTexParameteri(target_, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
break;
case FILTER_NEAREST_ANISOTROPIC:
if (levels_ < 2)
glTexParameteri(target_, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
else
glTexParameteri(target_, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR);
glTexParameteri(target_, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
break;
default:
break;
}
@ -147,7 +155,7 @@ void Texture::UpdateParameters()
{
unsigned maxAnisotropy = anisotropy_ ? anisotropy_ : graphics_->GetDefaultTextureAnisotropy();
glTexParameterf(target_, GL_TEXTURE_MAX_ANISOTROPY_EXT,
filterMode == FILTER_ANISOTROPIC ? (float)maxAnisotropy : 1.0f);
(filterMode == FILTER_ANISOTROPIC || filterMode == FILTER_NEAREST_ANISOTROPIC) ? (float)maxAnisotropy : 1.0f);
}
// Shadow compare

View File

@ -50,6 +50,7 @@ static const char* filterModeNames[] =
"bilinear",
"trilinear",
"anisotropic",
"nearestanisotropic",
"default",
0
};

View File

@ -129,6 +129,7 @@ enum TextureFilterMode
FILTER_BILINEAR,
FILTER_TRILINEAR,
FILTER_ANISOTROPIC,
FILTER_NEAREST_ANISOTROPIC,
FILTER_DEFAULT,
MAX_FILTERMODES
};