// Load material for the bunny and shell static void initMaterials() { ... // bunny material g_bunnyMat.reset(new Material("./shaders/basic-gl3.vshader", "./shaders/bunny-gl3.fshader")); g_bunnyMat->getUniforms() .put("uColorAmbient", Cvec3f(0.45f, 0.3f, 0.3f)) .put("uColorDiffuse", Cvec3f(0.2f, 0.2f, 0.2f)); // bunny shell materials; shared_ptr<ImageTexture> shellTexture(new ImageTexture("shell.ppm", false)); // common shell texture // needs to enable repeating of texture coordinates shellTexture->bind(); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // eachy layer of the shell uses a different material, though the materials will share the // same shader files and some common uniforms. hence we create a prototype here, and will // copy from the prototype later Material bunnyShellMatPrototype("./shaders/bunny-shell-gl3.vshader", "./shaders/bunny-shell-gl3.fshader"); bunnyShellMatPrototype.getUniforms().put("uTexShell", shellTexture); bunnyShellMatPrototype.getRenderStates() .blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) // set blending mode .enable(GL_BLEND) // enable blending .disable(GL_CULL_FACE); // disable culling // allocate array of materials g_bunnyShellMats.resize(g_numShells); for (int i = 0; i < g_numShells; ++i) { g_bunnyShellMats[i].reset(new Material(bunnyShellMatPrototype)); // copy from the prototype // but set a different exponent for blending transparency g_bunnyShellMats[i]->getUniforms().put("uAlphaExponent", 2.f + 5.f * float(i + 1)/g_numShells); } };
Ray::Ray() { origin = Cvec3f(0., 0., 0.); direction = Cvec3f(0., 0., 0.); }