Aniso-nearest texture filter mode.
This commit is contained in:
parent
59be3a2a17
commit
6da62ecfe4
@ -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" />
|
||||
|
@ -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");
|
||||
|
@ -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]];
|
||||
|
@ -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;
|
||||
|
@ -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.
|
||||
|
@ -229,6 +229,7 @@ enum TextureFilterMode
|
||||
FILTER_BILINEAR,
|
||||
FILTER_TRILINEAR,
|
||||
FILTER_ANISOTROPIC,
|
||||
FILTER_NEAREST_ANISOTROPIC,
|
||||
FILTER_DEFAULT,
|
||||
MAX_FILTERMODES
|
||||
};
|
||||
|
@ -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
|
||||
|
@ -50,6 +50,7 @@ static const char* filterModeNames[] =
|
||||
"bilinear",
|
||||
"trilinear",
|
||||
"anisotropic",
|
||||
"nearestanisotropic",
|
||||
"default",
|
||||
0
|
||||
};
|
||||
|
@ -129,6 +129,7 @@ enum TextureFilterMode
|
||||
FILTER_BILINEAR,
|
||||
FILTER_TRILINEAR,
|
||||
FILTER_ANISOTROPIC,
|
||||
FILTER_NEAREST_ANISOTROPIC,
|
||||
FILTER_DEFAULT,
|
||||
MAX_FILTERMODES
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user