zoukankan      html  css  js  c++  java
  • OpenGL ES2.0贴图

    1、定义传入着色器的顶点数据及索引

    //传入结构体
    typedef struct {
        float Position[3]; 
        float TexCoord[2];
    } Vertex;
    //顶点数据 
    const Vertex Vertices[] = {
        {{1, -1, 0}, {1, 1}},
        {{1, 1, 0},{1, 0}},
        {{-1, 1, 0}, {0, 0}},
        {{-1, -1, 0},{0, 1}},
    }; 
    //顶点索引
    const GLubyte Indices[] = { 
        0, 1, 2,
        2, 3, 0
    };

    2、生成图片纹理并获得其索引 方法

    + (GLuint)setupTexture:(UIImage *)pImage {
     
        CGImageRef spriteImage = pImage.CGImage;
        if (!spriteImage) {
            NSLog(@"Failed to load image ");
            exit(1);
        }
         
        size_t width = CGImageGetWidth(spriteImage);
        size_t height = CGImageGetHeight(spriteImage); 
        
        
        GLubyte * spriteData = (GLubyte *) calloc(width*height*4, sizeof(GLubyte));
        
        CGContextRef spriteContext = CGBitmapContextCreate(spriteData, width, height, 8, width*4,
                                                           CGImageGetColorSpace(spriteImage), kCGImageAlphaPremultipliedLast);
        
     
        CGContextDrawImage(spriteContext, CGRectMake(0, 0, width, height), spriteImage);
        
        CGContextRelease(spriteContext);
        
      
        GLuint texName;
        //生成纹理数
        glGenTextures(1, &texName);
        glBindTexture(GL_TEXTURE_2D, texName);
        
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
        //生成图片纹理
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, spriteData);
        
        free(spriteData);        
        return texName;    
    }

    3、获取传入GLSL的槽位

     //获得图片纹理索引
     _imageTexture = [OpenGLHelper setupTexture:pImage];
    //获得在GLSL中纹理的索引
       _texCoordSlot = glGetAttribLocation(_programHandle, "TexCoordIn");
        glEnableVertexAttribArray(_texCoordSlot);
        _textureUniform = glGetUniformLocation(_programHandle, "Texture");
    //获得GLSL中顶点的索引
       _positionSlot = glGetAttribLocation(_programHandle, "vPosition");

    4、在render(渲染)方法中加入

         //传入顶点着色器的数据
        glVertexAttribPointer(_positionSlot, 3, GL_FLOAT, GL_FALSE,
                              sizeof(Vertex), 0); 
        glVertexAttribPointer(_texCoordSlot, 2, GL_FLOAT, GL_FALSE,
                              sizeof(Vertex), (GLvoid*) (sizeof(float) * 3
                                                         ));
            
        glActiveTexture(GL_TEXTURE0);
        glBindTexture(GL_TEXTURE_2D, _imageTexture);
        glUniform1i(_textureUniform, 0);
       
        // 设置边缘截取模式  防止图片读取有问题
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
        
        glDrawElements(GL_TRIANGLES, sizeof(Indices)/sizeof(Indices[0]),
                       GL_UNSIGNED_BYTE, 0); 
  • 相关阅读:
    正向代理和反向代理
    CFree5构建中止问题
    [转]Prototype核心成员的反思
    解决js文件乱码问题
    【WPF开发备忘】使用MVVM模式开发中列表控件内的按钮事件无法触发解决方法
    rem 搭配 less 适配
    中国近代史-蒋廷黻
    docker 生成镜像 上传到docker hub
    CMD 执行 Python 脚本 出现假死状态
    vue 创建项目的两种方式
  • 原文地址:https://www.cnblogs.com/stratrail/p/3277407.html
Copyright © 2011-2022 走看看