// // helper.cxx // graphics // // Created by Sam Jaffe on 5/18/19. // Copyright © 2019 Sam Jaffe. All rights reserved. // #include "helper.hpp" #ifdef __APPLE__ #include #endif #include "vector/vector.hpp" namespace graphics { namespace textures { static int glfmt(format color_fmt) { switch (color_fmt) { case format::RGB: return GL_RGB; case format::RGBA: return GL_RGBA; } } unsigned int init(format color_fmt, math::vec2i dimension, unsigned char * data) { unsigned int id; // Enable texturings // glEnable( GL_TEXTURE_2D ); // Tell OpenGL that our pixel data is single-byte aligned glPixelStorei(GL_UNPACK_ALIGNMENT, 1); // Ask OpenGL for an unused texName (ID number) to use for this texture glGenTextures(1, &id); // Tell OpenGL to bind (set) this as the currently active texture glBindTexture(GL_TEXTURE_2D, id); // Set texture clamp vs. wrap (repeat) // one of: GL_CLAMP_TO_EDGE, GL_REPEAT, GL_MIRRORED_REPEAT, // GL_MIRROR_CLAMP_TO_EDGE, ... glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); // the format our source pixel data is currently in; any of: GL_RGB, // GL_RGBA, GL_LUMINANCE, GL_LUMINANCE_ALPHA, ... int bufferFormat = glfmt(color_fmt); // the format we want the texture to me on the card; allows us to translate // into a different texture format as we upload to OpenGL int internalFormat = bufferFormat; /* glTexImage2D: Load a 2d texture image * target: Creating this as a 2d texture. * level: Which mipmap level to use as the "root" (0 = the highest-quality, * full-res image), if mipmaps are enabled. * internalFormat: Type of texel format we want OpenGL to use for this * texture internally on the video card. * width: Texel-width of image; for maximum compatibility, use 2^N + 2^B, * where N is some integer in the range [3,10], and B is the border * thickness [0,1] * height: Texel-height of image; for maximum compatibility, use 2^M + 2^B, * where M is some integer in the range [3,10], and B is the border * thickness [0,1] * border: Border size, in texels (must be 0 or 1) * format: Pixel format describing the composition of the pixel data in * buffer * type: Pixel color components are unsigned bytes (one byte per color/alpha * channel) * pixels: Location of the actual pixel data bytes/buffer */ glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, dimension.x(), dimension.y(), 0, bufferFormat, GL_UNSIGNED_BYTE, data); glGenerateMipmap(GL_TEXTURE_2D); // Set magnification (texel > pixel) and minification (texel < pixel) // filters one of: GL_NEAREST, GL_LINEAR glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); // one of: GL_NEAREST, GL_LINEAR, GL_NEAREST_MIPMAP_NEAREST, // GL_NEAREST_MIPMAP_LINEAR, GL_LINEAR_MIPMAP_NEAREST, // GL_LINEAR_MIPMAP_LINEAR glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 5); return id; } }} namespace graphics { namespace shaders { unsigned int init(unsigned int type, std::string const & path) { return 0; } }}