void StelQGLTextureBackend::loadFromPVR() { invariant(); //NOTE: We ignore bind options (mipmapping and filtering type) from params // at the moment. // // We also ignore maximum texture size (QGLContext::bindTexture should // fail if the texture is too large. // // QGLContext::bindTexture handles gl texture format for us. QGLContext* context = prepareContextForLoading(); glTextureID = context->bindTexture(path); if(glTextureID == 0) { errorOccured("loadFromPVR() failed to load a PVR file to a GL texture - " "Maybe the file \"" + path + "\" is missing?"); invariant(); return; } // For some reason only LINEAR seems to work. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); setTextureWrapping(); // This is an assumption; PVRTC can be either 4 or 2 bits per pixel - we assume the worse case. pixelBytes = 0.5f; completeLoading(); invariant(); }
//Image struct is copied (data is not - implicit sharing), so that //ensureTextureSizeWithinLimits won't affect the original image. void StelQGLTextureBackend::loadFromImage(QImage image) { invariant(); if(image.isNull()) { errorOccured("loadFromImage(): Image data to load from is null. " "Maybe the image failed to load from file?"); invariant(); return; } // Shrink if needed. glEnsureTextureSizeWithinLimits(image); if(!renderer->areNonPowerOfTwoTexturesSupported() && (!StelUtils::isPowerOfTwo(image.width()) || !StelUtils::isPowerOfTwo(image.height()))) { errorOccured("loadFromImage(): Failed to load because the image has " "non-power-of-two width and/or height while the renderer " "backend only supports power-of-two dimensions"); invariant(); return; } GLint internalFormat = glGetTextureInternalFormat(image); switch(internalFormat) { case GL_RGBA8: pixelBytes = 4.0f; break; case GL_RGB8: pixelBytes = 3.0f; break; case GL_LUMINANCE8_ALPHA8: pixelBytes = 2.0f; break; case GL_LUMINANCE8: pixelBytes = 1.0f; break; default: Q_ASSERT_X(false, Q_FUNC_INFO, "Unknown GL internal format for QImage"); } QGLContext* context = prepareContextForLoading(); glTextureID = context->bindTexture(image, GL_TEXTURE_2D, internalFormat, getTextureBindOptions(textureParams)); if(glTextureID == 0) { errorOccured("loadFromImage(): Failed to load an image to a GL texture"); invariant(); return; } setTextureWrapping(); completeLoading(); invariant(); }
void MenuState::createTexture() { glActiveTexture(GL_TEXTURE0); glGenTextures(1, &m_Texture); glBindTexture(GL_TEXTURE_2D, m_Texture); setTextureWrapping(); setTextureFiltering(); glGenerateMipmap(GL_TEXTURE_2D); auto textureData = loadTextureData(); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, m_TextureWidth, m_TextureHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, textureData); SOIL_free_image_data(textureData); }