草庐IT

Opengl ES之踩坑记

goFlyer 2023-03-28 原文

前因

最近在尝试使用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!!!

有关Opengl ES之踩坑记的更多相关文章

  1. camille mumu 模拟器 frida 踩坑记录 - 2

    1.了解监管机构已经卷到需要监控进程了,为了跟上通报步伐查了下资料,打算浅试一下camille,依据原作的文档初步了解到需要python3、adb、frida、模拟器(木木-已成功、夜神)、root手机,开始逐个尝试,记录一下所遇到的情况。 原作祭上:camille/use.mdatmaster·zhengjim/camille·GitHubhttps://www.cnblogs.com/zhengjim/p/15508738.html2.PythonPython38、pip更新电脑中如果有多个python环境的,记得改好名哦,不然会报错,我是配置了环境变量然后让38的置顶pip如果久没用了也

  2. React hooks中 useState踩坑-=--异步问题 - 2

    useState作为最常见的一个hook,在使用中总是会出现各种坑,最明显的就是useState更新异步的问题。比如我们把接口返回的数据,使用useState储存起来,但是当后面去改变这个数据的时候,每次拿到的都是上次的数据,无法实时更新。或者我们在函数内部使用setState,然后立即打印state,打印的结果还是第一次的state的值。比如下面的代码实例。const[data,setData]=useState('111');consthandleTest=()=>{console.log(data)//111setName('222')console.log(name)//111}原因:

  3. 微信小程序项目转uniapp踩坑日记 - 2

    本文目录一、前言二、转换方式三、后语四、其他:node报错1、包默认C盘存放,而不是安装目录E盘2、正确的环境变量添加3、npminstall命令报错4、npminstall-gexpress报错没有权限一、前言由于想要把之前完成的微信小程序项目转换成uniapp项目,这样的话之后可以编译成其他平台的小程序、网页、安卓、IOS,所以开始了我的踩坑之旅。PS:安卓和IOS还是算了,主要弄其他小程序可以省很多功夫,但是各个平台不一样有的还是要自己来做,但是会省不少力气二、转换方式查看uniapp官方文档知道有工具可以转换,安装工具有两种方式,一种是装npm全局库、另一种是装HBuilderX插件,

  4. 【踩坑笔记】linux搭建kafka集群,详细到复制命令就能成功 - 2

    虽然公司有运维,但也不能啥都靠他们,万一哪天环境出问题了,你不能一上来就找运维吧,丢脸脸~今天分享一套从零开始搭建一套kafka集群的笔记,我几乎帮你踩了所有的坑,你只需按步骤来,有手就行kafka依赖jdk和zookeeper环境开始之前再啰嗦一句,同样的教程,有人失败有人成功,失败的小伙伴大部门都是路径问题,所以,仔细点,不要慌安装jdk检查下你服务器有没有jdk,如下图就是装了的如果没装,出门右转,先把jdk搞完再回来接着看,linux安装jdk环境搭建zookeeper集群虽然kafka0.5.x以上版本已经集成了zk,但我们最好还是单独部署一套,两个原因1、kafka自带的zk是单机

  5. 踩坑记录2——RK3588跑通YOLO v5+DeepSORT - 2

    上篇说到RK3588编译OpenCV,这篇记录一下跑通YOLOv5+DeepSORT的愉(chi)快(shi)历程.1.保证编译OpenCV时关联了ffmpeg如果本身缺少ffmpeg而编译了没有ffmpeg版本的OpenCV,则视频无法读取.解决方案参照CSDN,首先安装ffmpeg:sudoaptinstall-yffmpeg之后安装一堆dev:libavcodec-dev、libavformat-dev、libavutil-dev、libavfilter-dev、libavresample-dev、libswresample-dev、libswscale-dev这个时候再去编译OpenC

  6. ElasticSearch 7.6.2版本集群搭建及踩坑 - 2

    环境准备服务器说明本次演示采用三台RockyLinux8.5版本服务器服务器IP备注es-master172.16.7.11主节点es-node01172.16.7.501节点es-node02172.16.7.1302节点内核版本[root@es-master~]#uname-aLinuxes-master4.18.0-348.20.1.el8_5.x86_64#1SMPThuMar1020:59:28UTC2022x86_64x86_64x86_64GNU/Linux修改系统名##主节点hostnamectlset-hostnamees-master##node1节点hostnamectl

  7. 《Vue插件》瀑布流插件vue-masonry的使用与踩坑记录 - 2

    这是一个没有套路的前端博主,热衷各种前端向的骚操作,经常想到哪就写到哪,如果有感兴趣的技术和前端效果可以留言~博主看到后会去代替大家踩坑的~主页:oliver尹的主页格言:跌倒了爬起来就好~《Vue插件》瀑布流插件vue-masonry的使用与踩坑记录前言官网安装与使用基本使用示例参数item-selectortransition-durationcolumn-widthorigin-leftorigin-topgutter小结前言之前其实有分享过一篇纯CSS实现瀑布流的方法:https://oliver.blog.csdn.net/article/details/126450691,但纯CS

  8. cocos creator上架字节跳动(抖音)小游戏注意事项(匿名登录、录屏、分享等踩坑记录) - 2

    常见拒绝原因1:小游戏无录屏功能,不符合平台要求2:小游戏录屏时间小于3S,分享按钮点击无反应或提示错误文案,不符合平台要求3:小游戏录屏时间大于300S,分享按钮点击无反应或无法正常分享录屏,不符合平台要求不久前写了款小游戏,最近上架了字节跳动小游戏平台。因为这款游戏在微信小游戏里被归类为角色扮演类(微信平台不允许个人开发者上架角色类游戏),因此考虑上架字节跳动,只要有软件著作权即可。游戏是之前在微信平台已经调试通的,所以只需要按照字节的要求做一点修改就可以了,主要变化如下:1.支持匿名登录微信小游戏只需要调用wx.login获得code,再用code去服务端调用code2Session就能

  9. 【git踩坑记录】git push时本地分支名与远程仓库分支名不一致引发的问题 - 2

    前言我在github上新创建的远程仓库默认分支名为main,而本地仓库默认分支名为master,当我push代码的时候碰到了若干坑…一、踩坑一:奇怪的上游分支?先在github上快速创建个仓库,有个readme文件,远程仓库分支是main分支然后本地创建两个文件夹,假装是两台主机,我们先在张三文件夹里写点东西在张三的文件夹里创建文本并提交到了本地仓库,且现在与远程仓库建立了连接,当我们现在想要把本地仓库push到远程,直接gitpush?发现报错,fatal:thecurrentbranchmasterhasnoupstreambranch,表示当前本地分支master没有上游分支,要想pus

  10. flink学习之sql-client之踩坑记录 - 2

    flink/bin目录下会看到这个脚本,最开始以为是和spark-shell差不多的。结果自行摸索无果,网上查的文章也写的很垃圾,自己查官网看下吧。SQL客户端|ApacheFlink 直接./sql-client.shSELECT'HelloWorld';  报错org.apache.flink.runtime.jobmanager.scheduler.NoResourceAvailableException:Couldnotacquiretheminimumrequiredresources. 这里说到了jobmanager  resources,那么设置下(这个报错可能是我运行了测试的f

随机推荐