attempt to take shadow support a bit further.

This commit is contained in:
Arisotura 2019-05-11 15:01:54 +02:00
parent 858c0eecb9
commit 5c9df6a4e5
1 changed files with 33 additions and 23 deletions

View File

@ -24,7 +24,7 @@
#include "NDS.h"
#include "GPU.h"
#include "Platform.h"
extern "C" u32 SDL_GetTicks();
namespace GPU3D
{
namespace GLRenderer43
@ -82,7 +82,7 @@ PFNGLBLENDEQUATIONSEPARATEIPROC glBlendEquationSeparatei;
PFNGLCOLORMASKIPROC glColorMaski;
PFNGLMEMORYBARRIERPROC glMemoryBarrier;
PFNGLMEMORYBARRIERPROC glMemoryBarrier;
PFNGLGETSTRINGIPROC glGetStringi;
@ -118,13 +118,14 @@ layout(location=2) uniform uint uOpaquePolyID;
layout(location=3) uniform uint uFogFlag;
layout(location=0) out vec4 oColor;
layout(location=1) out uvec2 oAttr;
layout(location=1) out uvec3 oAttr;
void main()
{
oColor = vec4(uColor).bgra / 31.0;
oAttr.r = uOpaquePolyID;
oAttr.g = 0;
oAttr.r = 0;
oAttr.g = uOpaquePolyID;
oAttr.b = 0;
}
)";
@ -165,7 +166,7 @@ smooth in vec2 fTexcoord;
flat in uvec3 fPolygonAttr;
layout(location=0) out vec4 oColor;
layout(location=1) out uvec2 oAttr;
layout(location=1) out uvec3 oAttr;
vec4 TextureLookup()
{
@ -475,7 +476,7 @@ void main()
if (col.a < 30.5/31) discard;
oColor = col;
oAttr.r = (fPolygonAttr.x >> 24) & 0x3F;
oAttr.g = (fPolygonAttr.x >> 24) & 0x3F;
}
)";
@ -489,7 +490,7 @@ void main()
if (col.a < 30.5/31) discard;
oColor = col;
oAttr.r = (fPolygonAttr.x >> 24) & 0x3F;
oAttr.g = (fPolygonAttr.x >> 24) & 0x3F;
gl_FragDepth = fZ;
}
)";
@ -503,6 +504,7 @@ void main()
if (col.a >= 30.5/31) discard;
oColor = col;
oAttr.g = 0xFF;
}
)";
@ -517,6 +519,7 @@ void main()
if (col.a >= 30.5/31) discard;
oColor = col;
oAttr.g = 0xFF;
gl_FragDepth = fZ;
}
)";
@ -526,7 +529,8 @@ const char* kRenderFS_ZSM = R"(
void main()
{
oColor = vec4(0,0,0,1);
oAttr.g = 1;
oAttr.g = 0xFF;
oAttr.b = 1;
}
)";
@ -537,7 +541,8 @@ smooth in float fZ;
void main()
{
oColor = vec4(0,0,0,1);
oAttr.g = 1;
oAttr.g = 0xFF;
oAttr.b = 1;
gl_FragDepth = fZ;
}
)";
@ -554,7 +559,8 @@ void main()
if (col.a >= 30.5/31) discard;
uvec4 iAttr = texelFetch(iAttrTex, ivec2(gl_FragCoord.xy), 0);
if (iAttr.y != 1) discard;
if (iAttr.b != 1) discard;
if (iAttr.g == ((fPolygonAttr.x >> 24) & 0x3F)) discard;
oColor = col;
}
@ -574,7 +580,8 @@ void main()
if (col.a >= 30.5/31) discard;
uvec4 iAttr = texelFetch(iAttrTex, ivec2(gl_FragCoord.xy), 0);
if (iAttr.y != 1) discard;
if (iAttr.b != 1) discard;
if (iAttr.g == ((fPolygonAttr.x >> 24) & 0x3F)) discard;
oColor = col;
gl_FragDepth = fZ;
@ -945,7 +952,8 @@ bool Init()
glGenFramebuffers(2, &FramebufferID[0]);
glBindFramebuffer(GL_FRAMEBUFFER, FramebufferID[0]);
glGenTextures(1, &FramebufferTex[0]);
// color buffer
glGenTextures(4, &FramebufferTex[0]);
glBindTexture(GL_TEXTURE_2D, FramebufferTex[0]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
@ -954,7 +962,7 @@ bool Init()
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, screenW, screenH, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, FramebufferTex[0], 0);
glGenTextures(1, &FramebufferTex[1]);
// depth/stencil buffer
glBindTexture(GL_TEXTURE_2D, FramebufferTex[1]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
@ -963,17 +971,20 @@ bool Init()
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, screenW, screenH, 0, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, NULL);
glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, FramebufferTex[1], 0);
glGenTextures(1, &FramebufferTex[2]);
// attribute buffer
// R: opaque polyID (for edgemarking)
// G: opaque polyID (for shadows, suppressed when rendering translucent polygons)
// B: stencil flag
glBindTexture(GL_TEXTURE_2D, FramebufferTex[2]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RG8UI, screenW, screenH, 0, GL_RG_INTEGER, GL_UNSIGNED_BYTE, NULL);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8UI, screenW, screenH, 0, GL_RGB_INTEGER, GL_UNSIGNED_BYTE, NULL);
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, FramebufferTex[2], 0);
// downscale framebuffer, for antialiased mode
glBindFramebuffer(GL_FRAMEBUFFER, FramebufferID[1]);
glGenTextures(1, &FramebufferTex[3]);
glBindTexture(GL_TEXTURE_2D, FramebufferTex[3]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
@ -1154,7 +1165,8 @@ void RenderSceneChunk(int y, int h)
UseRenderShader(flags);
// zorp
glColorMaski(1, GL_FALSE, GL_TRUE, GL_FALSE, GL_FALSE);
glDepthFunc(GL_LESS);
glDepthMask(GL_TRUE);
@ -1277,7 +1289,7 @@ if (PolygonList[NumOpaqueFinalPolys].PolyData->IsShadow) printf("!! GLORG!!! %08
UseRenderShader(flags | RenderFlag_ShadowMask);
glColorMaski(0, GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
glColorMaski(1, GL_FALSE, GL_TRUE, GL_FALSE, GL_FALSE);
glColorMaski(1, GL_FALSE, GL_FALSE, GL_TRUE, GL_FALSE);
glDepthMask(GL_FALSE);
glDepthFunc(GL_GEQUAL);
glStencilFunc(GL_ALWAYS,0,0);
@ -1301,7 +1313,7 @@ if (PolygonList[NumOpaqueFinalPolys].PolyData->IsShadow) printf("!! GLORG!!! %08
glEnable(GL_BLEND);
glColorMaski(0, GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glColorMaski(1, GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
glColorMaski(1, GL_FALSE, GL_TRUE, GL_FALSE, GL_FALSE);
lastwasshadow = false;
}
@ -1396,7 +1408,7 @@ void RenderFrame()
glBindFramebuffer(GL_FRAMEBUFFER, FramebufferID[0]);
glDisable(GL_BLEND);
glColorMaski(0, GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glColorMaski(1, GL_TRUE, GL_TRUE, GL_FALSE, GL_FALSE);
glColorMaski(1, GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE);
// clear buffers
// TODO: clear bitmap
@ -1432,8 +1444,6 @@ void RenderFrame()
glDrawArrays(GL_TRIANGLES, 0, 2*3);
}
glColorMaski(1, GL_TRUE, GL_FALSE, GL_FALSE, GL_FALSE);
if (RenderNumPolygons)
{
// render shit here