Emscripten with SDL2 - Error: WebGL: drawArrays: null

Emscripten with SDL2 - Error: WebGL: drawArrays: null

本文关键字:WebGL null drawArrays Error with SDL2 Emscripten      更新时间:2023-10-16

所以我试图用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)

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

就像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中不可用的功能