全球优质服务器购买

为用户应用推荐适合的服务器,针对需求定制,将质量做到更好

香港服务器

香港CN2优化带宽,国内访问快

CPU:I3-2120(2核心4线程)

内存:4G DDR3内存

硬盘:1T HDD

带宽:10M优化、10M国际

IP数:1个

价格:699/月

美国服务器

美国洛杉矶高性价比服务器

CPU:I3-2120(2核心4线程)

内存:4G DDR3内存

硬盘:1T HDD

带宽:30M优化/100M普通

IP数:1个(10G防护)

价格:499/月

香港站群服务器

香港多IP站群服务器租用

CPU:E3-1230V2(4核

内存:8G DDR3内存

硬盘:240G SSD/1T SATA

带宽:10M优化

IP数:125个IP(1/2C)

价格:1099/月

美国站群服务器

美国多IP站群服务器租用

CPU:E3-1230V2(4核)

内存:16G DDR3内存

硬盘:1T HDD/240G SSD

带宽:30M优化/100M普通

IP数:125个IP(1/2C)

价格:999/月

b'
\n
\n

前因

\n

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

\n

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

\n

踩坑详情

\n

1、着色器编译报错

\n

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

\n
#version 300 es \nprecision mediump float;\nin vec2 TexCoord;\nuniform sampler2D ourTexture;\nuniform sampler3D textureLUT;\nout vec4 FragColor;\nvoid main()\n{\nvec4 color = texture(ourTexture, TexCoord);\nFragColor = texture(textureLUT,color.rgb);\n}\n
\n

报错内容:

\n
no default precision defined for variable \'textureLUT\'\n
\n

很明显说是没有声明精度的问题,然后在第二行不是已经使用precision mediump float;声明了精度了吗?是的,这已经声明了精度,但是这个声明的精度是针对float类型的,\n针对sampler3D类型的精度并没有声明,因此我们只需要声明以下sampler3D的精度问题即可。下面是经过修改过的正确的着色器代码:

\n
#version 300 es\nprecision mediump float;\nin vec2 TexCoord;\nuniform sampler2D ourTexture;\n// 华为手机上必须加上highp,否则报错no default precision defined for \nuniform mediump sampler3D textureLUT;\nout vec4 FragColor;\nvoid main()\n{\nvec4 color = texture(ourTexture, TexCoord);\nFragColor = texture(textureLUT,color.rgb);\n}\n
\n

2、glTexImage3D报错GL_INVALID_OPERATION

\n

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

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

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

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

GLES30.GL_RGB16F格式是浮点帧缓冲的相关内容,当帧缓冲使用了一个标准化的定点格式(像GL_RGB)为其颜色缓冲的内部格式,OpenGL会在将这些值存入帧缓冲前自动将其约束到0.0到1.0之间。\n当一个帧缓冲的颜色缓冲的内部格式被设定成了GL_RGB16F,GL_RGBA16F,GL_RGB32F或者GL_RGBA32F时,这些帧缓冲被叫做浮点帧缓冲(Floating Point Framebuffer),浮点帧缓冲可以存储超过0.0到1.0范围的浮点值。

\n

Opengl ES系列入门介绍

\n

Opengl ES之EGL环境搭建
\nOpengl ES之着色器
\nOpengl ES之三角形绘制
\nOpengl ES之四边形绘制
\nOpengl ES之纹理贴图
\nOpengl ES之VBO和VAO
\nOpengl ES之EBO
\nOpengl ES之FBO
\nOpengl ES之PBO
\nOpengl ES之YUV数据渲染
\nYUV转RGB的一些理论知识
\nOpengl ES之RGB转NV21

\n

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

\n
\n
\n \n
\n
\n\n \n \n \n\n
\n
\n '
内容来源于网络如有侵权请私信删除

推荐文章