glDrawElements应该在Emscripten的当前版本中运行吗? (v1.37.1)

时间:2017-12-07 21:43:14

标签: opengl webgl emscripten

glDrawElements()应该在Emscripten的当前版本中运行吗? (v1.37.1)因为无论我做什么,调用glDrawElements()都会给出错误1282,当然,浏览器中没有任何内容呈现。

重要提示:使用VS for PC进行编译后,程序运行完美,即使使用为WebGL编写的着色器也是如此。一切都按预期工作,不会产生任何错误。但在网上:错误1282。

主循环:

JSON interface

我只是尝试渲染四边形,VAO中的1个VBO,索引和位置都存储在一个VBO中。首先是指示,从0开始。正确设置VertexAttribPointers。着色器为Web浏览器编译时没有错误。字面上glGetError()生成错误代码的唯一时间是在glDrawElements()调用之后直接生成。

这是一个emscripten错误,还是一个WebGL错误?

[编辑]

使用编译:

em ++ -std = c ++ 11 -s USE_GLFW = 3 -s FULL_ES3 = 1 -s ALLOW_MEMORY_GROWTH = 1 --emrun main.cpp -o t.html

2 个答案:

答案 0 :(得分:0)

  

这是一个emscripten错误,还是一个WebGL错误?

这可能是您代码中的错误。

我发现NVIDIA的驱动程序比AMD的驱动程序更宽容,导致它执行后者会猛烈拒绝的代码。这可能是类似的事情发生在这里;您的代码可以作为本机应用程序正常工作,但在浏览器环境中,错误成为一个关键问题。例如,这可以通过Chrome使用ANGLE来解释,它使用Direct3D(在Windows上)实现OpenGL,这可能会导致与本机图形驱动程序的某些差异。当然,这只是猜测,然而,像glDrawElements那样重要的功能不太可能被打破。

错误代码1282是GL_INVALID_OPERATION,如果将非零缓冲区对象名称绑定到已启用的数组或元素数组,则glDrawElements“[在这种情况下最有可能]生成缓冲区对象的数据存储当前映射为“(source)。

或者,您的着色器可能会导致错误,在这种情况下,如果您与我们共享其来源会很有用。

答案 1 :(得分:0)

对于任何可能在网络上专门遇到glDrawElements()调用问题的人:

我的问题原来是我将索引存储在1个缓冲区中并具有所有的vertext属性。这在PC上运行良好,但对于网络,您需要做的是创建 2个单独的缓冲区 - 1表示索引,另外1表示所有位置/ uvs / normals等。然后设置& #34; vertexAttributePointers"恰当地在vbo中。因为在浏览器中,您不能将缓冲区绑定到数组,也可以绑定到另一个缓冲区,这是OpenGL允许您在PC上执行的操作,并且它将无错误/警告。

确保在初始化时将VBO和IBO绑定到VAO。然后,只需重新绑定VAO,绘制,取消绑定VAO,然后渲染下一个对象 - 完成工作。