Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript WebGL警告:“;属性0已禁用。这会造成严重的绩效损失”;_Javascript_Html_Canvas_Webgl - Fatal编程技术网

Javascript WebGL警告:“;属性0已禁用。这会造成严重的绩效损失”;

Javascript WebGL警告:“;属性0已禁用。这会造成严重的绩效损失”;,javascript,html,canvas,webgl,Javascript,Html,Canvas,Webgl,当我运行下面的JavaScript/WebGL代码时(请向下滚动),我在开发控制台中看到以下警告消息: [.WebGLRenderingContext] PERFORMANCE WARNING: Attribute 0 is disabled. This has significant performance penalty 下面的代码成功地在画布上绘制了一个白点。但是,我希望警告消失。我需要在下面的代码中更改什么才能使其停止出现 HTML: <!DOCTYPE html> <

当我运行下面的JavaScript/WebGL代码时(请向下滚动),我在开发控制台中看到以下警告消息:

[.WebGLRenderingContext]
PERFORMANCE WARNING: Attribute 0 is disabled.
This has significant performance penalty
下面的代码成功地在画布上绘制了一个白点。但是,我希望警告消失。我需要在下面的代码中更改什么才能使其停止出现

HTML:

<!DOCTYPE html>
<html>
<body>
  <canvas id="canvas" width="100" height="100"></canvas>
</body>
</html>

这是一个最小但完整的示例,因此我正在寻找一个具体告诉我要更改什么的答案。我在Chrome 30.0.1599.101(在OS X 10.8.5上)中运行这个问题。

这个问题与您的问题类似:


也许会有帮助

OpenGL要求启用属性0,否则它将不会渲染任何内容。另一方面,WebGL所基于的OpenGL ES 2.0则不然。因此,要在OpenGL上模拟OpenGL ES 2.0,如果不启用属性0,浏览器必须为您创建足够大的缓冲区,以满足您请求绘制的顶点数量,使用正确的值填充它(请参见
gl.vertexAttrib
),将其附加到属性0,然后启用它

这一切都是在幕后进行的,但重要的是,您要知道,创建和填充缓冲区需要时间。浏览器可以进行一些优化,但在一般情况下,如果假设您运行的是OpenGL ES 2.0,并且使用属性0作为常量,就像您应该能够做到的那样,如果没有警告,您将不知道浏览器为您模拟OpenGL ES 2.0与OpenGL不同的功能所做的工作


在你的特殊情况下,警告没有多大意义。看起来您只绘制了一个点。但是浏览器很难理解这一点,因此,只要您在绘图时未启用属性0,浏览器就会发出警告。

我已设法利用此处其他响应中的线索使警告消失。我将回答我自己的问题,因为我已经得到了上述案例的具体解决方案

以下是我为消除警告所做的更改(一般来说):

  • 在顶点着色器中为位置创建属性变量
  • 创建缓冲区对象,将其绑定到数组缓冲区,然后将顶点数据写入其中
  • 将属性变量绑定到位置
    0
  • 将缓冲区对象指定给属性变量
  • 启用对属性变量的赋值
  • 这是,这是


    为了防止这些链接在将来某个时候消亡,我在这里提供了相关的代码片段:

    顶点着色器源应更改为:

    attribute vec4 a_Position;
    void main() {
      gl_Position = a_Position;
      gl_PointSize = 10.0;
    }
    
    下面的JavaScript代码应该直接插入到
    gl.useProgram(shaderProgram)
    行下面:

    var vertices = new Float32Array([0.0, 0.0, 0.0]),
        vertexBuffer = gl.createBuffer();
    gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
    gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);
    gl.bindAttribLocation(shaderProgram, 0, 'a_Position');
    gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0);
    gl.enableVertexAttribArray(0);
    

    我最近也遇到了同样的问题,并通过显式绑定属性0解决了它,但是我觉得您的解决方案不应该起作用

    摘自手册页:

    属性变量名到的通用属性索引绑定 程序对象可以在任何时候通过调用 glBindAttribLocation。属性绑定直到 glLinkProgram被称为。链接程序对象之后 成功地,通用属性的索引值保持不变 (并且可以查询它们的值),直到下一个链接命令出现

    这将详细说明绑定在链接着色器程序之后才会生效

    指出这一点也可能有用

    未显式绑定的活动属性将由 调用glLinkProgram时的链接器


    根据经验,它们似乎没有按特定顺序绑定,因此这就是属性0可以不启用的原因(在我的例子中,假设顶点着色器中的第一个用户定义属性将绑定到属性0)。

    谢谢。我遇到了这个问题,但我还不太清楚如何将它具体应用到我的案例中。(我希望找到一个与库无关的解决方案,但对那些试图直接使用WebGL的人有效。)要想使用WebGL做任何有用的事情,你最终需要获取属性位置并使用它们(发送顶点、颜色等)。警告可能会消失。我在上面提供了一个指向演示(JSFIDLE)的链接,使用完全修改的代码,该代码在不发出警告的情况下工作。(至少在Mac OS X/Chrome中)它对你不起作用吗?是的,它工作得很好,我只是不明白它是如何工作的,哈哈,在我的代码中它对我不起作用。老实说,我只是发布了这个答案来添加一些额外的信息,希望它能在将来帮助人们。这确实有助于理解逻辑,但是,
    attribute 0
    到底是什么,以及我们如何将其启用到某个默认值以避免招致性能损失?请参阅@GladstoneKeep的答案。最简单的方法是将
    位置
    属性绑定到属性0,因为99.99%的着色器具有
    位置
    位置
    位置
    。您可以通过调用
    gl.bindAttribLocation(程序,0,“位置”)在链接程序之前,因此在我的演示程序中,我在顶点着色器中定义了
    属性vec4位置
    ,在我的js应用程序中,我有
    var vPosition=gl.getAttribLocation(程序,“vPosition”)
    gl.vertexAttrib3f(位置,新点[i],新点[i+1],0.0)我尝试添加
    gl.bindattiblocation(程序,0,“vPosition”)在我调用
    initShaders
    之后(在我调用
    gl.useProgram
    之前),但警告仍然存在。您必须在
    gl.createProgram
    之后和
    gl.linkProgram
    之前调用
    bindAttribLocation
    。在初始化之后,着色器已经太晚了
    var vertices = new Float32Array([0.0, 0.0, 0.0]),
        vertexBuffer = gl.createBuffer();
    gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
    gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);
    gl.bindAttribLocation(shaderProgram, 0, 'a_Position');
    gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0);
    gl.enableVertexAttribArray(0);