Android OpenGL Cannot create GL program: 0 GL error: 1282

Android OpenGL create GL program: 0 & GL error: 1282

快速解决

1. 使用GLSurfaceView的话

请在继承类中合适的地方(一般是构造函数里面)设置当前的clientversion 为 2
具体代码:

setEGLContextClientVersion(2);

2. 使用自己构建的opengl环境的话

请在创建glContext的时传入的参数中配置 int[] attrib_list = { EGL_CONTEXT_CLIENT_VERSION, 2 , EGL10.EGL_NONE };
具体代码如下,注意 attrib_list 中的第二个元素写为 2

//注意 :int EGL_CONTEXT_CLIENT_VERSION = 0x3098
int[] attrib_list = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL10.EGL_NONE };
EGLContext glContext = egl.eglCreateContext(display, config, EGL10.EGL_NO_CONTEXT,attrib_list);

注意,int EGL_CONTEXT_CLIENT_VERSION = 0x3098。到此,是同样的问题的话,应该得到了解决,可以继续搬砖了。

有兴趣的继续往下看:

出错代码鉴赏

        int shader = GLES20.glCreateShader(type);// add the source code to the shader and compile itGLES20.glShaderSource(shader, shaderCode);checkError();GLES20.glCompileShader(shader);checkError();int program = GLES20.glCreateProgram();checkError();

该段代码一般是封装为一个叫loadShader的函数中,本身是无误,但达不到期望的效果,如果在checkError里面抛出异常,那么就挂掉了。

通过上面的解决方法和代码,问题的原因就明显了:
GLES20.xxx() 和open环境不一致。即 opengl的环境不是2.0,却使用了2.0的接口 ,所以将opengl的版本指定(初始化)为 2。

有些朋友可能直接提问 loadShader出错,实际上的代码是上面的代码片段。

GLSurfaceView 部分代码分享

GLSurfaceView 源码是API level 30.

  1. GLSurfaceView中 mEGLContextClientVersion 外部没有设置的话,默认是0
  2. DefaultContextFactory 具体实现
 private class DefaultContextFactory implements EGLContextFactory {private int EGL_CONTEXT_CLIENT_VERSION = 0x3098;public EGLContext createContext(EGL10 egl, EGLDisplay display, EGLConfig config) {int[] attrib_list = {EGL_CONTEXT_CLIENT_VERSION, mEGLContextClientVersion,EGL10.EGL_NONE };return egl.eglCreateContext(display, config, EGL10.EGL_NO_CONTEXT,mEGLContextClientVersion != 0 ? attrib_list : null);}public void destroyContext(EGL10 egl, EGLDisplay display,EGLContext context) {if (!egl.eglDestroyContext(display, context)) {Log.e("DefaultContextFactory", "display:" + display + " context: " + context);if (LOG_THREADS) {Log.i("DefaultContextFactory", "tid=" + Thread.currentThread().getId());}EglHelper.throwEglException("eglDestroyContex", egl.eglGetError());}}}

从createContext 中代码可看出,mEGLContextClientVersion 为0 的时候 ,egl.eglCreateContext的最后一个参数传入的是null。同时mEGLContextClientVersion 又是 attrib_list 数组第二个元素,版本openGl2.0就是通过这个参数确定的。

  1. setEGLContextClientVersion
    精简了函数的注释,可以从注释上面得到一些启发, Pick an OpenGL ES 2.0 context

/*** Inform the default EGLContextFactory and default EGLConfigChooser* which EGLContext client version to pick.* <p>Use this method to create an OpenGL ES 2.0-compatible context.* Example:* <pre class="prettyprint">*     public MyView(Context context) {*         super(context);*         setEGLContextClientVersion(2); // Pick an OpenGL ES 2.0 context.*         setRenderer(new MyRenderer());*     }* </pre>*/public void setEGLContextClientVersion(int version) {checkRenderThreadState();mEGLContextClientVersion = version;}

综合起来使用GLSurfaceView的opengl便利的情况下要使用2.0,优先调用setEGLContextClientVersion(2)

基于TextureView 或SufaceView创建openglcontext

最终的要调用的代码如下:

int[] attrib_list = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL10.EGL_NONE };
EGLContext glContext = egl.eglCreateContext(display, config, EGL10.EGL_NO_CONTEXT,attrib_list);

