美文网首页
OpenGL常用函数笔记

OpenGL常用函数笔记

作者: whlpkk | 来源:发表于2018-05-02 16:31 被阅读45次

    glTexImage2D

    void glTexImage2D (
        GLenum target, 
        GLint level, 
        GLint internalformat, 
        GLsizei width, 
        GLsizei height, 
        GLint border, 
        GLenum format, 
        GLenum type, 
        const GLvoid *pixels
    );
    

    为当前绑定的纹理对象开辟内存并填充pixels数据到相应内存,生成纹理图像

    • target参数指定了纹理目标。设置为GL_TEXTURE_2D意味着会生成与当前绑定的纹理对象在同一个目标上的纹理(任何绑定到GL_TEXTURE_1D和GL_TEXTURE_3D的纹理不会受到影响)。
    • level参数为纹理指定多级渐远纹理的级别,如果你希望单独手动设置每个多级渐远纹理的级别的话。这里我们填0,也就是基本级别。
    • internalformat参数告诉OpenGL我们希望把纹理储存为何种格式。我们的图像只有RGB值,因此我们也把纹理储存为RGB值。
    • width height参数设置最终的纹理的宽度和高度。我们之前加载图像的时候储存了它们,所以我们使用对应的变量。
    • border参数应该总是被设为0(历史遗留的问题)。
    • format type参数定义了源图的格式和数据类型。我们使用RGB值加载这个图像,并把它们储存为char(byte)数组,我们将会传入对应值。
    • pixels参数是真正的图像数据。

    glFramebufferTexture2D

    void glFramebufferTexture2D (
        GLenum target, 
        GLenum attachment, 
        GLenum textarget, 
        GLuint texture, 
        GLint level
    );
    

    把纹理附件绑定到帧缓冲

    • target:帧缓冲的目标GL_FRAMEBUFFER GL_READ_FRAMEBUFFER GL_DRAW_FRAMEBUFFER
    • attachment:我们想要附加的附件类型。颜色、深度、模板GL_COLOR_ATTACHMENT0 GL_DEPTH_ATTACHMENT GL_STENCIL_ATTACHMENT
    • textarget:你希望附加的纹理类型GL_TEXTURE_2D
    • texture:要附加的纹理本身
    • level:多级渐远纹理的级别。我们将它保留为0。

    eg: 颜色附件

    unsigned int texture;
    glGenTextures(1, &texture);
    glBindTexture(GL_TEXTURE_2D, texture);
    
    //对于这个纹理,我们仅仅分配了内存而没有填充它。填充这个纹理将会在我们渲染到帧缓冲之后来进行
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 800, 600, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
    
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    
    //把纹理附件绑定到帧缓冲
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
    

    深度模板附件

    glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, 800, 600, 0, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, NULL);
    
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, texture, 0);
    
    

    CVOpenGLESTextureCacheCreateTextureFromImage

    CVOpenGLESTextureCacheCreateTextureFromImage(
        CFAllocatorRef  _Nullable allocator, 
        CVOpenGLESTextureCacheRef  _Nonnull textureCache, 
        CVImageBufferRef  _Nonnull sourceImage, 
        CFDictionaryRef  _Nullable textureAttributes, 
        GLenum target, 
        GLint internalFormat, 
        GLsizei width, 
        GLsizei height, 
        GLenum format, 
        GLenum type, 
        size_t planeIndex, 
        CVOpenGLESTextureRef  _Nullable * _Nonnull textureOut
    );
    

    根据图片生成纹理对象

    • 参数allocator kCFAllocatorDefault,默认分配内存
    • 参数textureCache 纹理缓存
    • 参数sourceImage 图片
    • 参数textureAttributes NULL
    • 参数target , GL_TEXTURE_2D(创建2维纹理对象)
    • 参数internalFormat GL_LUMINANCE,亮度格式
    • 参数width 图片宽
    • 参数height 图片高
    • 参数format GL_LUMINANCE 亮度格式
    • 参数type 图片类型 GL_UNSIGNED_BYTE
    • 参数planeIndex 0,平面角标,表示第0个平面,比如YUV数据,Y是第0个平面,UV是第一个平面
    • 参数textureOut 输出的纹理对象

    eg:

    #pragma mark - 7、创建纹理对象,渲染采集图片到屏幕
    - (void)setupTexture:(CMSampleBufferRef)sampleBuffer
    {
        // 获取图片信息
        CVImageBufferRef imageBufferRef = CMSampleBufferGetImageBuffer(sampleBuffer);
    
        // 获取图片宽度
        GLsizei bufferWidth = (GLsizei)CVPixelBufferGetWidth(imageBufferRef);
        _bufferWidth = bufferWidth;
        GLsizei bufferHeight = (GLsizei)CVPixelBufferGetHeight(imageBufferRef);
        _bufferHeight = bufferHeight;
    
        // 创建亮度纹理
        // 激活纹理单元0, 不激活,创建纹理会失败
        glActiveTexture(GL_TEXTURE0);
    
        // 创建纹理对象
        CVReturn err;
        err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, _textureCacheRef, imageBufferRef, NULL, GL_TEXTURE_2D, GL_LUMINANCE, bufferWidth, bufferHeight, GL_LUMINANCE, GL_UNSIGNED_BYTE, 0, &_luminanceTextureRef);
        if (err) {
            NSLog(@"Error at CVOpenGLESTextureCacheCreateTextureFromImage %d", err);
        }
        // 获取纹理对象id
        _luminanceTexture = CVOpenGLESTextureGetName(_luminanceTextureRef);
         
        // 绑定纹理
        glBindTexture(CVOpenGLESTextureGetTarget(renderTexture), _luminanceTexture);
        
        //CVOpenGLESTextureGetTarget(renderTexture)获取纹理绑定的target,在这里是GL_TEXTURE_2D,所以下面写也可以
        //glBindTexture(GL_TEXTURE_2D, _luminanceTexture);
       
    
        // 设置纹理滤波
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    
        // 激活单元1
        glActiveTexture(GL_TEXTURE1);
    
        // 创建色度纹理
        err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, _textureCacheRef, imageBufferRef, NULL, GL_TEXTURE_2D, GL_LUMINANCE_ALPHA, bufferWidth / 2, bufferHeight / 2, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 1, &_chrominanceTextureRef);
        if (err) {
            NSLog(@"Error at CVOpenGLESTextureCacheCreateTextureFromImage %d", err);
        }
        // 获取纹理对象
        _chrominanceTexture = CVOpenGLESTextureGetName(_chrominanceTextureRef);
    
        // 绑定纹理
        glBindTexture(GL_TEXTURE_2D, _chrominanceTexture);
    
        // 设置纹理滤波
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    }
    

    相关文章

      网友评论

          本文标题:OpenGL常用函数笔记

          本文链接:https://www.haomeiwen.com/subject/vhucrftx.html