前因

最近在尝试使用Opengl ES实现一些LUT滤镜效果,在实现这些滤镜效果的时候遇到一些兼容性的坑,踩过这些坑后我希望把这几个坑分享给读者朋友们,

希望同在学习Opengl ES的朋友们能少走弯路。

关于LUT滤镜相关的介绍,也是这个Opengl ES系列入门教程的一项内容,在后面的文章中会专门介绍,这里暂时不展开讲解,后续大家敬请期待。

踩坑详情

1、着色器编译报错

有以下这个片元着色器,在其他手机上正正常编译,但是在华为鸿蒙系统上却编译报错:

#version 300 es
precision mediump float;
in vec2 TexCoord;
uniform sampler2D ourTexture;
uniform sampler3D textureLUT;
out vec4 FragColor;
void main()
{
vec4 color = texture(ourTexture, TexCoord);
FragColor = texture(textureLUT,color.rgb);
}

报错内容:

no default precision defined for variable 'textureLUT'

很明显说是没有声明精度的问题,然后在第二行不是已经使用precision mediump float;声明了精度了吗?是的,这已经声明了精度,但是这个声明的精度是针对float类型的,

针对sampler3D类型的精度并没有声明,因此我们只需要声明以下sampler3D的精度问题即可。下面是经过修改过的正确的着色器代码:

#version 300 es
precision mediump float;
in vec2 TexCoord;
uniform sampler2D ourTexture;
// 华为手机上必须加上highp,否则报错no default precision defined for
uniform mediump sampler3D textureLUT;
out vec4 FragColor;
void main()
{
vec4 color = texture(ourTexture, TexCoord);
FragColor = texture(textureLUT,color.rgb);
}

2、glTexImage3D报错GL_INVALID_OPERATION

使用以下代码上传3DLut的cube纹理数据时,部分手机能正常工作,但是同样在华为鸿蒙的手机上却报错,使用函数glGetError()获取到的错误是GL_INVALID_OPERATION

        GLES30.glTexImage3D(
GL_TEXTURE_3D,
0,
GL_RGB,
size, size, size,
0,
GL_RGB,
GL_FLOAT,
lutBuffer
);

后来经过查阅资料发现是使用函数glTexImage3D时的第三个参数传递错误所致的,将第三个参数GL_RGB改为GLES30.GL_RGB16F即可,正确的代码如下:

    GLES30.glTexImage3D(
GL_TEXTURE_3D,
0,
// 鸿蒙等要用GLES30.GL_RGB16F, 小米等其他手机可用GL_RGB
GLES30.GL_RGB16F,
size, size, size,
0,
GL_RGB,
GL_FLOAT,
lutBuffer
);

GLES30.GL_RGB16F格式是浮点帧缓冲的相关内容,当帧缓冲使用了一个标准化的定点格式(像GL_RGB)为其颜色缓冲的内部格式,OpenGL会在将这些值存入帧缓冲前自动将其约束到0.0到1.0之间。

当一个帧缓冲的颜色缓冲的内部格式被设定成了GL_RGB16F,GL_RGBA16F,GL_RGB32F或者GL_RGBA32F时,这些帧缓冲被叫做浮点帧缓冲(Floating Point Framebuffer),浮点帧缓冲可以存储超过0.0到1.0范围的浮点值。

Opengl ES系列入门介绍

Opengl ES之EGL环境搭建

Opengl ES之着色器

Opengl ES之三角形绘制

Opengl ES之四边形绘制

Opengl ES之纹理贴图

Opengl ES之VBO和VAO

Opengl ES之EBO

Opengl ES之FBO

Opengl ES之PBO

Opengl ES之YUV数据渲染

YUV转RGB的一些理论知识

Opengl ES之RGB转NV21

关注我,一起进步,人生不止coding!!!

最新文章

  1. RPC 使用中的一些注意点
  2. PHP文件相关的操作函数——目录操作
  3. linux源码分析(一)
  4. 基于Linux平台的libpcap源码分析和优化
  5. thinkphp分页
  6. NOIP2003pj数字游戏[环形DP]
  7. shell复习---文件解压命令
  8. js学习--浏览器对象计时器setInterval()与setTimeout()的使用与区别
  9. 射频识别技术漫谈(22)——RC系列射频芯片的寄存器操作
  10. sizeof,终极无惑(上)
  11. WebApp之PC客户端
  12. 最小覆盖_KEY
  13. VFS四大对象之二 struct inode
  14. ORACLE数据库之PL/SQL触发器、rownum、动态SQL、数据库之视图与索引
  15. charles-抓包Andriod 手机的设置
  16. C#各种对话框
  17. Java通过ssh连接到Linxu和Windos服务器远程启动Tomcat
  18. Windows下使用curl命令
  19. Zookeeper + Guava loading cache 实现分布式缓存
  20. 微信小程序开发(一)准备开发环境

热门文章

  1. Java-ArrayList应用
  2. 学习ASP.NET Core Blazor编程系列十四——修改
  3. VulnHub靶机渗透实战9-vikings
  4. mysql-front连接mysql报错1251解决方法
  5. 深入浅出Seata的AT模式
  6. 3.4:使用Weka实现KNN分类的算法示例
  7. 简单的Dos命令学习
  8. Qt开发Active控件:如何使用ActiveQt Server开发大型软件的主框架(2)
  9. kali使用命令ifconfig查询ip地址一直为127.0.0.1的解决办法
  10. python 实现DES加解密