version 可以根据需要进行指定。

补充:
自定义 GLSurfaceView 的 setEGLContextFactory 是提供自定义创建opengl环境的接口,只要根据上面两个关键调用实现EGLContextFactory 就可以,GLSurfaceView的默认实现就是DefaultContextFactory。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/558272.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pythoncsv格式列变换_用Python将csv行转换为列

关于如何使用zip合并数据以及转置列表的一些提示。这听起来像是如何转置csv是你真正的问题。如何转置csv的答案是将其放入列表列表(例如通过csv模块)&#xff0c;然后将其转置并写回文件(如果需要)。在row1 [1,2,3]row2 [a, b, c]list(zip(row1, row2))Out[45]: [(1, a), (2,…

Android DDMS的打开以及查看手机页面布局层次

ddms 查看android的界面布局层次 有时候看到一个比较好的界面或体验好的界面&#xff0c;就忍不住想看看其实现结果&#xff0c;那么可以通过DDMS工具来看相连设备层次以及使用哪些view。 上图是查看微信布局展现。说明&#xff0c;这里查看的就是显示在当前屏幕上的界面&am…

python转换窗口无响应_Tkinter窗口显示(没有响应),但代码正在运行

我有一个程序&#xff0c;在你点击一个操作按钮后运行一个很长的过程。当进程运行时&#xff0c;根窗口会说它没有响应&#xff0c;即使我知道程序是在后台运行的。这个程序将发布给我的几个同事&#xff0c;我想确保他们看到这个时不会惊慌失措&#xff0c;关上窗户。我的解决…

mac os11以下安装Xcode

前段时间mac重装系统&#xff0c;所有软件都清除了&#xff0c;下载从商店里面安装Xcode 12.5.1版本&#xff0c;直接提示“要求mac os 11.0或更高版本&#xff0c;于是乎开始升级mac os&#xff0c;检查更新并更新之后&#xff0c;最新版本就是macOS Catalina10.15.7&#xff…

fft之后求模值和相位_如何利用相位噪声测量表征时钟抖动来加速设计验证过程...

随着数据速率的提高&#xff0c;时钟抖动分析的需求也在与日俱增。在高速串行数据链路中&#xff0c;时钟抖动会影响发射机、传输线和接收机的数据抖动。时钟质量保证的测量方法也在不断发展。目前的重点是针对比特误码率(BER) 建立时钟性能和系统性能之间的直接联系。今天我们…

Android Studio 内存不足

android studio 4.2.2 编译的项目的时候&#xff0c;出现的内存不足问题&#xff0c;实际上android studio会有引导设置内存大小&#xff0c;可能都不太在意在哪个地方&#xff0c;设置完就完事了&#xff0c;在不提示的情况下可能找不到在哪设置&#xff0c;在此记录一笔。 出…

python寻找多数元素_寻找多数元素

定义&#xff1a;序列中的多数元素是指在一个元素个数为n的序列中&#xff0c;多数元素出现次数大于[n/2].寻找元素方法很多&#xff1a;1.可以暴力搜索&#xff0c;将每个元素都与其他元素作比较&#xff0c;然后统计该元素出现的次数&#xff0c;时间复杂度为O(n2)&#xff1…

mac 电脑安装 svn和brew

快速解决&#xff1a; 1. 安装svn brew install subversion 2. 安装brew 记得多尝试分别选择不同的下载源&#xff0c;鄙人最终是选择 “3 北京外国语大学” 成功的。 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"折…

监控mysql锁定状态_企业实战Mysql不停机维护主从同步

实战环境&#xff1a;Mysql-5.7Xtrabackup-2.4Xtrabackup 介绍&#xff1a;Percona XtraBackup是一款基于MySQL的服务器的开源热备份实用程序&#xff0c;在备份过程中不会锁定数据库。它可以备份来自MySQL5.1&#xff0c;5.5&#xff0c;5.6和5.7服务器上的InnoDB&#xff0c;…

Mac AndroidStudio常用快捷键

mac电脑的键盘修饰符对应关系 Command&#xff08;或 Cmd&#xff09;⌘Shift ⇧Option&#xff08;或 Alt&#xff09; ⌥Control&#xff08;或 Ctrl&#xff09;⌃Caps Lock ⇪esc ⎋Fn F6-F12的使用 单独按F6-F12&#xff0c;一般是控制电脑的音量、音乐上下曲的切换&a…

