# HG changeset patch # User Eleni Maria Stea # Date 1398611624 -10800 # Node ID 4b6c952a83bd420aa9710fb96accd092f7adc76c # Parent c4662d60cd9357524013d6ca0dd62a92e52e2995 works todo: 1- ta quads na nai to res tou volume * 2 2- conservative quad 3- to aspect ratio tou preview diff -r c4662d60cd93 -r 4b6c952a83bd data/shaders/vol.f.glsl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/data/shaders/vol.f.glsl Sun Apr 27 18:13:44 2014 +0300 @@ -0,0 +1,40 @@ +varying vec3 pt; + +uniform sampler3D tex; +uniform float tmin; +uniform float tmax; +uniform vec3 res; + +float transfer(float x, float tmin, float tmax) +{ + float dt = 0.25 * (tmax - tmin); + return smoothstep(tmin - dt, tmin + dt, x) * + (1.0 - smoothstep(tmax - dt, tmax + dt, x)); +} + +vec3 calc_normal(vec3 p, float texel) +{ + vec3 offs = 1.0 / res; + + float dfdx = texture3D(tex, p + vec3(offs.x, 0.0, 0.0)).x - texel; + float dfdy = texture3D(tex, p + vec3(0.0, offs.y, 0.0)).x - texel; + float dfdz = texture3D(tex, p + vec3(0.0, 0.0, offs.z)).x - texel; + + return normalize(vec3(dfdx, dfdy, dfdz)); +} + +void main() +{ + const vec3 ldir = vec3(-1.0, 1.0, 2.0); + + if(max(pt.x, max(pt.y, pt.z)) > 1.0 || min(pt.x, min(pt.y, pt.z)) < 0.0) + discard; + + float texel = texture3D(tex, pt).x; + float val = transfer(texel, tmin, tmax); + + vec3 normal = calc_normal(pt, texel); + float ndotl = max(dot(normalize(ldir), normal), 0.0); + + gl_FragColor = vec4(ndotl, ndotl, ndotl, val); +} diff -r c4662d60cd93 -r 4b6c952a83bd data/shaders/vol.v.glsl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/data/shaders/vol.v.glsl Sun Apr 27 18:13:44 2014 +0300 @@ -0,0 +1,16 @@ +#version 120 + +varying vec3 pt; + +void main() +{ + mat4 mvbb = gl_ModelViewMatrix; + + mvbb[0][0] = mvbb[1][1] = mvbb[2][2] = 1.0; + mvbb[0][1] = mvbb[0][2] = mvbb[1][2] = 0.0; + mvbb[1][0] = mvbb[2][0] = mvbb[2][1] = 0.0; + + gl_Position = gl_ProjectionMatrix * mvbb * gl_Vertex; + + pt = (transpose(gl_NormalMatrix) * gl_Vertex.xyz) * 0.5 + 0.5; +} diff -r c4662d60cd93 -r 4b6c952a83bd notes --- a/notes Thu Apr 24 21:33:26 2014 +0300 +++ b/notes Sun Apr 27 18:13:44 2014 +0300 @@ -1,12 +1,3 @@ -na balw to t tou gui -1000 ws 1000 k na ginetai map sto 0 ws 1 - -interpolation stin eval - -optimisations - -VBO - -******************* -MOTION sto main.cc pros to kontinotero akro: -map to x apo pixel se [0,1] k.a. -************ +a = density +normals +me to gradient: prev k epomeno diff -r c4662d60cd93 -r 4b6c952a83bd src/main.cc --- a/src/main.cc Thu Apr 24 21:33:26 2014 +0300 +++ b/src/main.cc Sun Apr 27 18:13:44 2014 +0300 @@ -25,7 +25,10 @@ static void reshape_xfer(int x, int y); static void mouse_xfer(int button, int state, int x, int y); static void motion_xfer(int x, int y); -static void volume_preview (); +static void volume_preview(); +static void draw_slices(); +static void draw_iso(); +static void draw_volume(); static int mainwin_id, xferwin_id; //todo keyb esc @@ -37,18 +40,23 @@ static const char *vol_fname = "data/test1.vol"; static const char *vsdr_path = "data/shaders/transfer.v.glsl"; static const char *fsdr_path = "data/shaders/transfer.f.glsl"; +static const char *vsdr_vol_path = "data/shaders/vol.v.glsl"; +static const char *fsdr_vol_path = "data/shaders/vol.f.glsl"; + +static unsigned int sprog; +static unsigned int sprog_vol; static Volume *vol; static Mesh *mesh; static float cur_z, thres = 0.5, thres2 = 1.0; -static float slice_z; +static float slice_z = 0.5; static int use_orig_vol_res = 1; static int vol_res[3]; // volume sampling resolution x/y/z static GLUI *ui; -static unsigned int sprog; +static int num_poly = 128; int main(int argc, char **argv) { @@ -89,6 +97,8 @@ glEnable(GL_LIGHT0); glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 1); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + //FIXME shaders setup if(!(sprog = sdr_getprog(vsdr_path, fsdr_path))) { @@ -96,6 +106,12 @@ return false; } + if(!(sprog_vol = sdr_getprog(vsdr_vol_path, fsdr_vol_path))) + { + fprintf(stderr, "Failed to create shader program!\n"); + return false; + } + vol = new Volume; if(!vol->load(vol_fname)) { fprintf(stderr, "Failed to load %s", vol_fname); @@ -195,7 +211,6 @@ { float aspect = win_xsz / win_ysz; - glDisable(GL_LIGHTING); glDisable(GL_DEPTH_TEST); glUseProgram(sprog); @@ -213,16 +228,16 @@ glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); - glOrtho(-aspect, aspect, -1.0, 1.0, -1.0, 1.0); + glOrtho(0, aspect, 0, 1, -1, 1); glBindTexture(GL_TEXTURE_3D, vol->get_texture()); glEnable(GL_TEXTURE_3D); glBegin(GL_QUADS); glColor3f(1.0, 1.0, 1.0); - glTexCoord3f(0, 0, slice_z); glVertex3f(-1.0, 1.0, 0.0); - glTexCoord3f(0, 1, slice_z); glVertex3f(-1.0, 0.5, 0.0); - glTexCoord3f(1, 1, slice_z); glVertex3f(-0.5, 0.5, 0.0); - glTexCoord3f(1, 0, slice_z); glVertex3f(-0.5, 1.0, 0.0); + glTexCoord3f(0, 0, slice_z); glVertex3f(0, 1, 0); + glTexCoord3f(0, 1, slice_z); glVertex3f(0, 0.75, 0); + glTexCoord3f(1, 1, slice_z); glVertex3f(0.25, 0.75, 0); + glTexCoord3f(1, 0, slice_z); glVertex3f(0.25, 1, 0); glEnd(); glDisable(GL_TEXTURE_3D); @@ -244,7 +259,72 @@ glUseProgram(0); glEnable(GL_DEPTH_TEST); - glEnable(GL_LIGHTING); +} + +static void draw_slices() +{ + glBindTexture(GL_TEXTURE_3D, vol->get_texture()); + glEnable(GL_TEXTURE_3D); + glBegin(GL_QUADS); + glTexCoord3f(0, 0, cur_z); glVertex3f(-1, -1, 0); + glTexCoord3f(0, 1, cur_z); glVertex3f(-1, 1, 0); + glTexCoord3f(1, 1, cur_z); glVertex3f(1, 1, 0); + glTexCoord3f(1, 0, cur_z); glVertex3f(1, -1, 0); + glEnd(); + glDisable(GL_TEXTURE_3D); +} + +static void draw_iso() +{ + if(mesh->is_empty()) { + printf("recalculating isosurface ... "); + fflush(stdout); + vol->create_mesh(mesh, thres, thres2, vol_res[0], vol_res[1], vol_res[2]); + printf("done.\n"); + } + mesh->draw(); +} + +static void draw_volume() +{ + glUseProgram(sprog_vol); + + int tmin_loc = glGetUniformLocation(sprog_vol, "tmin"); + if(tmin_loc != -1) + glUniform1f(tmin_loc, std::min(thres, thres2)); + int tmax_loc = glGetUniformLocation(sprog_vol, "tmax"); + if(tmax_loc != -1) + glUniform1f(tmax_loc, std::max(thres, thres2)); + + const Image *img = vol->get_slice(0); + int res_x = img->get_width(); + int res_y = img->get_height(); + int res_z = vol->get_slice_count(); + int res_loc = glGetUniformLocation(sprog_vol, "res"); + if(res_loc != -1) + glUniform3f(res_loc, (float)res_x, (float)res_y, (float)res_z); + + glDisable(GL_DEPTH_TEST); + glBindTexture(GL_TEXTURE_3D, vol->get_texture()); + glEnable(GL_TEXTURE_3D); + glEnable(GL_BLEND); + glBegin(GL_QUADS); + for(int i=0; iget_texture()); - glEnable(GL_TEXTURE_3D); - glBegin(GL_QUADS); - glTexCoord3f(0, 0, cur_z); glVertex3f(-1, -1, 0); - glTexCoord3f(0, 1, cur_z); glVertex3f(-1, 1, 0); - glTexCoord3f(1, 1, cur_z); glVertex3f(1, 1, 0); - glTexCoord3f(1, 0, cur_z); glVertex3f(1, -1, 0); - glEnd(); - glDisable(GL_TEXTURE_3D); -*/ - -/* if(mesh->is_empty()) { - printf("recalculating isosurface ... "); - fflush(stdout); - vol->create_mesh(mesh, thres, thres2, vol_res[0], vol_res[1], vol_res[2]); - printf("done.\n"); - } - mesh->draw(); -*/ + //draw_slices(); + //draw_iso(); + draw_volume(); volume_preview(); glutSwapBuffers(); @@ -290,10 +353,8 @@ glLoadIdentity(); gluPerspective(45, (float)x / (float)y, 0.5, 500); - if(x != win_xsz || y != win_ysz) { - win_xsz = x; - win_ysz = y; - } + win_xsz = x; + win_ysz = y; } static void keyboard(unsigned char key, int x, int y)