State machine bug fixed

This commit is contained in:
Mid 2026-01-14 11:37:59 +02:00
parent 63d641cc82
commit c44e58c4ac
2 changed files with 36 additions and 18 deletions

View File

@ -1640,7 +1640,7 @@ static void forward_subpass(mat4 projection, mat4 view, int transparent, int lig
if(!k3IsCore) { if(!k3IsCore) {
if(mat->passes[0].alphatest) { if(mat->passes[0].alphatest) {
glEnable(GL_ALPHA_TEST); glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0.9f); glAlphaFunc(GL_GREATER, mat->passes[0].alphatest);
} else { } else {
glDisable(GL_ALPHA_TEST); glDisable(GL_ALPHA_TEST);
} }
@ -1705,7 +1705,7 @@ void k3PassForward(mat4 projection, mat4 cam) {
if(GLAD_GL_EXT_framebuffer_sRGB) { if(GLAD_GL_EXT_framebuffer_sRGB) {
glEnable(GL_FRAMEBUFFER_SRGB_EXT); glEnable(GL_FRAMEBUFFER_SRGB_EXT);
} }
glEnable(GL_BLEND); glDisable(GL_BLEND);
glEnable(GL_MULTISAMPLE); glEnable(GL_MULTISAMPLE);
glFrontFace(GL_CCW); glFrontFace(GL_CCW);
@ -1727,6 +1727,7 @@ void k3PassForward(mat4 projection, mat4 cam) {
break; break;
} }
} }
glEnable(GL_BLEND);
// Horribly inefficient. // Horribly inefficient.
for(size_t rble = 0; rble < renderQueueSize; rble++) { for(size_t rble = 0; rble < renderQueueSize; rble++) {
@ -1780,12 +1781,8 @@ void k3PassDepthOnly(mat4 projection, mat4 cam, int clear, int cull) {
if(GLAD_GL_ARB_vertex_program) if(GLAD_GL_ARB_vertex_program)
glDisable(GL_VERTEX_PROGRAM_ARB); glDisable(GL_VERTEX_PROGRAM_ARB);
glFrontFace(GL_CCW);
if(cull) {
glEnable(GL_CULL_FACE); glEnable(GL_CULL_FACE);
} else { glFrontFace(GL_CCW);
glDisable(GL_CULL_FACE);
}
GLuint lastVP = 0; GLuint lastVP = 0;
struct k3GLSLP *lastGLSLP = NULL; struct k3GLSLP *lastGLSLP = NULL;
@ -1860,7 +1857,7 @@ void k3PassDepthOnly(mat4 projection, mat4 cam, int clear, int cull) {
if(!k3IsCore) { if(!k3IsCore) {
if(mat->passes[0].alphatest) { if(mat->passes[0].alphatest) {
glEnable(GL_ALPHA_TEST); glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0.9f); glAlphaFunc(GL_GREATER, mat->passes[0].alphatest);
} else { } else {
glDisable(GL_ALPHA_TEST); glDisable(GL_ALPHA_TEST);
} }
@ -1948,7 +1945,11 @@ static size_t compute_light_views(struct LightView lv[]) {
glm_frustum_center(corners, viewcenter); glm_frustum_center(corners, viewcenter);
mat4 lightview; mat4 lightview;
glm_look_anyup(viewcenter, l->dir.direction, lightview); if(glm_vec3_dot(l->dir.direction, (vec3) {0, 1, 0}) >= 0.99) {
glm_look(viewcenter, l->dir.direction, (vec3) {1, 0, 0}, lightview);
} else {
glm_look(viewcenter, l->dir.direction, (vec3) {0, 1, 0}, lightview);
}
vec4 minaabb = {+HUGE_VALF, +HUGE_VALF, +HUGE_VALF}; vec4 minaabb = {+HUGE_VALF, +HUGE_VALF, +HUGE_VALF};
vec4 maxaabb = {-HUGE_VALF, -HUGE_VALF, -HUGE_VALF}; vec4 maxaabb = {-HUGE_VALF, -HUGE_VALF, -HUGE_VALF};
@ -1961,7 +1962,10 @@ static size_t compute_light_views(struct LightView lv[]) {
glm_vec4_maxv(maxaabb, lightspaceCorner, maxaabb); glm_vec4_maxv(maxaabb, lightspaceCorner, maxaabb);
} }
glm_ortho(minaabb[0], maxaabb[0], minaabb[1], maxaabb[1], minaabb[2] - 50, maxaabb[2], lv[i].p[cascade]); // TODO: automate
float minz = 50;
glm_ortho(minaabb[0], maxaabb[0], minaabb[1], maxaabb[1], minaabb[2] - minz, maxaabb[2], lv[i].p[cascade]);
glm_mat4_inv_fast(lightview, lv[i].c[cascade]); glm_mat4_inv_fast(lightview, lv[i].c[cascade]);
} }
} else if(l->type == k3_SPOT || l->type == k3_HALF_OMNI) { } else if(l->type == k3_SPOT || l->type == k3_HALF_OMNI) {
@ -2262,7 +2266,7 @@ void k3PassIrregular(struct k3Offscreen *mainview, mat4 mainproj, mat4 maincam)
#endif #endif
// Constructs shadowmap atlas, saves `offscr` for own use // Constructs shadowmap atlas, saves `offscr` for own use
void k3PassShadowmap(mat4 projection, mat4 cam, struct k3Offscreen *offscr, float cellSizeLimit) { void k3PassShadowmap(mat4 projection, mat4 cam, struct k3Offscreen *offscr, int minimumSubdivision) {
struct k3Timer timer = k3StartTimer("k3PassShadowmap"); struct k3Timer timer = k3StartTimer("k3PassShadowmap");
glm_mat4_copy(projection, ProjMat); glm_mat4_copy(projection, ProjMat);
@ -2305,12 +2309,17 @@ void k3PassShadowmap(mat4 projection, mat4 cam, struct k3Offscreen *offscr, floa
cellsPerDimension = cellsTotalSqrt; cellsPerDimension = cellsTotalSqrt;
} }
if(cellsPerDimension < minimumSubdivision) {
cellsPerDimension = minimumSubdivision;
}
uint16_t sz = k3TexSzX(offscr->depth); uint16_t sz = k3TexSzX(offscr->depth);
float cellSz = (float) sz / cellsPerDimension; float cellSz = (float) sz / cellsPerDimension;
if(cellSizeLimit > 0) { #ifdef SHADOWSKIP
cellSz = fminf(cellSizeLimit, cellSz); static size_t shadowskipI = 0;
} shadowskipI++;
#endif
k3BeginOffscreen(offscr); k3BeginOffscreen(offscr);
size_t i = 0; size_t i = 0;
@ -2342,9 +2351,18 @@ void k3PassShadowmap(mat4 projection, mat4 cam, struct k3Offscreen *offscr, floa
glm_vec4_copy((vec4) {i, (float) cellSz / sz, 0, 0}, LightShadows[li].atlasSegment); glm_vec4_copy((vec4) {i, (float) cellSz / sz, 0, 0}, LightShadows[li].atlasSegment);
} }
#ifdef SHADOWSKIP
// Skip every second light
if((li + shadowskipI) % 2) {
#endif
glViewport(vp[0], vp[1], vp[2], vp[3]); glViewport(vp[0], vp[1], vp[2], vp[3]);
k3PassDepthOnly(proj, lv->c[camIdx], i == 0, false); k3PassDepthOnly(proj, lv->c[camIdx], i == 0, false);
#ifdef SHADOWSKIP
}
#endif
i++; i++;
} }
} }

View File

@ -106,7 +106,7 @@ struct k3Mat {
char additive; char additive;
char transparent; char transparent;
char nocull; char nocull;
char alphatest; float alphatest;
char depthwrite; char depthwrite;
} passes[1]; } passes[1];
}; };
@ -194,7 +194,7 @@ void k3BatchClear();
void k3PassForward(mat4 projection, mat4 cam); void k3PassForward(mat4 projection, mat4 cam);
void k3PassDepthOnly(mat4 projection, mat4 cam, int clear, int cull); void k3PassDepthOnly(mat4 projection, mat4 cam, int clear, int cull);
void k3PassShadowmap(mat4 projection, mat4 cam, struct k3Offscreen *offscr, float cellSizeLimit); void k3PassShadowmap(mat4 projection, mat4 cam, struct k3Offscreen *offscr, int minimumSubdivision);
struct k3Offscreen; struct k3Offscreen;
struct k3Offscreen *k3OffscreenCreateMultisampled(struct k3Tex *diffuse, struct k3Tex *depth, uint8_t samples); struct k3Offscreen *k3OffscreenCreateMultisampled(struct k3Tex *diffuse, struct k3Tex *depth, uint8_t samples);