Я сузил проблему. У меня есть два атрибута, указывающие на одни и те же данные. Это прекрасно работает при сборке на родном C++. Однако, когда построен с emscripten, то Консоль JavaScript показывает следующее сообщение об ошибке на каждом кадре:'glDrawArrays: попытка получить доступ к вершинам диапазона в атрибуте 1' на Emscripten/OpenGL-коде (работает на родном C++)
'glDrawArrays: attempt to access out of range vertices in attribute 1'
Когда я закомментируйте строку «glEnableVertexAttribArray», чтобы включить второй атрибут, я не получаю эту ошибку.
Ниже приведен мой код. Начну с созданием буфера данных:
GLfloat rectangleData[] =
{
-.5f, -.5f, 0,1,
-.5f, .5f, 0,0,
.5f, .5f, 1,0,
.5f, -.5f, 1,1,
-.5f, -.5f, 0,1
};
glGenBuffers(1, &rectangleBuffer);
glBindBuffer(GL_ARRAY_BUFFER, rectangleBuffer);
glBufferData(
GL_ARRAY_BUFFER, sizeof(rectangleData),
rectangleData, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
Вот соответствующий отрывок из моей текстурированной коды четырехъядерных чертежной:
glBindBuffer(GL_ARRAY_BUFFER, rectangleBuffer);
int vertexPosition = Shader::getParameterInfo("vertexPosition")->id;
glVertexAttribPointer(
vertexPosition, 2, GL_FLOAT,
GL_FALSE, 16, BUFFER_OFFSET(0));
glEnableVertexAttribArray(vertexPosition);
int vertexTexCoord = Shader::getParameterInfo("vertexTexCoord")->id;
glVertexAttribPointer(
vertexTexCoord, 2, GL_FLOAT,
GL_FALSE, 16, BUFFER_OFFSET(0));
glEnableVertexAttribArray(vertexTexCoord);
glDrawArrays(GL_TRIANGLE_FAN, 0, 5);
Обратите внимание, что я настроил второй атрибут, чтобы указать на то же самое данных в качестве первого (для уменьшения сложности при отладке). Я здесь довольно превзойден и могу действительно использовать свежую/опытную перспективу.
EDIT: Вот что BUFFER_OFFSET
выглядит следующим образом:
#define BUFFER_OFFSET(i) ((char *)NULL + (i))
Источник: How to cast int to const GLvoid*?
EDIT: Для чего это стоит, вот эквивалент Emscripten генерируется JS код. Я пошлю любой JS-код, если это потребуется.
dest=$rectangleData; src=2328; stop=dest+80|0; do {
HEAP32[dest>>2]=HEAP32[src>>2]|0; dest=dest+4|0; src=src+4|0; } while
((dest|0) < (stop|0));
_glGenBuffers(1,(2300|0));
$30 = HEAP32[2300>>2]|0;
_glBindBuffer(34962,($30|0));
_glBufferData(34962,80,($rectangleData|0),35044);
_glBindBuffer(34962,0);
$11 = HEAP32[2300>>2]|0;
_glBindBuffer(34962,($11|0));
$12 = (__ZN8platform6Shader16getParameterInfoEPKc(17356)|0);
$13 = HEAP32[$12>>2]|0;
$vertexPosition = $13;
$14 = $vertexPosition;
_glVertexAttribPointer(($14|0),2,5126,0,16,(0|0));
$15 = $vertexPosition;
_glEnableVertexAttribArray(($15|0));
$16 = (__ZN8platform6Shader16getParameterInfoEPKc(17379)|0);
$17 = HEAP32[$16>>2]|0;
$vertexTexCoord = $17;
$18 = $vertexTexCoord;
_glVertexAttribPointer(($18|0),2,5126,0,16,(0|0));
$19 = $vertexTexCoord;
_glEnableVertexAttribArray(($19|0));
_glDrawArrays(6,0,5);
Edit: А еще лучше, я приведу ссылку на код JS работает на GitHub, и C++ код тоже (он находится в нижней части в "DrawImage()"):
Пара вопросов. Является 'sizeof (rectangleBuffer)' действительно '20 * sizeof (GLfloat)', а не размером указателя? И что делает 'BUFFER_OFFSET'? –
@KirillDmitrenko: Если OP написал это именно так, тогда да, 'sizeof (rectangleData)' будет оценивать общий размер массива (он не будет работать, если массив передан как параметр функции или деградация указателя). – datenwolf
How выглядит соответствующий код javascript? C++ выглядит правильно. – BDL