示例#1
0
/*!
    \internal
*/
QCLImage3D QCLContextGL::createTexture3D
    (QMacCompatGLenum type, QMacCompatGLuint texture,
     QMacCompatGLint mipmapLevel, QCLMemoryObject::Access access)
{
    return createTexture3D(GLenum(type), GLuint(texture),
                           GLint(mipmapLevel), access);
}
int main(int argc, char* argv[])
{  
   Window win(g_window_res);

  // initialize the transfer function
  Transfer_function transfer_fun;
  
  // first clear possible old values
  transfer_fun.reset();

  // the add_stop method takes:
  //  - unsigned char or float - data value     (0.0 .. 1.0) or (0..255)
  //  - vec4f         - color and alpha value   (0.0 .. 1.0) per channel
  
  
  //transfer fuer aufgabe 31 und 32
  transfer_fun.add(0.0f, glm::vec4(0.0, 0.0, 0.0, 0.0));
  transfer_fun.add(1.0f, glm::vec4(1.0, 1.0, 1.0, 1.0));
  
  // transfer fuer aufgabe 33
  /*transfer_fun.add(0.0f, glm::vec4(0.0, 0.0, 0.0, 0.0));
  transfer_fun.add(0.2f, glm::vec4(0.0, 0.0, 0.0, 0.0));
  transfer_fun.add(0.25f, glm::vec4(0.5, 0.5, 0.5, 0.1));
  transfer_fun.add(0.3f, glm::vec4(0.0, 0.0, 0.0, 0.0));
  transfer_fun.add(0.35f, glm::vec4(0.0, 0.0, 0.0, 0.0));
  transfer_fun.add(0.55f, glm::vec4(1.0, 1.0, 1.0, 0.2));
  transfer_fun.add(0.75f, glm::vec4(0.0, 0.0, 0.0, 0.0));
  transfer_fun.add(1.0f, glm::vec4(0.0, 0.0, 0.0, 0.0));*/
  
  // transfer fuer aufgabe 4
  /*transfer_fun.add(0.0f, glm::vec4(0.0, 0.0, 0.0, 0.0));
  transfer_fun.add(0.2f, glm::vec4(0.0, 0.0, 0.0, 0.0));
  transfer_fun.add(0.25f, glm::vec4(0.5, 0.5, 0.5, 1.0));
  transfer_fun.add(0.3f, glm::vec4(0.0, 0.0, 0.0, 0.0));
  transfer_fun.add(1.0f, glm::vec4(0.0, 0.0, 0.0, 0.0));*/

  ///NOTHING TODO UNTIL HERE-------------------------------------------------------------------------------
  
  //init volume loader
  Volume_loader_raw loader;
  //read volume dimensions
  glm::ivec3 vol_dimensions = loader.get_dimensions(g_file_string);

  unsigned max_dim = std::max(std::max(vol_dimensions.x,
                            vol_dimensions.y),
                            vol_dimensions.z);

  // calculating max volume bounds of volume (0.0 .. 1.0)
  glm::vec3 max_volume_bounds = glm::vec3(vol_dimensions) / glm::vec3((float)max_dim);
  
  // loading volume file data
  auto volume_data = loader.load_volume(g_file_string);
  auto channel_size = loader.get_bit_per_channel(g_file_string) / 8;
  auto channel_count = loader.get_channel_count(g_file_string);
  
  // init and upload volume texture
  glActiveTexture(GL_TEXTURE0);
  createTexture3D(vol_dimensions.x, vol_dimensions.y, vol_dimensions.z, channel_size, channel_count, (char*)&volume_data[0]);

  // init and upload transfer function texture
  glActiveTexture(GL_TEXTURE1);
  createTexture2D(255u, 1u, (char*)&transfer_fun.get_RGBA_transfer_function_buffer()[0]);

  // setting up proxy geometry
  Cube cube(glm::vec3(0.0, 0.0, 0.0), max_volume_bounds);

  // loading actual raytracing shader code (volume.vert, volume.frag)
  // edit volume.frag to define the result of our volume raycaster
  GLuint program(0);
  try {
    program = loadShaders(g_file_vertex_shader, g_file_fragment_shader);
  } catch (std::logic_error& e) {
    std::cerr << e.what() << std::endl;
  }

  // init object manipulator (turntable)
  Manipulator manipulator;

  // manage keys here
  // add new input if neccessary (ie changing sampling distance, isovalues, ...)
  while (!win.shouldClose()) {
    // exit window with escape
    if (win.isKeyPressed(GLFW_KEY_ESCAPE)) {
      win.stop();
    }

    if (win.isKeyPressed(GLFW_KEY_LEFT)) {
        g_light_pos.x -= 0.5f;
    }

    if (win.isKeyPressed(GLFW_KEY_RIGHT)) {
        g_light_pos.x += 0.5f;
    }

    if (win.isKeyPressed(GLFW_KEY_UP)) {
        g_light_pos.z -= 0.5f;
    }

    if (win.isKeyPressed(GLFW_KEY_DOWN)) {
        g_light_pos.z += 0.5f;
    }

    if (win.isKeyPressed(GLFW_KEY_MINUS)) {
        g_iso_value -= 0.002f;
        g_iso_value = std::max(g_iso_value, 0.0f);
    }
    
    if (win.isKeyPressed(GLFW_KEY_EQUAL) || win.isKeyPressed(GLFW_KEY_KP_ADD)) {
        g_iso_value += 0.002f;
        g_iso_value = std::min(g_iso_value, 1.0f);
    }

    if (win.isKeyPressed(GLFW_KEY_D)) {
        g_sampling_distance -= 0.0001f;
        g_sampling_distance = std::max(g_sampling_distance, 0.0001f);
    }

    if (win.isKeyPressed(GLFW_KEY_S)) {
        g_sampling_distance += 0.0001f;
        g_sampling_distance = std::min(g_sampling_distance, 0.2f);
    }
    //pre-classification
    if (win.isKeyPressed(GLFW_KEY_O)){
        g_switch_classification = 0;
    }
    //post-classification
    if (win.isKeyPressed(GLFW_KEY_L)) {
        g_switch_classification = 1;
    }

    // to add key inputs:
    // check win.isKeyPressed(KEY_NAME)
    // - KEY_NAME - key name      (GLFW_KEY_A ... GLFW_KEY_Z)
    
    //if (win.isKeyPressed(GLFW_KEY_X)){
    //    
    //        ... do something
    //    
    //}
    
    
    
    /// reload shader if key R ist pressed
    if (win.isKeyPressed(GLFW_KEY_R)) {
        if (g_reload_shader_pressed != true) {
            GLuint newProgram(0);
            try {
                std::cout << "Reload shaders" << std::endl;
                newProgram = loadShaders(g_file_vertex_shader, g_file_fragment_shader);
            }
            catch (std::logic_error& e) {
                std::cerr << e.what() << std::endl;
                newProgram = 0;
            }
            if (0 != newProgram) {
                glDeleteProgram(program);
                program = newProgram;
            }
            g_reload_shader_pressed = true;
        }
    } else {
        g_reload_shader_pressed = false;
    }

    /// show transfer function if T is pressed
    if (win.isKeyPressed(GLFW_KEY_T)){
        if (!g_show_transfer_function_pressed){
            g_show_transfer_function = !g_show_transfer_function;
        }
        g_show_transfer_function_pressed = true;
    } else {
        g_show_transfer_function_pressed = false;
    }

    auto size = win.windowSize();
    glViewport(0, 0, size.x, size.y);
    glClearColor(g_background_color.x, g_background_color.y, g_background_color.z, 1.0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    float fovy = 45.0f;
    float aspect = (float)size.x / (float)size.y;
    float zNear = 0.025f, zFar = 10.0f;
    glm::mat4 projection = glm::perspective(fovy, aspect, zNear, zFar);

    glm::vec3 translate = max_volume_bounds * glm::vec3(-0.5f);

    glm::vec3 eye = glm::vec3(0.0f, 0.0f, 1.5f);
    glm::vec3 target = glm::vec3(0.0f);
    glm::vec3 up(0.0f, 1.0f, 0.0f);

    auto view = glm::lookAt(eye, target, up);

    auto model_view = view
                    * manipulator.matrix(win)
                    // rotate head upright
                    * glm::rotate(0.5f*float(M_PI), glm::vec3(0.0f,1.0f,0.0f))
                    * glm::rotate(0.5f*float(M_PI), glm::vec3(1.0f,0.0f,0.0f))
                    * glm::translate(translate)
                    ;

    glm::vec4 camera_translate = glm::column(glm::inverse(model_view), 3);
    glm::vec3 camera_location = glm::vec3(camera_translate.x, camera_translate.y, camera_translate.z);

    camera_location /= glm::vec3(camera_translate.w);

    glm::vec4 light_location = glm::vec4(g_light_pos, 1.0f) * model_view;

    glUseProgram(program);

    glUniform1i(glGetUniformLocation(program, "volume_texture"), 0);
    glUniform1i(glGetUniformLocation(program, "transfer_texture"), 1);

    glUniform3fv(glGetUniformLocation(program, "camera_location"), 1,
        glm::value_ptr(camera_location));
    glUniform1f(glGetUniformLocation(program, "sampling_distance"), g_sampling_distance);
    glUniform1i(glGetUniformLocation(program, "switch_classification"), g_switch_classification);
    glUniform1f(glGetUniformLocation(program, "iso_value"), g_iso_value);
    glUniform3fv(glGetUniformLocation(program, "max_bounds"), 1,
        glm::value_ptr(max_volume_bounds));
    glUniform3iv(glGetUniformLocation(program, "volume_dimensions"), 1,
        glm::value_ptr(vol_dimensions));

    glUniform3fv(glGetUniformLocation(program, "light_position"), 1,
        //glm::value_ptr(glm::vec3(light_location.x, light_location.y, light_location.z)));
        glm::value_ptr(g_light_pos));
    glUniform3fv(glGetUniformLocation(program, "light_color"), 1,
        glm::value_ptr(g_light_color));

    glUniform3fv(glGetUniformLocation(program, "light_color"), 1,
        glm::value_ptr(g_light_color));

    glUniformMatrix4fv(glGetUniformLocation(program, "Projection"), 1, GL_FALSE,
        glm::value_ptr(projection));
    glUniformMatrix4fv(glGetUniformLocation(program, "Modelview"), 1, GL_FALSE,
        glm::value_ptr(model_view));
    cube.draw();
    glUseProgram(0);

    if (g_show_transfer_function)
        transfer_fun.update_and_draw();

    win.update();
  }

  return 0;
}
示例#3
0
/*!
    \internal
*/
QCLImage3D QCLContextGL::createTexture3D
    (QMacCompatGLuint texture, QCLMemoryObject::Access access)
{
    return createTexture3D(GLenum(GL_TEXTURE_3D), GLuint(texture),
                           GLint(0), access);
}
示例#4
0
/*!
    \overload

    Creates a 3D OpenCL image object from the specified OpenGL
    \a texture object, and \a access mode.  If texture type is
    assumed to be \c{GL_TEXTURE_3D} and the mipmap level is
    assumed to be 0.

    This function will only work if supportsObjectSharing() is true.
*/
QCLImage3D QCLContextGL::createTexture3D(GLuint texture, QCLMemoryObject::Access access)
{
    return createTexture3D(GL_TEXTURE_3D, texture, 0, access);
}