diff --git a/engine/resource/shader/shadow.fs b/engine/resource/shader/shadow.fs index 02e94b0..1d009e1 100644 --- a/engine/resource/shader/shadow.fs +++ b/engine/resource/shader/shadow.fs @@ -31,12 +31,30 @@ vec4 PhongShading(void) float ShadowCoef(void){ vec4 shadow_coord = vShadowCoord / vShadowCoord.w; - float view = shadow_coord.z; - float light = texture2D(depth_texture, shadow_coord.xy).z; + float view = shadow_coord.z - 0.0001; + vec2 d[4]; + float light = 1.0; float shadow_coef = 1.0; + int i; - if(vShadowCoord.w > 0.0){ - shadow_coef = light < view ? 0.0 : 1.0; + d[0] = vec2(-0.94201624, -0.39906216); + d[1] = vec2(0.94558609, -0.76890725); + d[2] = vec2(-0.094184101, -0.92938870); + d[3] = vec2(0.34495938, 0.29387760); + + light = texture2D(depth_texture, shadow_coord.xy).z; + + for(i = 0; i < 4; i++){ + vec2 p = shadow_coord.xy + d[i] / 700.0; + + if(p.x < 0.0) continue; + if(p.y < 0.0) continue; + if(p.x > 1.0) continue; + if(p.y > 1.0) continue; + + if(texture2D(depth_texture, p).z < view){ + shadow_coef -= 0.2; + } } return shadow_coef; diff --git a/engine/src/client.c b/engine/src/client.c index 3750fe4..bba6e12 100644 --- a/engine/src/client.c +++ b/engine/src/client.c @@ -2,6 +2,7 @@ #include #include +#include GBClient GBClientCreate(GBEngine engine) { GBClient client = malloc(sizeof(*client)); @@ -10,9 +11,9 @@ GBClient GBClientCreate(GBEngine engine) { client->engine = engine; - client->camera[0] = 2; - client->camera[1] = 1.5; - client->camera[2] = 2; + client->camera[0] = 5; + client->camera[1] = 5; + client->camera[2] = 5; client->look_at[0] = 0; client->look_at[1] = 0; @@ -38,62 +39,50 @@ void GBClientDestroy(GBClient client) { GBLog(GBLogInfo, "Destroyed client"); } +static double r = 0; + static void scene(void) { glColor3f(1, 1, 1); + + int i; + double u = 1; + + glPushMatrix(); + glTranslatef(0, fabs(sin(r)), 1); glBegin(GL_QUADS); - glNormal3f(0, 1, 0); - glVertex3f(-1, 0, -1); - glVertex3f(-1, 0, 1); - glVertex3f(1, 0, 1); - glVertex3f(1, 0, -1); - glEnd(); - - int i; - - glColor3f(1, 0, 0); - for(i = 0; i < 2; i++) { - glPushMatrix(); - glRotatef(180 * i, 0, 1, 0); - glBegin(GL_QUADS); - glNormal3f(-1, 0, 0); - glVertex3f(-1, 0.5, 0.25); - glVertex3f(-1, 0, 0.25); - glVertex3f(1, 0, 0.25); - glVertex3f(1, 0.5, 0.25); - glEnd(); - glPopMatrix(); + glNormal3f(0, -1, 0); + for(i = 0; i < 4; i++) { + glVertex3f(cos(90 * i / 180.0 * GBMathPi), u, sin(90 * i / 180.0 * GBMathPi)); } - glBegin(GL_QUADS); - glNormal3f(0, 1, 0); - glVertex3f(-1, 0.5, -0.25); - glVertex3f(-1, 0.5, 0.25); - glVertex3f(1, 0.5, 0.25); - glVertex3f(1, 0.5, -0.25); glEnd(); + for(i = 0; i < 4; i++) { + double n[3]; + double v0[3]; + double v1[3]; + double v2[3]; - glBegin(GL_QUADS); - glNormal3f(0, 1, 0); - glVertex3f(-1, -0.5, 0.25); - glVertex3f(-1, -0.5, -0.25); - glVertex3f(1, -0.5, -0.25); - glVertex3f(1, -0.5, 0.25); - glEnd(); + v0[0] = 0; + v0[1] = 1 + u; + v0[2] = 0; - glBegin(GL_QUADS); - glNormal3f(-1, 0, 0); - glVertex3f(-1, 0.5, 0.25); - glVertex3f(-1, 0.5, -0.25); - glVertex3f(-1, 0, -0.25); - glVertex3f(-1, 0, 0.25); - glEnd(); + v1[0] = cos(90 * (i + 1) / 180.0 * GBMathPi); + v1[1] = u; + v1[2] = sin(90 * (i + 1) / 180.0 * GBMathPi); - glBegin(GL_QUADS); - glNormal3f(1, 0, 0); - glVertex3f(1, 0.5, -0.25); - glVertex3f(1, 0.5, 0.25); - glVertex3f(1, 0, 0.25); - glVertex3f(1, 0, -0.25); - glEnd(); + v2[0] = cos(90 * i / 180.0 * GBMathPi); + v2[1] = u; + v2[2] = sin(90 * i / 180.0 * GBMathPi); + + GBMathNormal3x3(n, v0, v1, v2); + + glBegin(GL_TRIANGLES); + glNormal3f(n[0], n[1], n[2]); + glVertex3f(v0[0], v0[1], v0[2]); + glVertex3f(v1[0], v1[1], v1[2]); + glVertex3f(v2[0], v2[1], v2[2]); + glEnd(); + } + glPopMatrix(); } void GBClientStep(GBClient client) { @@ -118,18 +107,24 @@ void GBClientStep(GBClient client) { scene(); GBGLShadowAfterMapping(client->gl); } + + glDisable(GL_DEPTH_TEST); + glBegin(GL_QUADS); + glNormal3f(0, 1, 0); + glVertex3f(-10, -0, -10); + glVertex3f(-10, -0, 10); + glVertex3f(10, -0, 10); + glVertex3f(10, -0, -10); + glEnd(); + glEnable(GL_DEPTH_TEST); + scene(); GBGLShadowEnd(client->gl); client->engine->param->gl_swapbuffer(); - static double r = 0; - - client->camera[0] = cos(r) * 2; - client->camera[2] = sin(r) * 2; - - client->light0[0] = -cos(r) * 5; - client->light0[2] = -sin(r) * 5; + client->light0[0] = cos(r) * 5; + client->light0[2] = sin(r) * 5; r += 0.1; } diff --git a/engine/src/gl_camera.c b/engine/src/gl_camera.c index 0ca84df..ee381df 100644 --- a/engine/src/gl_camera.c +++ b/engine/src/gl_camera.c @@ -9,7 +9,7 @@ void GBGLPerspective(GBGL gl, double width, double height) { int i; double fovy = 60.0; double znear = 0.01; - double zfar = 10.0; + double zfar = 100.0; aspect = width / height; f = GBMathCot(fovy / 180 * GBMathPi / 2); diff --git a/engine/src/gl_shadow.c b/engine/src/gl_shadow.c index 316395d..96601f2 100644 --- a/engine/src/gl_shadow.c +++ b/engine/src/gl_shadow.c @@ -2,8 +2,8 @@ #include -#define SHADOW_WIDTH 1024 -#define SHADOW_HEIGHT 1024 +#define SHADOW_WIDTH 512 +#define SHADOW_HEIGHT 512 #define SHADOW_CULL void GBGLShadowInit(GBGL gl) { diff --git a/engine/src/math.c b/engine/src/math.c index 73f08e9..5a8f43a 100644 --- a/engine/src/math.c +++ b/engine/src/math.c @@ -46,7 +46,7 @@ void GBMathNormal3x3(GBVector3 r, GBVector3 v0, GBVector3 v1, GBVector3 v2) { GBVector3 t0, t1; GBMathSubtract3(t0, v1, v0); - GBMathSubtract3(t0, v2, v0); + GBMathSubtract3(t1, v2, v0); GBMathCross3(r, t0, t1);