读OpenGL ES3.0(一)

读OpenglES 总结(一)

文章目录

  • 读OpenglES 总结(一)
    • 什么是OpenGL ES
    • 着色器
      • EGL 简介
      • OpenGL ES 着色器语言
        • 数据类型
        • 运算符

在学习本书查看相关的代码之前,需要知晓OpenGL 基本的数据类型,可见 OpenGL 数据类型

什么是OpenGL ES

OpenGL ES 是一个方便为嵌入式设备进行绘图的API ,相对于OpenGL而言,OpenGL ES 更加高效简洁。
OpenGLES 实现了具有可编程着色功能的图形管线,由两个规范组成:OpenGL ES 3.0API 规范和OpenglES 着色语言3.0规范。
下图有阴影的方框标识OpenGLES中管线的可编程阶段:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ts47Zak7-1578804527647)(evernotecid://44BEC8F1-2D61-4D72-8317-0554A2C29B3C/appyinxiangcom/14389767/ENResource/p38)]

OpenGL ES的简单使用可以总结为以下几个步骤:

  1. 创建顶点和片段着色器
  2. 编译和加载着色器
  3. 创建一个程序对象并链接着色器
  4. 设置视口和清除颜色缓冲区域
  5. 加载集合形状和绘制图元
  6. 显示后台缓冲区

其中顶点着色器和片段着色器就是在OpenGL ES 中的可编程阶段。其他地方都是

着色器

在OpenGL 中,一个项目只会有一个顶点着色器和一个片段着色器。其他着色器数量没有限制。

着色器的初始化流程可分为:

  1. 创建着色器
  2. 为着色器提供源码
  3. 编译着色器

整个流程可见下列代码

GLuint IJK_GLES2_loadShader(GLenum shader_type, const char *shader_source)
{
    assert(shader_source);
    // 创建着色器
    GLuint shader = glCreateShader(shader_type);        IJK_GLES2_checkError("glCreateShader");
    if (!shader)
        return 0;

    assert(shader_source);
    // 为着色器提供源码
    glShaderSource(shader, 1, &shader_source, NULL);   
    // 检查上一句的gl语言是否存在错误
    IJK_GLES2_checkError_TRACE("glShaderSource");
    // 编译着色器
    glCompileShader(shader);                            IJK_GLES2_checkError_TRACE("glCompileShader");

    GLint compile_status = 0;
    // 获取着色器编译结果
    glGetShaderiv(shader, GL_COMPILE_STATUS, &compile_status);
    if (!compile_status)
        goto fail;

    return shader;

fail:

    if (shader) {
        IJK_GLES2_printShaderInfo(shader);
        glDeleteShader(shader);
    }

    return 0;
}

从上述的过程中,我们可以分别创建顶点着色器和片段着色器。在创建着色器完成之后,我们需要创建OpenGL ES对应的项目program,并将着色器和项目进行连接。

  1. 使用 glCreateProgram(GLuint program)创建项目
renderer->program = glCreateProgram();  
  1. 将第3步中创建的着色器和创建的项目进行绑定
    glAttachShader(renderer->program, renderer->vertex_shader);     IJK_GLES2_checkError("glAttachShader(vertex)");
    glAttachShader(renderer->program, renderer->fragment_shader);   IJK_GLES2_checkError("glAttachShader(fragment)");

6.使用glLinkProgram(GLuint program)链接创建的项目

glLinkProgram(renderer->program);                           IJK_GLES2_checkError("glLinkProgram");

7.链接完成后使用glGetProgramiv监测连接是否成功

glGetProgramiv(renderer->program, GL_LINK_STATUS, &link_status);
    if (!link_status)
        goto fail;

在上述的步骤:创建着色器、指定源、编译着色器、检查错误、创建项目对象,附加上着色器、链接项目、检查链接错误 成功后可以使用项目对象进行渲染。为使用项目对象去渲染,
8. 使用glUseProgram进行渲染绑定
glUseProgram(renderer->program);

  1. 在实现了上述的初始化和加载了着色器之后,需要进行的是 设置视口和清除颜色缓冲区域

glViewport(0, 0, _backingWidth, _backingHeight);glviewport方法通知OpenGL ES绘制2D渲染表面的原点、宽度和高度。
在OpenGL ES zhong , Viewport定义所有opengles 渲染操作最终显示的2D 矩形。

在设置了视口之后,下一步是清除屏幕。

glClear(GL_COLOR_BUFFER_BIT);

  1. 清除颜色缓冲区之后就可以加载几何形状和绘制图元

  2. 显示后台缓冲

在OpenGL 中,如果我们直接将数据绘制到缓冲区时,在部分更新帧缓冲区时会看到伪像,为了解决这个问题,我们使用所谓的双缓冲区域,它位于后台不可见屏幕的内存区域,当所有渲染完成,和前台的可见缓冲区进行互换。

eglSwapBuffer(esContext->eglDisplay, esContext->eglSurface);

EGL 简介

OpenGL ES 着色器语言

在计算机图形学中,转换有两种基本的数据类型:矢量和矩阵。这个也是OpenGL ES的中心类型。

数据类型

变量类型 描述
float,int,bool 标量数据类型浮点型、整形、布尔值
float,vec2,vec3,vec4 浮点型矢量,1、2、3、4维
int,ivec2,ivec3,ivec4 整形矢量,1、2、3、4维
mat2, mat3, mat4 浮点类型矩阵 2x2,3x3,4x4

变量必须先声明,像下面一样:
float spe;
vec3 vposition;

变量可以在声明时初始化,或者以后初始化,初始化是通过构造函数进行,也可进行类型的转换,变量构造函数。

运算符

在OpenGL ES中不允许使用变量作为数组的索引,仅仅支持常量表达式。在运算中,执行运算符的变量必须有相同的类型,二进制运算符(* / + -) 必须是浮点变量或者是整形变量。乘 运算能够在浮点、矢量、矩阵的组合中进行。

比较运算符(= < > !=)仅仅能够执行标量,矢量有专门的比较函数

你可能感兴趣的:(iOS开发,ios,opengles)