aboutsummaryrefslogtreecommitdiff
path: root/src/GPU3D_OpenGL43.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/GPU3D_OpenGL43.cpp')
-rw-r--r--src/GPU3D_OpenGL43.cpp60
1 files changed, 57 insertions, 3 deletions
diff --git a/src/GPU3D_OpenGL43.cpp b/src/GPU3D_OpenGL43.cpp
index 3bd8932..d792030 100644
--- a/src/GPU3D_OpenGL43.cpp
+++ b/src/GPU3D_OpenGL43.cpp
@@ -168,7 +168,7 @@ flat in uvec3 fPolygonAttr;
layout(location=0) out vec4 oColor;
layout(location=1) out uvec3 oAttr;
-vec4 TextureLookup()
+vec4 TextureLookup(ivec2 st)
{
uint attr = fPolygonAttr.y;
uint paladdr = fPolygonAttr.z;
@@ -181,7 +181,6 @@ vec4 TextureLookup()
int th = 8 << int((attr >> 23) & 0x7);
int vramaddr = int(attr & 0xFFFF) << 3;
- ivec2 st = ivec2(fTexcoord);
if ((attr & (1<<16)) != 0)
{
@@ -366,6 +365,60 @@ vec4 TextureLookup()
}
}
+vec4 TextureLookup_Nearest(vec2 texcoord)
+{
+ return TextureLookup(ivec2(texcoord));
+}
+
+vec4 TextureLookup_Linear(vec2 texcoord)
+{
+ ivec2 intpart = ivec2(texcoord);
+ vec2 fracpart = fract(texcoord);
+
+ vec4 A = TextureLookup(intpart);
+ vec4 B = TextureLookup(intpart + ivec2(1,0));
+ vec4 C = TextureLookup(intpart + ivec2(0,1));
+ vec4 D = TextureLookup(intpart + ivec2(1,1));
+
+ float fx = fracpart.x;
+ vec4 AB;
+ if (A.a < (0.5/31.0) && B.a < (0.5/31.0))
+ AB = vec4(0);
+ else
+ {
+ //if (A.a < (0.5/31.0) || B.a < (0.5/31.0))
+ // fx = step(0.5, fx);
+
+ AB = mix(A, B, fx);
+ }
+
+ fx = fracpart.x;
+ vec4 CD;
+ if (C.a < (0.5/31.0) && D.a < (0.5/31.0))
+ CD = vec4(0);
+ else
+ {
+ //if (C.a < (0.5/31.0) || D.a < (0.5/31.0))
+ // fx = step(0.5, fx);
+
+ CD = mix(C, D, fx);
+ }
+
+ fx = fracpart.y;
+ vec4 ret;
+ if (AB.a < (0.5/31.0) && CD.a < (0.5/31.0))
+ ret = vec4(0);
+ else
+ {
+ //if (AB.a < (0.5/31.0) || CD.a < (0.5/31.0))
+ // fx = step(0.5, fx);
+
+ ret = mix(AB, CD, fx);
+ }
+
+ return ret;
+}
+
vec4 FinalColor()
{
vec4 col;
@@ -394,7 +447,8 @@ vec4 FinalColor()
}
else
{
- vec4 tcol = TextureLookup();
+ vec4 tcol = TextureLookup_Nearest(fTexcoord);
+ //vec4 tcol = TextureLookup_Linear(fTexcoord);
if ((blendmode & 1) != 0)
{