tavli
diff src/shadow.cc @ 19:37dead56f01e
fixed shadows
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Mon, 29 Jun 2015 06:18:45 +0300 |
parents | 986c0b76513f |
children |
line diff
1.1 --- a/src/shadow.cc Mon Jun 29 01:29:36 2015 +0300 1.2 +++ b/src/shadow.cc Mon Jun 29 06:18:45 2015 +0300 1.3 @@ -3,25 +3,28 @@ 1.4 #include "shadow.h" 1.5 #include "vmath/vmath.h" 1.6 1.7 +bool shadow_pass; 1.8 + 1.9 static int tex_sz, prev_vp[4]; 1.10 static unsigned int fbo, depth_tex, rb_color; 1.11 static Matrix4x4 shadow_mat; 1.12 1.13 bool init_shadow(int sz) 1.14 { 1.15 - if(!glcaps.fbo) { 1.16 - return true; 1.17 + if(!glcaps.fbo || !glcaps.shadow) { 1.18 + return false; 1.19 } 1.20 1.21 tex_sz = sz; 1.22 + printf("initializing shadow buffer (%dx%d)\n", tex_sz, tex_sz); 1.23 1.24 glGenFramebuffers(1, &fbo); 1.25 glBindFramebuffer(GL_FRAMEBUFFER, fbo); 1.26 1.27 glGenTextures(1, &depth_tex); 1.28 glBindTexture(GL_TEXTURE_2D, depth_tex); 1.29 - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); 1.30 - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); 1.31 + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 1.32 + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 1.33 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 1.34 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 1.35 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE); 1.36 @@ -56,36 +59,48 @@ 1.37 1.38 void begin_shadow_pass(const Vector3 &lpos, const Vector3 <arg, float lfov) 1.39 { 1.40 - Matrix4x4 viewmat, projmat; 1.41 + shadow_pass = true; 1.42 1.43 glPushAttrib(GL_ENABLE_BIT | GL_COLOR_BUFFER_BIT); 1.44 glDisable(GL_LIGHTING); 1.45 glColorMask(0, 0, 0, 0); 1.46 glDepthMask(1); 1.47 1.48 - projmat.set_perspective(DEG_TO_RAD(lfov) * 2.0, 1.0, 0.5, 500.0); 1.49 - viewmat.set_lookat(lpos, ltarg, Vector3(0, 1, 0)); 1.50 - shadow_mat = viewmat * projmat; 1.51 + Matrix4x4 viewmat; 1.52 + glGetFloatv(GL_MODELVIEW_MATRIX, viewmat[0]); 1.53 + viewmat.transpose(); 1.54 + 1.55 + Matrix4x4 lt_viewmat, lt_projmat; 1.56 + lt_projmat.set_perspective(DEG_TO_RAD(lfov) * 2.0, 1.0, 8.0, 50.0); 1.57 + lt_viewmat.set_lookat(lpos, ltarg, Vector3(0, 1, 0)); 1.58 + shadow_mat = lt_projmat * lt_viewmat * viewmat.inverse(); 1.59 1.60 glMatrixMode(GL_PROJECTION); 1.61 glPushMatrix(); 1.62 - glLoadTransposeMatrixf(projmat[0]); 1.63 + glLoadTransposeMatrixf(lt_projmat[0]); 1.64 + 1.65 glMatrixMode(GL_MODELVIEW); 1.66 glPushMatrix(); 1.67 - glLoadTransposeMatrixf(viewmat[0]); 1.68 + glLoadTransposeMatrixf(lt_viewmat[0]); 1.69 1.70 glGetIntegerv(GL_VIEWPORT, prev_vp); 1.71 glViewport(0, 0, tex_sz, tex_sz); 1.72 1.73 - glCullFace(GL_FRONT); 1.74 glBindFramebuffer(GL_FRAMEBUFFER, fbo); 1.75 + 1.76 + glPolygonOffset(2, 2); 1.77 + glEnable(GL_POLYGON_OFFSET_FILL); 1.78 + 1.79 + glClear(GL_DEPTH_BUFFER_BIT); 1.80 + glUseProgram(0); 1.81 } 1.82 1.83 1.84 void end_shadow_pass() 1.85 { 1.86 + shadow_pass = false; 1.87 + 1.88 glBindFramebuffer(GL_FRAMEBUFFER, 0); 1.89 - glCullFace(GL_BACK); 1.90 1.91 glViewport(prev_vp[0], prev_vp[1], prev_vp[2], prev_vp[3]); 1.92 1.93 @@ -100,6 +115,22 @@ 1.94 Matrix4x4 get_shadow_matrix() 1.95 { 1.96 return shadow_mat; 1.97 + 1.98 + /* 1.99 + glMatrixMode(GL_MODELVIEW); 1.100 + glPushMatrix(); 1.101 + glLoadIdentity(); 1.102 + gluPerspective(lfov * 2.0, 1.0, 0.5, 50.0); 1.103 + gluLookAt(lpos.x, lpos.y, lpos.z, ltarg.x, ltarg.y, ltarg.z, 0, 1, 0); 1.104 + 1.105 + float mat[16]; 1.106 + glGetFloatv(GL_MODELVIEW_MATRIX, mat); 1.107 + 1.108 + Matrix4x4 res; 1.109 + memcpy(res[0], mat, sizeof mat); 1.110 + res.transpose(); 1.111 + return res; 1.112 + */ 1.113 } 1.114 1.115 unsigned int get_shadow_tex()