Android中OpenGl ES兼容性问题

概述

在前面使用OpenGLEs的过程中由于使用的是OpenGlEs3.0的版本所以会带来不少因为版本兼容问题的坑(开始的时候没有发现,因为一直使用的是Android8.1.0的系统的手机。后来测试兼容性的时候发现了坑,我这里最低版本的手机是装有4.4.2系统的)。
问题产生的原因是因为Android系统随着版本的不同里面自带的OpenGL ES版本也会随之不同,而在我们编写GLSL文件的时候如果没有考虑到兼容性的问题的时候就会带来相应的问题

下面总结一些OpenGLES从2.0到3.0的变化:

一 问题

先将顶点着色器和片段着色器文件贴出来(这是用来渲染普通视频用的),这是使用的OpenGLES3.0版本。(存在兼容性问题),下面只是一部分问题,且这里就不将bug的log写出来了,这是提示大家正确的写法。

顶点着色器

#version 300 es
in vec4 aPosition;//顶点位置
in vec2 aTexCoord;//S T 纹理坐标
out vec2 vTexCoord;
void main() {
    vTexCoord = aTexCoord;
    gl_Position = aPosition;
}

片段着色器

#version 300 es
#extension GL_OES_EGL_image_external_essl3 : require
precision mediump float;
in vec2 vTexCoord;
uniform samplerExternalOES sTexture;
out vec4 vFragColor;
void main() {
    vFragColor=texture(sTexture, vTexCoord);
}

1 没有在着色器文件中标明使用版本的时候默认使用2.0版本。

在上面的着色器文件中添加#version 300 es即表明使用3.0版本,如果不添加则使用默认2.0版本(注意此行必须放在第一行)。同时注意使用3.0的api的时候必须添加此行。

2 3.0中attribute变成了in和out

OpenGL ES 3.0中将2.0的attribute改成了in,顶点着色器的varying改成out,片段着色器的varying改成了in,也就是说顶点着色器的输出就是片段着色器的输入,另外uniform跟2.0用法一样。

3 3.0中使用内置参数gl_FragColor会出问题

这里我们只能自定义颜色向量out vec4 vFragColor;

4 3.0中将GL_OES_EGL_image_external变为了GL_OES_EGL_image_external_essl3

在使用纹理扩展的时候,也就是uniform samplerExternalOES sTexture的时候。在3.0中我们使用GL_OES_EGL_image_external_essl3而不是GL_OES_EGL_image_external。

5 3.0中将纹理的处理方法统一为texture

在2.0中2D纹理和3D纹理处理分别使用texture2D和texture3D方法,而在3.0后使用texture统一处理。

6 in或者out变量等不能在函数内(如main函数内)声明

二 总结

现阶段想要兼容之前老版本的系统使用OpenGLES2.0版本就可以了,无论是从编写代码的代价还是从性能上考虑。当然如果想追求极致就要在相应的关键步骤中判断系统支持的OpenGLES最高版本,以此来获取更高效的体验。

你可能感兴趣的:(OpenGL,ES)