webgl常见报错

本文列举了多个WebGL编程中常见的错误案例,包括纹理尺寸问题、扩展不支持、渲染纹理的使用、数组越界错误、自我引用纹理错误以及着色器中的类型匹配问题。针对这些问题,提供了详细的错误原因分析及解决方法,帮助开发者更好地理解和解决WebGL编程中遇到的问题。
摘要由CSDN通过智能技术生成

案例1

texture bound to texture unit 0 is not renderable. It maybe non-power-of-2 and have incompatible tex

解决办法:有可能是你加载的图片不是2的幂次方尺寸的图片,然后你又在代码中使用了必须使用2的幂次方尺寸纹理才能做的特效,比如渐进纹理mipmap,还有可能是你的图片还没加载完成,你就开始使用了,这个时候需要等待加载完毕

案例2
webgl2:不支持 但webgl支持

var ext = gl.getExtension('OES_texture_float');
  if (!ext) {
     console.error("the extension doesn't exist on this device");
    return;  // the extension doesn't exist on this device
  }
  error:
  [.WebGL-0000018577E3E850] GL_INVALID_OPERATION: Invalid internal format.

案例3:
如果我们使用渲染纹理,要是有webgl2,不要用webgl,否则会渲染不出来

   this.gl.clearColor(1.0,0.0,0.0,1.0);
        this.gl.bindFramebuffer(this.gl.FRAMEBUFFER,this._2dScene.getFrameBuffer());
        this.gl.clear(this.gl.COLOR_BUFFER_BIT | this.gl.DEPTH_BUFFER_BIT);

案例4:
遇到下面这种报错实际上就是数组越界了,当GPU 调用glDrawArrays这个函数,根据你传入的单位数据的数目进行绘制时,发现根据单位数据的索引取不到数据了

WebGL error - glDrawArrays: attempt to access out of range vertices in attribute 0

案例5
报错如下:

[.Offscreen-For-WebGL-07E77500]GL ERROR :GL_INVALID_OPERATION : glDrawElements: Source and destination textures of the draw are the same

出现这个问题是由于我自己在将渲染数据渲染到一张纹理的时候,又把这张纹理给渲染了一遍,解决办法就是,本次渲染不要将这张纹理参与渲染,举个通俗的例子:
假设我有好几个显示节点,每个显示节点绑定一个纹理,其中有一个显示节点的纹理(它没有数据,只是GPU那边申请了一块纹理内存),我要把它当成渲染纹理,那我再渲染的时候,如果当前渲染的目标是渲染纹理的话,那么当前这个节点就不可以参与渲染,他只能接受其它渲染数据写进它持有的纹理中,如果要显示本次渲染的结果,将目标设为屏幕,开启这个节点的渲染即可
案例6:
出现下面这个报错是因为max函数的参数不匹配,也就是没有找到相关的max重载函数,比如max(x,0),这么写就会报错,0表示的int类型,但是max的第二个参数是float类型,
在shader书写时要严格区分变量的类型
在这里插入图片描述
案例7:
在写webgl shader的时候,如果我们对一个vec4的变量赋值没成功,那我们在使用的它的时候,不会报错,但如果我们直接将这个变量赋给gl_FragColor会发现她其实是一个白色,其实是因为GPU给我们做了容错处理
下面有几种情况讨论
1:如果在shader中,我们定义了一个变量,比如vec4 xx,但是却没有赋值,那这个变量参与的任何计算都是无效的,如果我们将它直接赋给gl_FragColor,会发现模型是白色,如果我们在这个变量参与的运算以后将结果再赋值给gl_FragColor,会发现模型偏黑色
2:如果在shader中我们没有对gl_FragColor进行赋值,会发现对应的模型颜色是glClearColor设置的颜色

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值