mirror of
https://github.com/luanti-org/luanti.git
synced 2025-06-27 16:36:03 +00:00
Implement LODBias in GL3 driver
(currently unused)
This commit is contained in:
parent
1ea8763259
commit
8c52d5f2dd
4 changed files with 43 additions and 27 deletions
|
@ -1340,60 +1340,74 @@ void COpenGL3DriverBase::setTextureRenderStates(const SMaterial &material, bool
|
|||
|
||||
CacheHandler->setActiveTexture(GL_TEXTURE0 + i);
|
||||
|
||||
if (resetAllRenderstates)
|
||||
tmpTexture->getStatesCache().IsCached = false;
|
||||
const auto &layer = material.TextureLayers[i];
|
||||
auto &states = tmpTexture->getStatesCache();
|
||||
|
||||
if (!tmpTexture->getStatesCache().IsCached || material.TextureLayers[i].MagFilter != tmpTexture->getStatesCache().MagFilter) {
|
||||
E_TEXTURE_MAG_FILTER magFilter = material.TextureLayers[i].MagFilter;
|
||||
if (resetAllRenderstates)
|
||||
states.IsCached = false;
|
||||
|
||||
if (!states.IsCached || layer.MagFilter != states.MagFilter) {
|
||||
E_TEXTURE_MAG_FILTER magFilter = layer.MagFilter;
|
||||
GL.TexParameteri(tmpTextureType, GL_TEXTURE_MAG_FILTER,
|
||||
magFilter == ETMAGF_NEAREST ? GL_NEAREST : (assert(magFilter == ETMAGF_LINEAR), GL_LINEAR));
|
||||
|
||||
tmpTexture->getStatesCache().MagFilter = magFilter;
|
||||
states.MagFilter = magFilter;
|
||||
}
|
||||
|
||||
if (material.UseMipMaps && tmpTexture->hasMipMaps()) {
|
||||
if (!tmpTexture->getStatesCache().IsCached || material.TextureLayers[i].MinFilter != tmpTexture->getStatesCache().MinFilter ||
|
||||
!tmpTexture->getStatesCache().MipMapStatus) {
|
||||
E_TEXTURE_MIN_FILTER minFilter = material.TextureLayers[i].MinFilter;
|
||||
if (!states.IsCached || layer.MinFilter != states.MinFilter ||
|
||||
!states.MipMapStatus) {
|
||||
E_TEXTURE_MIN_FILTER minFilter = layer.MinFilter;
|
||||
GL.TexParameteri(tmpTextureType, GL_TEXTURE_MIN_FILTER,
|
||||
minFilter == ETMINF_NEAREST_MIPMAP_NEAREST ? GL_NEAREST_MIPMAP_NEAREST : minFilter == ETMINF_LINEAR_MIPMAP_NEAREST ? GL_LINEAR_MIPMAP_NEAREST
|
||||
: minFilter == ETMINF_NEAREST_MIPMAP_LINEAR ? GL_NEAREST_MIPMAP_LINEAR
|
||||
: (assert(minFilter == ETMINF_LINEAR_MIPMAP_LINEAR), GL_LINEAR_MIPMAP_LINEAR));
|
||||
|
||||
tmpTexture->getStatesCache().MinFilter = minFilter;
|
||||
tmpTexture->getStatesCache().MipMapStatus = true;
|
||||
states.MinFilter = minFilter;
|
||||
states.MipMapStatus = true;
|
||||
}
|
||||
} else {
|
||||
if (!tmpTexture->getStatesCache().IsCached || material.TextureLayers[i].MinFilter != tmpTexture->getStatesCache().MinFilter ||
|
||||
tmpTexture->getStatesCache().MipMapStatus) {
|
||||
E_TEXTURE_MIN_FILTER minFilter = material.TextureLayers[i].MinFilter;
|
||||
if (!states.IsCached || layer.MinFilter != states.MinFilter ||
|
||||
states.MipMapStatus) {
|
||||
E_TEXTURE_MIN_FILTER minFilter = layer.MinFilter;
|
||||
GL.TexParameteri(tmpTextureType, GL_TEXTURE_MIN_FILTER,
|
||||
(minFilter == ETMINF_NEAREST_MIPMAP_NEAREST || minFilter == ETMINF_NEAREST_MIPMAP_LINEAR) ? GL_NEAREST : (assert(minFilter == ETMINF_LINEAR_MIPMAP_NEAREST || minFilter == ETMINF_LINEAR_MIPMAP_LINEAR), GL_LINEAR));
|
||||
|
||||
tmpTexture->getStatesCache().MinFilter = minFilter;
|
||||
tmpTexture->getStatesCache().MipMapStatus = false;
|
||||
states.MinFilter = minFilter;
|
||||
states.MipMapStatus = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (LODBiasSupported &&
|
||||
(!states.IsCached || layer.LODBias != states.LODBias)) {
|
||||
if (layer.LODBias) {
|
||||
const float tmp = core::clamp(layer.LODBias * 0.125f, -MaxTextureLODBias, MaxTextureLODBias);
|
||||
GL.TexParameterf(tmpTextureType, GL.TEXTURE_LOD_BIAS, tmp);
|
||||
} else
|
||||
GL.TexParameterf(tmpTextureType, GL.TEXTURE_LOD_BIAS, 0.f);
|
||||
|
||||
states.LODBias = layer.LODBias;
|
||||
}
|
||||
|
||||
if (AnisotropicFilterSupported &&
|
||||
(!tmpTexture->getStatesCache().IsCached || material.TextureLayers[i].AnisotropicFilter != tmpTexture->getStatesCache().AnisotropicFilter)) {
|
||||
(!states.IsCached || layer.AnisotropicFilter != states.AnisotropicFilter)) {
|
||||
GL.TexParameteri(tmpTextureType, GL.TEXTURE_MAX_ANISOTROPY,
|
||||
material.TextureLayers[i].AnisotropicFilter > 1 ? core::min_(MaxAnisotropy, material.TextureLayers[i].AnisotropicFilter) : 1);
|
||||
layer.AnisotropicFilter > 1 ? core::min_(MaxAnisotropy, layer.AnisotropicFilter) : 1);
|
||||
|
||||
tmpTexture->getStatesCache().AnisotropicFilter = material.TextureLayers[i].AnisotropicFilter;
|
||||
states.AnisotropicFilter = layer.AnisotropicFilter;
|
||||
}
|
||||
|
||||
if (!tmpTexture->getStatesCache().IsCached || material.TextureLayers[i].TextureWrapU != tmpTexture->getStatesCache().WrapU) {
|
||||
GL.TexParameteri(tmpTextureType, GL_TEXTURE_WRAP_S, getTextureWrapMode(material.TextureLayers[i].TextureWrapU));
|
||||
tmpTexture->getStatesCache().WrapU = material.TextureLayers[i].TextureWrapU;
|
||||
if (!states.IsCached || layer.TextureWrapU != states.WrapU) {
|
||||
GL.TexParameteri(tmpTextureType, GL_TEXTURE_WRAP_S, getTextureWrapMode(layer.TextureWrapU));
|
||||
states.WrapU = layer.TextureWrapU;
|
||||
}
|
||||
|
||||
if (!tmpTexture->getStatesCache().IsCached || material.TextureLayers[i].TextureWrapV != tmpTexture->getStatesCache().WrapV) {
|
||||
GL.TexParameteri(tmpTextureType, GL_TEXTURE_WRAP_T, getTextureWrapMode(material.TextureLayers[i].TextureWrapV));
|
||||
tmpTexture->getStatesCache().WrapV = material.TextureLayers[i].TextureWrapV;
|
||||
if (!states.IsCached || layer.TextureWrapV != states.WrapV) {
|
||||
GL.TexParameteri(tmpTextureType, GL_TEXTURE_WRAP_T, getTextureWrapMode(layer.TextureWrapV));
|
||||
states.WrapV = layer.TextureWrapV;
|
||||
}
|
||||
|
||||
tmpTexture->getStatesCache().IsCached = true;
|
||||
states.IsCached = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue