OpenGLTexture::OpenGLTexture(const Graphics::Surface *surface) { width = surface->w; height = surface->h; format = surface->format; internalHeight = upperPowerOfTwo(height); internalWidth = upperPowerOfTwo(width); if (format.bytesPerPixel == 4) { internalFormat = GL_RGBA; sourceFormat = GL_UNSIGNED_BYTE; } else if (format.bytesPerPixel == 3) { internalFormat = GL_RGB; sourceFormat = GL_UNSIGNED_BYTE; } else if (format.bytesPerPixel == 2) { internalFormat = GL_RGB; sourceFormat = GL_UNSIGNED_SHORT_5_6_5; } else error("Unknown pixel format"); glGenTextures(1, &id); glBindTexture(GL_TEXTURE_2D, id); glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, internalWidth, internalHeight, 0, internalFormat, sourceFormat, 0); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); update(surface); }
OpenGLTexture::OpenGLTexture(const Graphics::Surface *surface, bool nonPoTSupport) : _unpackSubImageSupport(true) { width = surface->w; height = surface->h; format = surface->format; // Pad the textures if non power of two support is unavailable if (nonPoTSupport) { internalHeight = height; internalWidth = width; } else { internalHeight = upperPowerOfTwo(height); internalWidth = upperPowerOfTwo(width); } if (format.bytesPerPixel == 4) { internalFormat = GL_RGBA; #if defined(USE_GLES2) sourceFormat = GL_UNSIGNED_BYTE; #else sourceFormat = GL_UNSIGNED_INT_8_8_8_8_REV; #endif } else if (format.bytesPerPixel == 2) { internalFormat = GL_RGB; sourceFormat = GL_UNSIGNED_SHORT_5_6_5; } else error("Unknown pixel format"); glGenTextures(1, &id); glBindTexture(GL_TEXTURE_2D, id); glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, internalWidth, internalHeight, 0, internalFormat, sourceFormat, 0); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // TODO: If non power of two textures are unavailable this clamping // has no effect on the padded sides (resulting in white lines on the edges) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); update(surface); }