bool Painter::initialize() { initializeOpenGLFunctions(); glClearColor(1.f, 1.f, 1.f, 0.f); m_transform.scale(2.f, 0.16f, 2.f); m_transform.translate(-.5f, 0.f, -.5f); // prepare vao and vbo m_vao.create(); m_vao.bind(); m_vertices.create(); m_vertices.setUsagePattern(QOpenGLBuffer::StaticDraw); glEnableVertexAttribArray(0); m_vao.release(); // create Texture m_height = getOrCreateTexture("data/height.png"); // create shader program m_program = createBasicShaderProgram("data/exercise6.vert", "data/exercise6.frag"); return true; }
bool Exercise13::initialize() { AbstractExercise::initialize(); m_textureID = getOrCreateTexture(TEXTURE_FILENAME); m_program0.reset(createBasicShaderProgram("data/cube13.vert", "data/cube13.frag")); m_cube.initialize(*m_program0); m_program1.reset(createBasicShaderProgram("data/sphere.vert", "data/sphere.frag")); m_sphere.initialize(*m_program1); glClearColor(0.6, 0.6, 0.6, 1.0); glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); return true; }
bool Exercise12::initialize() { AbstractExercise::initialize(); m_program.reset(createBasicShaderProgram("data/cube12.vert", "data/cube12.frag")); m_program->bind(); m_cube.initialize(*m_program); glClearColor(0.6, 0.6, 0.6, 1.0); glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); return true; }
bool Painter::initialize() { initializeOpenGLFunctions(); // Note: As always, feel free to change/modify parameters .. as long as its possible to // see the terrain and navigation basically works, everything is ok. glClearColor(1.f, 1.f, 1.f, 0.f); m_quad = new ScreenAlignedQuad(*this); m_light = QVector3D(2.f, 3.f, 2.f); QOpenGLShaderProgram * program; // setup default assimp scene shader (rendering the meshes...) // ToDo: If you render your own scene (e.g., a terrain, keep in mind // to extend your shaders for supporting shadowmaps as well as in assimp shaders... program = createBasicShaderProgram("data/assimp.vert", "data/assimp.frag"); m_programs[PaintMode1] = program; program->bindAttributeLocation("a_vertex", 0); program->bindAttributeLocation("a_normal", 1); program->bindAttributeLocation("a_texc", 2); program->link(); // load labeling shaders and resources m_programs[LabelAlphaMappingProgram] = createBasicShaderProgram("data/label.vert", "data/labelAM.frag"); m_programs[LabelDistanceMapProgram] = createBasicShaderProgram("data/label.vert", "data/labelDM.frag"); m_hpicgsLabelAM = FileAssociatedTexture::getOrCreate2D("data/hpicgs_label.png", *this); m_portccLabelAM = FileAssociatedTexture::getOrCreate2D("data/companion_cube_label.png", *this); // load and position 3d models in the scene // Note: feel free to modify / add / remove here... there should be at least // a few scene objects visible ;) m_hpicgs = new AssimpScene(*this, "data/hpicgs.obj", true); m_hpicgs->transform().scale(0.7f, 0.7f, 0.7f); m_hpicgs->transform().translate(-0.9f, 0.8f, -0.3f); m_hpicgs->transform().rotate( 56.0f, 0.f, 1.0f, 0.f); m_hpicgs->transform().rotate(0.0f, 1.f, 0.0f, 0.f); m_plane = new AssimpScene(*this, "data/plane.obj", false); m_plane->transform().translate(0.f, -0.1f, 0.f); m_portcc = new AssimpScene(*this, "data/companion_cube.obj", true); m_portcc->transform().scale(0.5f, 0.5f, 0.5f); m_portcc->transform().translate(1.1f, 0.73f, 1.2f); m_portcc->transform().rotate(8.0f, 0.f, 1.0f, 0.f); // initialize label positions // Task_3_1 - ToDo Begin // Modify the transformation matrix T to position, scale, and orient // the labels to appropriate places, based on the initial view! No // interaction should be required to be able to see both labels. m_hpicgsLabel = new ScreenAlignedQuad(*this, 0); QMatrix4x4 T; T.translate(0.5, 0.5, -1.0); T.scale(1.0, 0.3); // ToDo: use T.translate/scale/rotate ... m_transforms << T; m_portccLabel = new ScreenAlignedQuad(*this, 0); T.translate(-1.5, 0.0, 2.0); // ToDo: use T.translate/scale/rotate ... m_transforms << T; // Task_3_1 - ToDo End // initialize shader program attribute input program = m_programs[LabelAlphaMappingProgram]; program->bind(); program->bindAttributeLocation("a_vertex", 0); program->release(); program = m_programs[LabelDistanceMapProgram]; program->bind(); program->bindAttributeLocation("a_vertex", 0); program->release(); // create distance transforms of label images glGenTextures(1, &m_hpicgsLabelDM); glBindTexture(GL_TEXTURE_2D, m_hpicgsLabelDM); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); { QImage image("data/hpicgs_label_bitmask.png"); // ToDo: pre resize? DistanceTransform DT(image, 512, 128, 0.0625f); glTexImage2D(GL_TEXTURE_2D, 0, GL_R32F, 512, 128, 0, GL_RED, GL_FLOAT, DT.data()); } glGenerateMipmap(GL_TEXTURE_2D); glGenTextures(1, &m_portccLabelDM); glBindTexture(GL_TEXTURE_2D, m_portccLabelDM); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); { QImage image("data/companion_cube_label_bitmask.png"); // ToDo: pre resize? // image = image.scaled(? , ? , Qt::FastTransformation); DistanceTransform DT(image, 512, 128, 0.125f); glTexImage2D(GL_TEXTURE_2D, 0, GL_R32F, 512, 128, 0, GL_RED, GL_FLOAT, DT.data()); } glGenerateMipmap(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, 0); // create fbo m_programs[ShadowMapProgram] = createBasicShaderProgram("data/shadowmap.vert", "data/shadowmap.frag"); m_programs[ShadowMapDumpProgram] = createBasicShaderProgram("data/dump.vert", "data/dump.frag"); glGenTextures(1, &m_depthTex); glBindTexture(GL_TEXTURE_2D, m_depthTex); glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32, ShadowMapSize, ShadowMapSize, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); float color[] = { 1.0f, 1.0f, 1.0f, 1.0f }; glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, color); glBindTexture(GL_TEXTURE_2D, 0); glGenFramebuffers(1, &m_depthFbo); glBindFramebuffer(GL_FRAMEBUFFER, m_depthFbo); glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, m_depthTex, 0); glDrawBuffer(GL_NONE); glReadBuffer(GL_NONE); if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) qDebug() << "depth fbo invalid"; glBindFramebuffer(GL_FRAMEBUFFER, 0); return true; }