【问题标题】:Emscripten with SDL2 - Error: WebGL: drawArrays: nullEmscripten 与 SDL2 - 错误:WebGL:drawArrays:null
【发布时间】:2015-08-20 09:37:24
【问题描述】:

所以我正在尝试使用 emscripten 编译一些 SDL2 代码,但我遇到了一个又一个的陷阱,大多数我可以自己解决,但这让我感到困惑。

目前我正在尝试使用 OpenGL 在屏幕上绘制一个四边形:

void sprite::init(float x, float y, float width, float height)
{
    _x = x;
    _y = y;
    _width = width;
    _height = height;

    if(_vboID == 0)
    {
        glGenBuffers(1, &_vboID);
    }

    float vertexData[12];

    vertexData[0] = x + width;
    vertexData[1] = y + height;

    vertexData[2] = x;
    vertexData[3] = y + height;

    vertexData[4] = x;
    vertexData[5] = y;

    //second

    vertexData[6] = x;
    vertexData[7] = y;

    vertexData[8] = x + width;
    vertexData[9] = y;

    vertexData[10] = x + width;
    vertexData[11] = y + height;

    glBindBuffer(GL_ARRAY_BUFFER, _vboID);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData), 
                 vertexData, GL_STATIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
}

void sprite::draw()
{
    glBindBuffer(GL_ARRAY_BUFFER, _vboID);

    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);
    glDrawArrays(GL_TRIANGLES, 0, 6);
    glDisableVertexAttribArray(0);

    glBindBuffer(GL_ARRAY_BUFFER, 0);
}

这应该会生成一个四边形,或者人们会这么想。 当然,它不会,而是会产生一些错误

Error: WebGL: drawArrays: null CURRENT_PROGRAM sdl2.js:1:186510
Error: WebGL: No further warnings will be reported for this WebGL context. (already reported 32 warnings)

因此我们来到了问题的核心,如何解决这个问题?

【问题讨论】:

  • 抱怨你没有绑定着色器程序。如果您不绑定着色器,OpenGL 不知道如何处理您发送的顶点数据。
  • 真的,我只是认为这在某些芯片组上会是个问题,因为它在桌面 OpenGL 上运行良好;好吧,我认为这是平台之间的主要区别。非常感谢您的帮助,我将附上一个基本的漫反射着色器来代替此信息(我希望我可以等待,但我绝对必须知道它是否可以在浏览器中使用)
  • 与芯片组无关。这是一个基本的 API,对于从 3.3(至少在非向后兼容模式下)和 OpenGL ES 2.+ 开始的 OpenGL 桌面也是如此。
  • 嗯,它在某些 GPU 芯片组上运行良好,它可能不正确,但它们仍然呈现白色方块。 (桌面);不管编写着色器是否按预期工作,我只需要重新安排我的计划以比预期更早地集成着色器编译器,但经过一些试验和错误 WebGL 着色器编码后,现在一切正常(我知道 GLSL,这个版本虽然不同,但它都在运行现在)
  • 如果它起作用是偶然的,而不是设计的。根据 OpenGL 标准,这种情况下的行为是未定义的,因此驱动程序可以随心所欲地做任何事情

标签: c++ opengl-es webgl emscripten


【解决方案1】:

就像 Cubic 提到的错误消息说你需要一个着色器。

WebGL 基于 OpenGL ES 2.0(不要与 OpenGL 混淆)。

OpenGL ES 2.0 没有固定的功能管道。它始终需要 100% 的着色器,而 OpenGL(在桌面上)已有 20 多年的历史,并且有一个旧的不需要着色器模式。这意味着通常事情在桌面上的工作是偶然的,因为所有向后兼容性的东西都徘徊在 WebGL 中,它不仅基于 OpenGL ES 2.0,而且在执行方面非常严格,希望试图让 WebGL 在任何地方都表现相同以便使用它的网页更有可能正常运行。

如果您想在您的桌面上测试 OpenGL ES 2.0 并且您恰好使用的是 Windows,您可以使用模拟 OpenGL ES 2.0 的ANGLE。有几个项目使用它,因此他们可以针对一个几乎可以在任何地方工作的 API。这意味着他们可以针对 OpenGL ES 2.0,并且他们的代码可能会在 Mac、Android、iOS、Linux 和 Windows 上运行(使用 ANGLE)。因为 ANGLE 模拟 OpenGL ES 2.0,所以它没有固定功能的东西,目前可以让你做你不能做的事情,所以使用它可以帮助你从 C/C++ 开始,并且更有可能不使用没有的功能在 WebGL 中可用

【讨论】:

  • MESA 驱动程序已经在我的桌面上提供了 GLES 2.0 功能,但更重要的是我没有 GLES 1.0 功能,据我了解,emscripten 使用 GLES 1.0 webgl 着色器,这是一个问题,因为我无法弄清楚如何将顶点颜色传递给我的片段着色器(这很好,我只需要以其他方式为我的精灵着色)。
  • 在对它进行了更多修改之后,我也设法提取了顶点颜色,它不像我习惯的那样工作,但它正在工作,所以就是这样。
  • 也许你应该阅读一下 WebGL?它与 OpenGL ES 2.0 几乎完全相同,除了 glFuncName 通常是 gl.funcName 而不是 GL_SOME_CONST 它是 gl.SOME_CONST。换句话说,你所了解的关于 WebGL 的几乎所有内容都可以应用于 OpenGL ES 2.0 Here's a good place to get started
  • 我想我应该,除了我需要的只是 webgl 使用的 GLSL 版本的文档(我想如果我阅读链接的文档我可以找到);其余的由 emscripten 处理,因为我正在使用 emscripten 将 OpenGL 编译为 javascript。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-11
  • 1970-01-01
  • 2016-09-30
  • 1970-01-01
  • 2020-08-18
  • 2013-11-06
  • 1970-01-01
相关资源
最近更新 更多