zoukankan      html  css  js  c++  java
  • OpenGL 十

    一、基础

    1、OpenGL ES 不同版本

    OpenGL ES 1.X:针对固定功能流水管线硬件
    OpenGL ES 2.X:针对可编程流水管线硬件
    OpenGL ES 3.X:OpenGL ES 2.0 的扩展

    2、EGL的主要功能:
      1. 和本地窗⼝系统(native windowing system)通讯;
      2. 查询可⽤的配置;
      3. 创建 OpenGL ES 可⽤的“绘图表面”(drawing surface);
      4. 同步不同类别的 API 之间的渲染,如在 OpenGL ES 和 OpenVG 之间同步,或者在 OpenGL和本地窗口的绘图命令之间;
      5. 管理“渲染资源”,⽐如纹理映射(rendering map)。

    3、数据

    向量数据类型:

    矩阵数据类型:

    变量存储限定符:

    3、基础

    1).vsh / .fsh 

    .vsh --> 顶点着色器  .fsh --> 片元着色器

    .vsh / .fsh 文件,只是用来给开发者区分着色器代码。其本质是一串字符串,可以用string来写,但直接用字符串形式,不便于阅读维护。

    2)数据修饰(uniform, attribute, varying)

    1. uniform:1)客户端代码 --> 传递 顶点/片元着色器里的 变量;

             2)uniform 一般作为 顶点/片元着色器中的常量来使用,传进来后一般是只拿来使用,而不在着色器中进行修改,即:不经常变化的一些数据一般用 uniform 传;

    传什么(用来修饰什么):一般传 视图矩阵、投影矩阵、投影视图矩阵。

    传递方法:gluniformXXX

    举例:着色器中代码:uniform mat4 viewProMatrix;// 4行4列的矩阵 变量 viewProMatrix,传递方式使用 uniform 传递

        客户端往里面传值:gluniformXXX 方法。

    2. attribute:1)客户端代码 --> 只能传到 顶端着色器中 --> 只能在顶点着色器中使用 

    一般修饰:顶点、纹理坐标、颜色等 --> 一切和坐标、颜色相关的

    传递方法:glvertexXXX --> 注意:传值一定要打开开关,因为默认 attribute 是关闭的。

    举例: 着色器中代码:attribute vec4 position;  attribute vec4 color;  attribute vec2 texture; // 4维向量 position,修饰符 attribute 表示 它使用attribute 方式传递。

    3. varying:当数据需要通过 顶点着色器间接的传递到片元着色器时 会用 varying 修饰

    纹理坐标 通过顶点着色器间接传到片元着色器:varying lowp vec2 ;// lowp 表示低精度-> 纹理坐标本就是0~1所以使用低精度即可

     

    注意:客户端传值,需要在着色器中的声明和客户端代码中的声明 一致 --> 若着色器中没有相关声明,表示没有传给着色器相应数据。

    二、运行过程与 API

    1、过程

    需要创建 2 个基本对象才能⽤着⾊器进行渲染:着⾊器对象和程序对象。

    获取 链接后着⾊器对象 的过程 一般包括以下 6 步:

      1、创建⼀个顶点着⾊器对象和⼀个⽚段着⾊器对象

      2、将源代码链接到每个着⾊器对象

      3、编译着⾊器对象

      4、创建⼀个程序对象

      5、将编译后的着⾊器对象连接到程序对象

      6、链接程序对象

    2、主要 API

    /*  
    type: 创建着⾊器的类型,GL_VERTEX_SHADER 或者 GL_FRAGMENT_SHADER
    返回值: 指向新着⾊器对象的句柄.可以调⽤ glDeleteShader 删除 
    */
    GLuint glCreateShader(GLenum type);
    
    // shader: 要删除的着⾊器对象句柄
    void glDeleteShader(GLuint shader);
    
    /* 
    shader — 指向着⾊色器器对象的句句柄
    count: 着⾊器源字符串的数量,着⾊器可以由多个源字符串组成,但是每个着⾊器只有⼀个 main 函数 
    string: 指向保存数量 count 的着⾊器源字符串的数组指针
    length: 指向保存每个着⾊器字符串⼤小且元素数量为 count 的整数组指针 
    */
    void glShaderSource(GLuint shader , GLSizei count ,const GLChar * const *string, const GLint *length);
    
    // shader:需要编译的着⾊器对象句柄 
    void glCompileShader(GLuint shader); 
    
    /*
    shader:需要编译的着⾊器对象句柄
    pname:获取的信息参数,可以为: GL_COMPILE_STATUS / GL_DELETE_STATUS / GL_INFO_LOG_LENGTH / GL_SHADER_SOURCE_LENGTH / GL_SHADER_TYPE 
    params:指向查询结果的整数存储位置的指针
    */
    void glGetShaderiv(GLuint shader , GLenum pname , GLint *params );
    
    /*
    shader:需要获取信息⽇志的着⾊器对象句柄
    maxLength:保存信息⽇志的缓存区⼤小
    length:写⼊的信息日志的长度(减去 null 终止符), 如果不需要知道长度,这个参数可以为 Null 
    infoLog:指向保存信息⽇志的字符缓存区的指针
    */
    void glGetShaderInfolog(GLuint shader , GLSizei maxLength, GLSizei *length , GLChar *infoLog); 
    
    /*
    创建一个程序对象
    返回值: 返回⼀个执⾏行新程序对象的句柄 
    */
    GLUint glCreateProgram( ); 
    
    // program:指向需要删除的程序对象句柄 
    void glDeleteProgram( GLuint program ) 
    
    /* 
    着⾊器与程序连接/附着
    program : 指向程序对象的句柄
    shader : 指向程序连接的着⾊器对象的句柄 
    */
    void glAttachShader( GLuint program , GLuint shader ); 
    
    // 断开连接
    void glDetachShader(GLuint program); 
    
    // link
    glLinkProgram(GLuint program); 
    
    /*
    链接程序之后, 需要检查链接是否成功. 可以使用 glGetProgramiv 检查链接状态.
    program: 需要获取信息的程序对象句柄 
    pname : 获取信息的参数,可以是: 
    GL_ACTIVE_ATTRIBUTES 
    GL_ACTIVE_ATTRIBUTES_MAX_LENGTH 
    GL_ACTIVE_UNIFORM_BLOCK 
    GL_ACTIVE_UNIFORM_BLOCK_MAX_LENGTH 
    GL_ACTIVE_UNIFROMS 
    GL_ACTIVE_UNIFORM_MAX_LENGTH 
    GL_ATTACHED_SHADERS 
    GL_DELETE_STATUS 
    GL_INFO_LOG_LENGTHGL_LINK_STATUS 
    GL_POGRAM_BINARY_RETRIEVABLE_HINT 
    GL_TRANSFORM_FEEDBACK_BUFFER_MODE 
    GL_TRANSFORM_FEEDBACK_VARYINGS 
    GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 
    GL_VALIDATE_STATUS
    
    params : 指向查询结果整数存储位置的指针 
    */
    void glGetProgramiv (GLuint program,GLenum pname, GLint *params); 
    
    /*
    从程序信息⽇志中获取信息
    program : 指向需要获取信息的程序对象句柄
    maxLength : 存储信息⽇志的缓存区⼤小
    length : 写⼊的信息日志⻓度(减去 null 终⽌符),如果不需要知道⻓度,这个参数可以为 Null. 
    infoLog : 指向存储信息日志的字符缓存区的指针 
    */
    void glGetPorgramInfoLog( GLuint program ,GLSizei maxLength, GLSizei *length , GLChar *infoLog ) 
    
    // program: 设置为活动程序的程序对象
    void glUseProgram(GLuint program) 

    三、RenderBuffer 和 FrameBuffer

    RenderBuffer 渲染缓冲区对象是由应用程序分配的2D图像缓冲区。渲染缓冲区可用于分配和存储 颜色、深度或模板值,并可用作帧缓冲区对象中的颜色、深度或模板附件。渲染缓冲区类似于提供可绘制表面的离屏窗口系统,例如 pbuffer。但是,渲染缓冲区不能直接用作 GL 纹理。

    --> RenderBuffer 为颜色、深度、模板缓冲值提供了附着点,而 RenderBuffer 又被附加到 FrameBuffer。

      FrameBufferObject(FBO) 更类似与一个管理者。

    RenderBuffer 分为:颜色、深度、模板 缓冲区

     

  • 相关阅读:
    shell文本过滤编程(一):grep和正则表达式【转】
    从头开始写项目Makefile(十):make内嵌函数及make命令显示【转】
    写文章 TEE技术分析【转】
    移动电子商务:五个技术标准与Trustonic TEE解决方案【转】
    在vscode中使用pylint-django插件解决pylint的一些不必要的错误提示【转】
    从零开始学习OpenCL开发(一)架构【转】
    一张图让你学会Python【转】
    关于ping以及TTL的分析【转】
    g++的编译选项:-Wl,-rpath=【转】
    【梦幻连连连】源代码分析(四)-触摸处理
  • 原文地址:https://www.cnblogs.com/zhangzhang-y/p/13412694.html
Copyright © 2011-2022 走看看