void LoadTextureAMT::processGPU_Texture2D() { ImageReader* reader = m_imageReaders[0]; if(!reader) { return; } glActiveTexture(GL_TEXTURE0); glGenTextures(1, &m_textureId); glBindTexture(m_target, m_textureId); int levels; if(m_loadMipmaps) { levels = reader->getLevelAmount(); if(levels == 1) { // If need mipmaps and image has only base level, set number of mipmap levels to generate levels = gmath::imageLevelCount(reader->getWidth(0), reader->getHeight(0), 1); } } else { levels = 1; } glTexStorage2D(m_target, levels, m_imageGLFormat, reader->getWidth(0), reader->getHeight(0)); for(int i = 0; i < reader->getLevelAmount(); i++) { if(reader->isCompressedFormat()) { glCompressedTexSubImage2D(m_target, i, 0, 0, reader->getWidth(i), reader->getHeight(i), reader->getFormat(), reader->getLevelSize(i), reader->getData(i)); } else { glTexSubImage2D(m_target, i, 0, 0, reader->getWidth(i), reader->getHeight(i), reader->getFormat(), GL_UNSIGNED_BYTE, reader->getData(i)); } } glTexParameteri(m_target, GL_TEXTURE_BASE_LEVEL, 0); if((reader->getLevelAmount() == 1) && m_loadMipmaps) { glGenerateMipmap(m_target); } if(m_loadMipmaps) { glTexParameteri(m_target, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); glTexParameteri(m_target, GL_TEXTURE_MAG_FILTER, GL_LINEAR); } else { glTexParameteri(m_target, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(m_target, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(m_target, GL_TEXTURE_MAX_LEVEL, 0); } // Anisotropy filtering float maximumAnistropy; glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &maximumAnistropy); glTexParameterf(m_target, GL_TEXTURE_MAX_ANISOTROPY_EXT, maximumAnistropy); glBindTexture(m_target, 0); utils::deleteAndNull(reader); m_imageReaders[0] = nullptr; m_context->m_target = m_target; m_context->m_textureId = m_textureId; }
C2DTextureResource::C2DTextureResource(const std::string &filePath, const int flags) : CTextureResource(filePath) { GLenum iFormat; int levels; //uint32_t size; ImageReader *img; m_textureId = 0; m_target = GL_TEXTURE_2D; m_type = ETT_TEX2D; // Fail loading if given extension is not supported. if((img = getImageFileByExtension(filePath)) == 0) { return; } // Fail loading if loaded file was invalid. if(!img->isValid()) { return; } iFormat = img->getOpenGLInternalFormat(flags); glActiveTexture(GL_TEXTURE0); glGenTextures(1, &m_textureId); glBindTexture(m_target, m_textureId); if(flags & ETF_MIPMAPS) { levels = img->getLevelAmount(); if(levels == 1) { // If need mipmaps and image has only base level, set number of mipmap levels to generate levels = gmath::imageLevelCount(img->getWidth(0), img->getHeight(0), 1); } } else { levels = 1; } glTexStorage2D(m_target, levels, iFormat, img->getWidth(0), img->getHeight(0)); for(int i = 0; i < img->getLevelAmount(); i++) { if(img->isCompressedFormat()) { glCompressedTexSubImage2D(m_target, i, 0, 0, img->getWidth(i), img->getHeight(i), img->getFormat(), img->getLevelSize(i), img->getData(i)); } else { glTexSubImage2D(m_target, i, 0, 0, img->getWidth(i), img->getHeight(i), img->getFormat(), GL_UNSIGNED_BYTE, img->getData(i)); } } glTexParameteri(m_target, GL_TEXTURE_BASE_LEVEL, 0); if((img->getLevelAmount() == 1) && (flags & ETF_MIPMAPS)) { glGenerateMipmap(m_target); } if(flags & ETF_MIPMAPS) { glTexParameteri(m_target, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); glTexParameteri(m_target, GL_TEXTURE_MAG_FILTER, GL_LINEAR); } else { glTexParameteri(m_target, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(m_target, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(m_target, GL_TEXTURE_MAX_LEVEL, 0); } // Anisotropy filtering float maximumAnistropy; glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &maximumAnistropy); glTexParameterf(m_target, GL_TEXTURE_MAX_ANISOTROPY_EXT, maximumAnistropy); //size = approxSize(iFormat, img->getXBlocks(0), img->getYBlocks(0), 1, flags & ETF_MIPMAPS); glBindTexture(m_target, 0); delete img; m_loaded = true; }