1
0
mirror of https://github.com/blawar/GLideN64.git synced 2024-07-02 09:03:37 +00:00

LOD: tile selection and lod_frac calculation changes

This commit is contained in:
s2s 2021-08-22 18:33:32 +02:00 committed by Sergey Lipskiy
parent 539e3b0ad4
commit 134aa31e61

View File

@ -2122,14 +2122,13 @@ public:
else {
if (config.texture.bilinearMode == BILINEAR_3POINT)
m_part =
"#define READ_TEX0_MIPMAP(name, tex, tcData, lod) \\\n"
"#define READ_TEX0_MIPMAP(name, tex, tcData) \\\n"
"{ \\\n"
" lowp float bottomRightTri = step(1.0, tcData[4].s + tcData[4].t); \\\n"
" lowp vec2 lod_scale = vec2(textureSize(tex,int(lod))) / vec2(textureSize(tex,0)); \\\n"
" lowp vec4 c00 = texelFetch(tex, ivec2(tcData[0]*lod_scale), int(lod)); \\\n"
" lowp vec4 c01 = texelFetch(tex, ivec2(tcData[1]*lod_scale), int(lod)); \\\n"
" lowp vec4 c10 = texelFetch(tex, ivec2(tcData[2]*lod_scale), int(lod)); \\\n"
" lowp vec4 c11 = texelFetch(tex, ivec2(tcData[3]*lod_scale), int(lod)); \\\n"
" lowp vec4 c00 = texelFetch(tex, ivec2(tcData[0]), 0); \\\n"
" lowp vec4 c01 = texelFetch(tex, ivec2(tcData[1]), 0); \\\n"
" lowp vec4 c10 = texelFetch(tex, ivec2(tcData[2]), 0); \\\n"
" lowp vec4 c11 = texelFetch(tex, ivec2(tcData[3]), 0); \\\n"
" lowp vec4 c0 = c00 + tcData[4].s*(c10-c00) + tcData[4].t*(c01-c00); \\\n"
" lowp vec4 c1 = c11 + (1.0-tcData[4].s)*(c01-c11) + (1.0-tcData[4].t)*(c10-c11); \\\n"
" name = c0 + bottomRightTri * (c1-c0); \\\n"
@ -2159,13 +2158,12 @@ public:
;
else
m_part =
"#define READ_TEX0_MIPMAP(name, tex, tcData, lod) \\\n"
"#define READ_TEX0_MIPMAP(name, tex, tcData) \\\n"
"{ \\\n"
" lowp vec2 lod_scale = vec2(textureSize(tex,int(lod))) / vec2(textureSize(tex,0)); \\\n"
" lowp vec4 c00 = texelFetch(tex, ivec2(tcData[0]*lod_scale), int(lod)); \\\n"
" lowp vec4 c01 = texelFetch(tex, ivec2(tcData[1]*lod_scale), int(lod)); \\\n"
" lowp vec4 c10 = texelFetch(tex, ivec2(tcData[2]*lod_scale), int(lod)); \\\n"
" lowp vec4 c11 = texelFetch(tex, ivec2(tcData[3]*lod_scale), int(lod)); \\\n"
" lowp vec4 c00 = texelFetch(tex, ivec2(tcData[0]), 0); \\\n"
" lowp vec4 c01 = texelFetch(tex, ivec2(tcData[1]), 0); \\\n"
" lowp vec4 c10 = texelFetch(tex, ivec2(tcData[2]), 0); \\\n"
" lowp vec4 c11 = texelFetch(tex, ivec2(tcData[3]), 0); \\\n"
" lowp vec4 c0 = c00 + tcData[4].s * (c10-c00); \\\n"
" lowp vec4 c1 = c01 + tcData[4].s * (c11-c01); \\\n"
" name = c0 + tcData[4].t * (c1-c0); \\\n"
@ -2199,8 +2197,8 @@ public:
"uniform mediump float uMinLod; \n"
" \n"
"mediump float mipmap(out lowp vec4 readtex0, out lowp vec4 readtex1) { \n"
" READ_TEX_MIPMAP0(readtex0, uTex0, tcData0, 0); \n"
" READ_TEX_MIPMAP0(readtex1, uTex1, tcData1, 0); \n"
" READ_TEX0_MIPMAP(readtex0, uTex0, tcData0); \n"
" READ_TEX0_MIPMAP(readtex1, uTex1, tcData1); \n"
" if (uMaxTile == 0) return 1.0; \n"
" return uMinLod; \n"
"} \n"
@ -2213,63 +2211,43 @@ public:
"uniform lowp int uTextureDetail; \n"
" \n"
"mediump float mipmap(out lowp vec4 readtex0, out lowp vec4 readtex1) { \n"
" READ_TEX0_MIPMAP(readtex0, uTex0, tcData0, 0) \n"
" if (uMaxTile > 1) READ_TEX1_MIPMAP(readtex1, uTex1, tcData1, 0) \n"
" else READ_TEX0_MIPMAP(readtex1, uTex1, tcData1, 0) \n"
" \n"
" mediump float fMaxTile = float(uMaxTile); \n"
" mediump vec2 dx = abs(dFdx(vLodTexCoord)) * uScreenScale; \n"
" mediump vec2 dy = abs(dFdy(vLodTexCoord)) * uScreenScale; \n"
" mediump float lod = max(max(dx.x, dx.y), max(dy.x, dy.y)); \n"
" bool magnify = lod < 1.0; \n"
" mediump float lod_tile = magnify ? 0.0 : floor(log2(floor(lod))); \n"
" bool distant = lod > 128.0 || lod_tile >= fMaxTile; \n"
" mediump float lod_frac = fract(lod/pow(2.0, lod_tile)); \n"
" if (magnify) lod_frac = max(lod_frac, uMinLod); \n"
" if (uTextureDetail == 0) { \n"
" if (distant) lod_frac = 1.0; \n"
" else if (magnify) lod_frac = 0.0; \n"
" } \n"
" if (magnify && ((uTextureDetail & 1) != 0)) \n"
" lod_frac = 1.0 - lod_frac; \n"
" if (uMaxTile == 0) { \n"
" if (uEnableLod != 0) { \n"
" if ((uTextureDetail & 2) == 0) readtex1 = readtex0; \n"
" else if (!magnify) readtex0 = readtex1; \n"
" lowp int max_tile = min(uTextureDetail != 2 ? 7 : 6, uMaxTile); \n"
" mediump float min_lod = uTextureDetail != 0 ? uMinLod : 1.0; \n"
" mediump float max_lod = pow(2.0, float(max_tile)) - 1.0 / 32.0; \n"
" mediump float lod_clamp = min(max(lod, min_lod), max_lod); \n"
" lowp int lod_tile = clamp(int(log2(lod_clamp)), 0 , max_tile); \n"
" lowp int tile0 = 0; \n"
" lowp int tile1 = 1; \n"
" if (uEnableLod != 0) { \n"
" if (lod_clamp < 1.0 && uTextureDetail == 0) { \n"
" tile0 = 0; \n"
" tile1 = 0; \n"
" } else if (lod_clamp >= 1.0 && uTextureDetail == 2) { \n"
" tile0 = lod_tile + 1; \n"
" tile1 = lod_tile + 2; \n"
" } else { \n"
" tile0 = lod_tile; \n"
" tile1 = lod_tile + 1; \n"
" } \n"
" return lod_frac; \n"
" } \n"
" if (uEnableLod == 0) return lod_frac; \n"
" mediump float lod_frac = lod_clamp / pow(2.0, float(lod_tile)); \n"
" if (uTextureDetail == 1 || lod_clamp >= 1.0) { \n"
" lod_frac = clamp(lod_frac - 1.0, -1.0, 1.0); \n"
" } \n"
" \n"
" lod_tile = min(lod_tile, fMaxTile - 1.0); \n"
" lowp float lod_tile_m1 = max(0.0, lod_tile - 1.0); \n"
" lowp float lod_tile_p1 = min(fMaxTile - 1.0, lod_tile + 1.0); \n"
" lowp vec4 lodT, lodT_m1, lodT_p1; \n"
" READ_TEX1_MIPMAP(lodT, uTex1, tcData1, lod_tile); \n"
" READ_TEX1_MIPMAP(lodT_m1, uTex1, tcData1, lod_tile_m1); \n"
" READ_TEX1_MIPMAP(lodT_p1, uTex1, tcData1, lod_tile_p1); \n"
" if (lod_tile < 1.0) { \n"
" if (magnify) { \n"
// !sharpen && !detail
" if (uTextureDetail == 0) readtex1 = readtex0; \n"
" } else { \n"
// detail
" if ((uTextureDetail & 2) != 0 ) { \n"
" readtex0 = lodT; \n"
" readtex1 = lodT_p1; \n"
" } \n"
" } \n"
" } else { \n"
" if ((uTextureDetail & 2) != 0 ) { \n"
" readtex0 = lodT; \n"
" readtex1 = lodT_p1; \n"
" } else { \n"
" readtex0 = lodT_m1; \n"
" readtex1 = lodT; \n"
" } \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 {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 {READ_TEX1_MIPMAP(readtex1, uTex1, tcData1, tile1 - 1);} \n"
" return lod_frac; \n"
"} \n"
"} \n"
;
}
}