void IrrDriver::generateSkyboxCubemap() { glEnable(GL_TEXTURE_CUBE_MAP_SEAMLESS); glGenTextures(1, &SkyboxCubeMap); glGenTextures(1, &ConvolutedSkyboxCubeMap); GLint w = 0, h = 0; for (unsigned i = 0; i < 6; i++) { w = MAX2(w, SkyboxTextures[i]->getOriginalSize().Width); h = MAX2(h, SkyboxTextures[i]->getOriginalSize().Height); } const unsigned texture_permutation[] = { 2, 3, 0, 1, 5, 4 }; char *rgba[6]; for (unsigned i = 0; i < 6; i++) rgba[i] = new char[w * h * 4]; for (unsigned i = 0; i < 6; i++) { unsigned idx = texture_permutation[i]; video::IImage* image = getVideoDriver()->createImageFromData( SkyboxTextures[idx]->getColorFormat(), SkyboxTextures[idx]->getSize(), SkyboxTextures[idx]->lock(), false ); SkyboxTextures[idx]->unlock(); image->copyToScaling(rgba[i], w, h); image->drop(); glBindTexture(GL_TEXTURE_CUBE_MAP, SkyboxCubeMap); glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGB, w, h, 0, GL_BGRA, GL_UNSIGNED_BYTE, (GLvoid*)rgba[i]); } testSH(rgba, w, h, blueSHCoeff, greenSHCoeff, redSHCoeff); for (unsigned i = 0; i < 6; i++) { glBindTexture(GL_TEXTURE_CUBE_MAP, ConvolutedSkyboxCubeMap); glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGB, w, h, 0, GL_BGRA, GL_UNSIGNED_BYTE, (GLvoid*)rgba[i]); } for (unsigned i = 0; i < 6; i++) delete[] rgba[i]; glBindTexture(GL_TEXTURE_CUBE_MAP, 0); }
void IrrDriver::generateDiffuseCoefficients() { if (!m_SH_dirty) return; m_SH_dirty = false; const unsigned texture_permutation[] = { 2, 3, 0, 1, 5, 4 }; if (SphericalHarmonicsTextures.size() == 6) { unsigned sh_w = 0, sh_h = 0; for (unsigned i = 0; i < 6; i++) { sh_w = MAX2(sh_w, SphericalHarmonicsTextures[i]->getOriginalSize().Width); sh_h = MAX2(sh_h, SphericalHarmonicsTextures[i]->getOriginalSize().Height); } unsigned char *sh_rgba[6]; for (unsigned i = 0; i < 6; i++) sh_rgba[i] = new unsigned char[sh_w * sh_h * 4]; for (unsigned i = 0; i < 6; i++) { unsigned idx = texture_permutation[i]; video::IImage* image = getVideoDriver()->createImageFromData( SphericalHarmonicsTextures[idx]->getColorFormat(), SphericalHarmonicsTextures[idx]->getSize(), SphericalHarmonicsTextures[idx]->lock(), false ); SphericalHarmonicsTextures[idx]->unlock(); image->copyToScaling(sh_rgba[i], sh_w, sh_h); delete image; } testSH(sh_rgba, sh_w, sh_h, blueSHCoeff, greenSHCoeff, redSHCoeff); for (unsigned i = 0; i < 6; i++) delete[] sh_rgba[i]; } else { int sh_w = 16; int sh_h = 16; video::SColor ambient = m_scene_manager->getAmbientLight().toSColor(); unsigned char *sh_rgba[6]; for (unsigned i = 0; i < 6; i++) { sh_rgba[i] = new unsigned char[sh_w * sh_h * 4]; for (int j = 0; j < sh_w * sh_h * 4; j += 4) { sh_rgba[i][j] = ambient.getBlue(); sh_rgba[i][j + 1] = ambient.getGreen(); sh_rgba[i][j + 2] = ambient.getRed(); sh_rgba[i][j + 3] = 255; } } testSH(sh_rgba, sh_w, sh_h, blueSHCoeff, greenSHCoeff, redSHCoeff); // Diffuse env map is x 0.25, compensate for (unsigned i = 0; i < 9; i++) { blueSHCoeff[i] *= 4; greenSHCoeff[i] *= 4; redSHCoeff[i] *= 4; } for (unsigned i = 0; i < 6; i++) delete[] sh_rgba[i]; } /*for (unsigned i = 0; i < 6; i++) { glBindTexture(GL_TEXTURE_CUBE_MAP, ConvolutedSkyboxCubeMap); glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_SRGB_ALPHA, w, h, 0, GL_BGRA, GL_UNSIGNED_BYTE, (GLvoid*)rgba[i]); } glBindTexture(GL_TEXTURE_CUBE_MAP, 0);*/ }