python缺失值类型与分析_3.1.1 缺失值分析

数据的缺失主要包括记录的缺失和记录中某个字段信息的缺失&#xff0c;两者都会造成分析结果的不准确&#xff0c;以下从缺失值产生的原因及影响等方面展开分析。(1)缺失值产生的原因1)有些信息暂时无法获取&#xff0c;或者获取信息的代价太大。2)有些信息是被遗漏的。可能是因…

为什么Mac source ~/.bash_profile只生效一次(macOS Catalina)

目录Mac环境变量的设置每次都要执行source ~/.bash_profile才有效解决方法(任选一种即可)一. 环境变量添加到.zshrc二 .zshrc中 添加source ~/.bash_profile三 切换mac的shell是什么原因Mac环境变量的设置 开发中对环境变量的修改和增加比较普遍&#xff0c;此处做为记录也供大…

三相四线怎样查漏电_老电工支招!漏电保护器的接线方法

家居装修中&#xff0c;电路问题是比较重要的&#xff0c;尤其是现在家居中使用的电器越来越多&#xff0c;所以漏电保护器是一定要的&#xff0c;能有很好的保护作用&#xff0c;那漏电保护器接线图是怎样的呢&#xff0c;漏电保护器接线方法以及注意事项有哪些&#xff0c;快…

view.post不执行的坑点

view.post没执行&#xff0c;runOnUiThread&#xff0c;Handler 目录坑点处理原因经历复盘6.0版本10.0版本总结坑点 子线程执行view.post(Runnable) 部分 手机没有效果。 usernameEditText.post(new Runnable() {Overridepublic void run() {usernameEditText.setText("…

扫地机器人划伤地板_扫地机器人哪个牌子好?会选的才能买到好产品

做为一种既时尚潮流又智能化的家用电器,扫地机器人一经面世就遭受大伙儿的关心。大家最先会感觉扫地机器人十分便捷,次之也会对它造成疑惑:就那么一台小小环形设备,确实能处理困惑人们这些年的打扫难题吗?事实上在扫地机器人的应用全过程中,客户对它的印像确实有很多种多样,有…

ThreadLocal初识

目录背景ThreadLocal的作用ThreadLocal特性ThreadLocal实现1. T get()2. set(T value)3. remove()验证一个对象只存一个数据多少个对象就能存多少个数据背景 这两天稍微有点空&#xff0c;在追溯之前的android 7.0之前的手机用View.post 出现不执行的问题时&#xff0c;结识了…

Gensee SDK UserInfo类函数详细说明

目录基本信息rolestatusclientType其他UserInfo是一个公共的类&#xff0c;用于RtSDK和PlayerSDK。由于role和status是复合1量&#xff0c;列出相关的判断方式&#xff0c;true为注释说明&#xff0c;false反之。 如 isHost() true 老师/false 不是老师。 基本信息 getUserId…

python中shutil模块_Python中shutil模块的学习笔记教程

介绍shutil 名字来源于 shell utilities&#xff0c;有学习或了解过Linux的人应该都对 shell 不陌生&#xff0c;可以借此来记忆模块的名称。该模块拥有许多文件(夹)操作的功能&#xff0c;包括复制、移动、重命名、删除等等一、chutil.copy(source, destination)shutil.copy()…

HTML转义字符大全<转>

为什么要用转义字符串&#xff1f; HTML中<&#xff0c;>&#xff0c;&等有特殊含义&#xff08;<&#xff0c;>&#xff0c;用于链接签&#xff0c;&用于转义&#xff09;&#xff0c;不能直接使用。这些符号是不显示在我们最终看到的网页里的&#xff0c…

python测网速_tespeed-测试网速的Python工具

1.安装(环境CentOS7)#pip install lxml#wget wget http://sourceforge.net/projects/socksipy/files/socksipy/SocksiPy%201.00/SocksiPy.zip#git clone https://github.com/Janhouse/tespeed.git#mv SocksiPy.zip tespeed/SocksiPy/#cd tespeed/SocksiPy/#unzip SocksiPy.zip#…