• 首页
  • 技术
  • 旅行
  • 车模
  • 关于

JZ's Blog

{技术, 绘画, 旅行, 摄影, 多肉}
  • 首页
  • 技术
  • 旅行
  • 车模
  • 关于
首页  /  未分类  /  记录一次解决 no buffer is bound to enabled attribute 报错的过程
05 三月 2021

记录一次解决 no buffer is bound to enabled attribute 报错的过程

作者:jz1108
未分类 3 条留言

最近发现自己的 WebGL 应用在部分 Android 手机上部分元素绘制不出来。于是找来多台手机测试,发现出问题的机器所用 GPU 都是 Mali 系列,因此怀疑 WebGL 异常和 GPU 相关。
将手机连接到电脑,通过 Chrome 的插件 ADB Plugin 来远程调试,发现控制台出现如下错误:

WebGL: INVALID_OPERATION: drawElements: no buffer is bound to enabled attribute

我把同样的绘制过程更改到程序里另一个功能近似的 shader 就没问题,因此初步定位问题出在 shader 里。

问题既然出在 attribute 上,那就从这里开始排查,首先我打印出绘制这个元素时所有启用的 attribute 有哪些,于是发现了异常。在顶点着色器代码中我定义了 4 个 attribute:

attribute vec2 a_pos;
attribute vec2 a_normal;
attribute vec4 a_color;
attribute vec4 a_data;

但是通过下面代码获取出来的只有 3 个:

var numAttributes = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES);

而其他渲染正常的手机上都是 4 个。于是我在网上搜索这个问题,找到了这篇文章,了解到这是编译器做了优化,把代码中不需要的属性自动优化掉了。仔细看了代码逻辑发现属性 a_color 确实没用上,具体逻辑是这样的,在顶点着色器中 a_color 是这样赋值给 v_color 的:

v_color = vec4(a_color.rgb, 0.0);

而在片元着色器里只用到了 v_color.a,这就相当于只用了一个常量 0.0。于是 a_color 就舍弃了。

修改方法

最优的修改方法当然是去掉顶点数据中的 a_color 属性,但是由于最初的设计这类元素与另一类元素共用了一套数据组织方案,因此想修改成本略高,于是想到这个快速解决办法:

v_color = vec4(a_color.rgb, floor(a_color.a / 10.0));

这样,既能用到 a_color 属性,又保证了 a_color.a 是 0.0。编译之后果然问题解决了。

一些疑问

虽然问题解决了,但是还是有个疑问,shader 编译优化没有问题,但是优化之后报了错误是为什么呢。“no buffer is bound to enabled attribute” 这个错误本意是说启用了某个属性,但是没有数据来填充给它,但是这里的情况正好反过来,数据都是有的,而并不是所有预定义的属性都得到了启用。如果有谁对这个细节问题了解,也欢迎在评论里帮忙解答。

 Previous Article TypeScript 中的装饰器

相关文章

  • TypeScript 中的装饰器

    2021年3月5日
  • 我在英格兰——第三日

    2017年11月12日
  • Vincent的一个翻译版本

    2014年3月4日

3 条留言

  1. 达达 Reply to 达达
    2021年5月18日 at 下午2:27

    支持一下

  2. xiangnan Reply to xiangnan
    2022年8月22日 at 下午6:20

    2022年,翻问题的时候翻到了贾老师的文章

    • jz1108 Reply to jz1108
      2022年9月8日 at 上午10:21

      你在 grab?

留言

取消回复

近期文章

  • 记录一次解决 no buffer is bound to enabled attribute 报错的过程
  • TypeScript 中的装饰器
  • iOS 13 Safari 的一些变化
  • WebGL 文章汇总
  • 高性能 WebGL —— 使用 ImageBitmap 提升纹理性能

近期评论

  • jz1108发表在《记录一次解决 no buffer is bound to enabled attribute 报错的过程》
  • xiangnan发表在《记录一次解决 no buffer is bound to enabled attribute 报错的过程》
  • lew发表在《WebGL绘制详解之五:Stencil Buffer》
  • jz1108发表在《WebGL基础绘制之一:绘制一个点》
  • jz1108发表在《WebGL 文章汇总》

文章归档

  • 2021年三月
  • 2019年十一月
  • 2019年九月
  • 2019年三月
  • 2018年十二月
  • 2018年十一月
  • 2018年十月
  • 2017年十一月
  • 2017年十月
  • 2017年九月
  • 2017年五月
  • 2017年四月
  • 2017年三月
  • 2017年二月
  • 2017年一月
  • 2016年十一月
  • 2016年十月
  • 2016年四月
  • 2016年三月
  • 2016年二月
  • 2016年一月
  • 2015年十二月
  • 2015年十一月
  • 2015年十月
  • 2015年九月
  • 2015年八月
  • 2015年七月
  • 2015年六月
  • 2015年三月
  • 2014年十二月
  • 2014年十一月
  • 2014年十月
  • 2014年八月
  • 2014年七月
  • 2014年六月
  • 2014年五月
  • 2014年四月
  • 2014年三月
  • 2014年二月
  • 2014年一月
  • 2013年十二月
  • 2013年十一月
  • 2013年十月
  • 2013年九月
  • 2013年八月
  • 2013年七月
  • 2013年六月
  • 2013年五月
  • 2013年四月
  • 2013年三月
  • 2013年二月
  • 2013年一月
  • 2012年十二月
  • 2012年十月
  • 2012年九月
  • 2012年七月
  • 2012年六月
  • 2012年五月
  • 2012年一月
  • 2011年十一月
  • 2011年十月
  • 2011年九月
  • 2011年八月
  • 2011年七月
  • 2011年六月
  • 2011年五月
  • 2011年四月
  • 2011年二月
  • 2011年一月
  • 2010年十二月
  • 2010年十月
  • 2010年九月
  • 2010年六月
  • 2010年五月
  • 2010年四月
  • 2010年三月
  • 2010年二月
  • 2010年一月
  • 2009年十二月
  • 2009年十一月
  • 2009年九月
  • 2009年八月
  • 2009年六月
  • 2009年三月
  • 2009年二月
  • 2009年一月

分类目录

  • 地图API
  • 多肉
  • 开发
  • 技术
  • 摄影
  • 旅行
  • 未分类
  • 汽车
  • 绘画
  • 美食
  • 车模
  • 随笔

功能

  • 登录
  • 文章RSS
  • 评论RSS
  • WordPress.org
© Copyright 2015. Theme by BloomPixel.