美文网首页
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常用函数笔记

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

  • OpenGL - 常用函数

    glutInit glutInitDisplayMode glutInitWindowSize glutCreat...

  • OpenGL 常用函数

    2.1.4 坐标系统工具箱 窗口大小变化时,在glutReshapeFunc()中注册的汉莎会被调用,在回调函数中...

  • 安卓OpenGLES环境搭建(十)

    前言 前面学习了opengl es的基础知识,包括GLSL语言,常用函数等等,由于opengl es是基于夸平台的...

  • IOS渲染图片OpenGLES(五)

    前言 前面学习了opengl es渲染管线,可编程语言GLSL,常用的opengl es函数,有了这些基础,现在就...

  • OpenGL纹理内容

    纹理可以理解为一张图片,OpenGL渲染图片会将图片的像素保存在纹理缓存中。 OpenGL常用纹理函数 载入纹理 ...

  • OpenGL纹理

    纹理可以理解为一张图片,OpenGL渲染图片会将图片的像素保存在纹理缓存中。OpenGL常用纹理函数 载入纹理 纹...

  • tensorflow笔记 :常用函数说明

    1.tensorflow笔记 :常用函数说明

  • 常用函数介绍OpenGLES(四)

    前言 前面介绍了GLSL的基础语法,接下来介绍下opengl es的常用函数,了解这些函数的基本原理和前面的gls...

  • OpenGL ES 入门(一)常用函数

    如果你不知道OpenGL 是干什么的,看到这下面这张图片就知道这到底是干什么的了 简单的说,它就是能高性能、高帧率...

网友评论

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

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