1
0
mirror of https://github.com/blawar/GLideN64.git synced 2024-06-30 08:24:05 +00:00

Correct mip-map shader for the case when texture level is 0 and detailed texture enabled

This commit is contained in:
Sergey Lipskiy 2021-12-06 21:38:39 +07:00
parent 9d0e92a10d
commit f4fce5608f
2 changed files with 21 additions and 17 deletions

View File

@ -728,6 +728,7 @@ public:
"uniform lowp int uEnableLod; \n"
"uniform mediump float uMinLod; \n"
"uniform lowp int uMaxTile; \n"
"uniform lowp int uNoAtlasTex; \n"
"uniform lowp int uTextureDetail; \n"
" \n"
"mediump float mipmap(out lowp vec4 readtex0, out lowp vec4 readtex1) { \n"
@ -775,15 +776,11 @@ public:
" lod_frac = clamp(lod_frac - 1.0, -1.0, 1.0); \n"
" } \n"
" \n"
" if (tile0 == 0) \n"
" readtex0 = TextureMipMap0(uTex0, tcData0); \n"
" else if (uEnableLod == 0 || uMaxTile == 1) \n"
" readtex0 = TextureMipMap0(uTex1, tcData1); \n"
" if (tile0 == 0) readtex0 = TextureMipMap0(uTex0, tcData0); \n"
" else if (uNoAtlasTex != 0) readtex0 = TextureMipMap0(uTex1, tcData1); \n"
" else readtex0 = TextureMipMap1(uTex1, tcData1, float(tile0 - 1)); \n"
" if (tile1 == 0) \n"
" readtex1 = TextureMipMap0(uTex0, tcData0); \n"
" else if (uEnableLod == 0 || uMaxTile == 1) \n"
" readtex1 = TextureMipMap0(uTex1, tcData1); \n"
" if (tile1 == 0) readtex1 = TextureMipMap0(uTex0, tcData0); \n"
" else if (uNoAtlasTex != 0) readtex1 = TextureMipMap0(uTex1, tcData1); \n"
" else readtex1 = TextureMipMap1(uTex1, tcData1, float(tile1 - 1)); \n"
" return lod_frac; \n"
"} \n"
@ -857,6 +854,7 @@ public:
"uniform lowp int uEnableLod; \n"
"uniform mediump float uMinLod; \n"
"uniform lowp int uMaxTile; \n"
"uniform lowp int uNoAtlasTex; \n"
"uniform lowp int uTextureDetail; \n"
" \n"
"mediump float mipmap(out lowp vec4 readtex0, out lowp vec4 readtex1) { \n"
@ -898,10 +896,10 @@ public:
" } \n"
" \n"
" if(tile0 == 0) {READ_TEX0_MIPMAP(readtex0, uTex0, tcData0);} \n"
" else if (uEnableLod == 0 || uMaxTile == 1) {READ_TEX0_MIPMAP(readtex0, uTex1, tcData1);}\n"
" else if (uNoAtlasTex != 0) {READ_TEX0_MIPMAP(readtex0, uTex1, tcData1);}\n"
" else {READ_TEX1_MIPMAP(readtex0, uTex1, tcData1, tile0 - 1);} \n"
" if(tile1 == 0) {READ_TEX0_MIPMAP(readtex1, uTex0, tcData0);} \n"
" else if (uEnableLod == 0 || uMaxTile == 1) {READ_TEX0_MIPMAP(readtex1, uTex1, tcData1);}\n"
" else if (uNoAtlasTex != 0) {READ_TEX0_MIPMAP(readtex1, uTex1, tcData1);}\n"
" else {READ_TEX1_MIPMAP(readtex1, uTex1, tcData1, tile1 - 1);} \n"
" return lod_frac; \n"
"} \n"

View File

@ -99,26 +99,32 @@ public:
LocateUniform(uMinLod);
LocateUniform(uMaxTile);
LocateUniform(uEnableLod);
LocateUniform(uNoAtlasTex);
LocateUniform(uTextureDetail);
}
void update(bool _force) override
{
uMinLod.set(gDP.primColor.m, _force);
const CachedTexture * _pTexture = textureCache().current[1];
if (_pTexture == nullptr)
uMaxTile.set(gSP.texture.level, _force);
else
uMaxTile.set(_pTexture->max_level > 0 ? gSP.texture.level : std::min(gSP.texture.level, 1u), _force);
const int uCalcLOD = (gDP.otherMode.textureLOD == G_TL_LOD) ? 1 : 0;
uEnableLod.set(uCalcLOD, _force);
uEnableLod.set(gDP.otherMode.textureLOD == G_TL_LOD ? 1 : 0, _force);
uTextureDetail.set(gDP.otherMode.textureDetail, _force);
u32 maxTile = gSP.texture.level;
const CachedTexture * _pTexture = textureCache().current[1];
if (_pTexture != nullptr && _pTexture->max_level == 0)
maxTile = std::min(gSP.texture.level, 1u); // Hack for HD textures
uMaxTile.set(maxTile, _force);
bool bNoAtlasTex = maxTile == 0 || gDP.otherMode.textureLOD != G_TL_LOD ||
(gDP.otherMode.textureDetail != G_TD_DETAIL && maxTile == 1);
uNoAtlasTex.set(bNoAtlasTex ? 1 : 0, _force);
}
private:
fUniform uMinLod;
iUniform uMaxTile;
iUniform uEnableLod;
iUniform uNoAtlasTex;
iUniform uTextureDetail;
};