Convert an UIImage in a texture

后端 未结 3 868
闹比i
闹比i 2020-12-03 06:27

In my opengl project I need to convert an UIImage in texture; what\'s the way to do it? Can you help me?

相关标签:
3条回答
  • 2020-12-03 06:55

    Here is swift version of getting texture out of an UIImage

    func setupTexture(sourceImage: UIImage) -> GLuint {
    
    guard let textureImage = sourceImage.cgImage else {
        print("Failed to load image")
        return 0
    }
    
    let width = textureImage.width
    let height = textureImage.height
    
    /*
     it will write one byte each for red, green, blue, and alpha – so 4 bytes in total.
     */
    
    let textureData = calloc(width * height * 4, MemoryLayout<GLubyte>.size) //4 components per pixel (RGBA)
    let spriteContext = CGContext(data: textureData,
                                  width: width,
                                  height: height,
                                  bitsPerComponent: 8,
                                  bytesPerRow: width * 4,
                                  space: textureImage.colorSpace!,
                                  bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue)
    
    spriteContext?.draw(textureImage, in: CGRect(x: 0, y: 0, width: width, height: height))
    
    var textName = GLuint()
    glGenTextures(1, &textName)
    glBindTexture(GLenum(GL_TEXTURE_2D), textName)
    glTexParameteri(GLenum(GL_TEXTURE_2D), GLenum(GL_TEXTURE_MIN_FILTER), GL_NEAREST)
    glTexImage2D(GLenum(GL_TEXTURE_2D), 0, GL_RGBA, GLsizei(width),
                 GLsizei(height), 0, GLenum(GL_RGBA), GLenum(GL_UNSIGNED_BYTE), textureData)
    
    return textName
    

    }

    Note: Need to keep in mind that Core Graphics flips images when we load them in.

    0 讨论(0)
  • 2020-12-03 06:58

    Another way of doing this using the GLKit framework:

    //Path to image
    NSString *path = [[NSBundle mainBundle] pathForResource:@"textureImage" ofType:@"png"];
    
    //Set eaglContext
    [EAGLContext setCurrentContext:[[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]];
    
    //Create texture
    NSError *theError;    
    GLKTextureInfo *texture = [GLKTextureLoader textureWithContentsOfFile:filePath options:nil error:&theError];
    glBindTexture(texture.target, texture.name);
    

    texture.name is The OpenGL context’s name for the texture.

    0 讨论(0)
  • 2020-12-03 07:01

    I haven't test the following but i will decompose the conversion in 3 steps:

    1. Extract info for your image:

      UIImage* image = [UIImage imageNamed:@"imageToApplyAsATexture.png"];
      CGImageRef imageRef = [image CGImage];
      int width = CGImageGetWidth(imageRef);
      int height = CGImageGetHeight(imageRef);
      
    2. Allocate a textureData with the above properties:

      GLubyte* textureData = (GLubyte *)malloc(width * height * 4); // if 4 components per pixel (RGBA)
      
      CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
      NSUInteger bytesPerPixel = 4;
      NSUInteger bytesPerRow = bytesPerPixel * width;
      NSUInteger bitsPerComponent = 8;  
      CGContextRef context = CGBitmapContextCreate(textureData, width, height,
                                                   bitsPerComponent, bytesPerRow, colorSpace,
                                                   kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
      
      CGColorSpaceRelease(colorSpace);
      
      CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef);
      CGContextRelease(context);
      
    3. Set-up your texture:

      GLuint textureID;    
      glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
      glGenTextures(1, &textureID);
      
      glBindTexture(GL_TEXTURE_2D, textureID);
      glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, textureData);
      

    EDIT:

    Read this tut; everything is explained from the conversion of one image to a texture and applying a texture in an iOS environment.

    0 讨论(0)
提交回复
热议问题