三、OpenGL ES——绘制三角形
1 着色语言 OpenGLSL ES
这部分首先分清 OpenGLSL ES
1.0版本 和 3.0版本 ,其实1.0版本对应的是OpenGL ES 2.0版本。
OpenGL ES 3.0
API 被设计成可以同时运行在 GLSL ES 1.0
和 GLSL ES 3.0
上,意思就是说在 OpenGL ES 2.0
上编写的着色器无需修改就可以迁移到 OpenGL ES 3.0
中运行,但是反过来则是用 GLSL ES 3.0
写的 Shader 不能直接运行在 OpenGL ES 2.0
上。
区别:
-
在着色器文件中添加 #version 320 es 表明使用3.2版本,如果不添加则使用默认2.0版本。注意使用opengles3.2的API的时候必须添加 #version 320 es 。
-
GLES 3.0中将GLES 2.0的 attribute 属性改成了 in 属性,顶点着色器的 varying 类型改成 out 类型,片段着色器的 varying 类型改成了 in 类型。
-
GLES 3.0 不支持 gl_FragColor, 需要使用 out vec4 vFragColor; 来代替 gl_FragColor。
-
GLES 3.0 将 GLES 2.0 中的 texture2D 和 texture3D 统一由 texture 代替处理。
-
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 顶点数据传入区别
-
2.0 版本
没有VAO
和VBO
概念,通过下面函数获取顶点索引:gint vPosition = glGetAttribLocation(shaderProgram, "vPosition");
-
2.0 版本
的glVertexAttribPointer
最后一个变量是顶点数组的地址,而3.0 版本
的最后一个变量是顶点数组开始的偏移量。(3.0版本通过VBO就把数据传输到GPU中了)以上情况也可以在3.0版本中使用。void glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, /* 是否要进行归一化到 [-1, 1] */ GLsizei stride, const void *pointer);