Поэтому я пытаюсь скомпилировать некоторый код SDL2 с помощью emscripten, и я сталкиваюсь с ошибками после ошибок, большинство из которых я могу решить сам, но это сбивает меня с толку.
В настоящее время я пытаюсь нарисовать четырехугольник на экране, используя 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. Несколько проектов используют его, поэтому они могут предназначаться для одного API, который работает почти везде. Это означает, что они могут работать с OpenGL ES 2.0, и их код, вероятно, будет работать на Mac, Android, iOS, Linux и Windows (с использованием ANGLE). Поскольку ANGLE эмулирует OpenGL ES 2.0, он не имеет фиксированных функций, которые в настоящее время позволяют вам делать то, что вы не можете делать, и поэтому его использование поможет вам начать с C / C ++ и с большей вероятностью не будет использовать функции, которые не являются доступно в WebGL