1 着色语言 OpenGLSL ES

这部分首先分清 OpenGLSL ES 1.0版本3.0版本 ,其实1.0版本对应的是OpenGL ES 2.0版本

OpenGL ES 3.0 API 被设计成可以同时运行在 GLSL ES 1.0GLSL ES 3.0 上,意思就是说在 OpenGL ES 2.0 上编写的着色器无需修改就可以迁移到 OpenGL ES 3.0 中运行,但是反过来则是用 GLSL ES 3.0 写的 Shader 不能直接运行在 OpenGL ES 2.0 上。

alt text

区别:

  1. 在着色器文件中添加 #version 320 es 表明使用3.2版本,如果不添加则使用默认2.0版本。注意使用opengles3.2的API的时候必须添加 #version 320 es 。

  2. GLES 3.0中将GLES 2.0的 attribute 属性改成了 in 属性,顶点着色器的 varying 类型改成 out 类型,片段着色器的 varying 类型改成了 in 类型。

  3. GLES 3.0 不支持 gl_FragColor, 需要使用 out vec4 vFragColor; 来代替 gl_FragColor。

  4. GLES 3.0 将 GLES 2.0 中的 texture2D 和 texture3D 统一由 texture 代替处理。

  5. in或者out变量等不能在函数内声明。

1.1 OpenGL ES 2.0对应 OpenGLSL ES 1.0版本着色语言

//顶点着色器
attribute vec4 aPosition;                            // 应用程序传入顶点着色器的顶点位置
attribute vec2 aTextureCoord;                        // 应用程序传入顶点着色器的顶点纹理坐标

varying vec2 vTextureCoord;                          // 用于传递给片元着色器的顶点纹理数据
void main()
{
    gl_Position = aPosition;                         // 此次绘制此顶点位置
    vTextureCoord = aTextureCoord;                   // 将接收的纹理坐标传递给片元着色器
}



//片元着色器
precision mediump float;                           // 设置工作精度

varying vec2 vTextureCoord;                        // 接收从顶点着色器过来的纹理坐标
uniform sampler2D sTexture;                        // 纹理采样器,代表一幅纹理
void main()
{
    gl_FragColor = texture2D(sTexture, vTextureCoord);// 进行纹理采样
}

1.2 OpenGL ES 3.0对应 OpenGLSL ES 3.0版本着色语言

//顶点着色器
#version es 320

uniform mat4 u_matViewProj;
layout(location = 0) in vec4 a_position;
layout(location = 1) in vec3 a_color;
out vec3 v_color;

void main() {
    gl_Position = u_matViewProj * a_position;
    v_color = a_color;
}

//片元着色器
#version es 320
precision mediump float;

in vec3 v_color; // input form vertex shader
layout(location = 0) out vec4 o_fragColor;

void main() {
    o_fragColor = vec4(v_color, 1.0);
}

1.3 顶点数据传入区别

  1. 2.0 版本没有 VAOVBO概念,通过下面函数获取顶点索引:

     gint vPosition = glGetAttribLocation(shaderProgram, "vPosition");
    
  2. 2.0 版本glVertexAttribPointer最后一个变量是顶点数组的地址,而 3.0 版本 的最后一个变量是顶点数组开始的偏移量。(3.0版本通过VBO就把数据传输到GPU中了)

     void
     glVertexAttribPointer (GLuint index, 
                            GLint size, 
                            GLenum type, 
                            GLboolean normalized, /* 是否要进行归一化到 [-1, 1] */
                            GLsizei stride, 
                            const void *pointer);
    
    以上情况也可以在3.0版本中使用。