glDrawArrays crash on enable color vertex array OpenGL ES 2.0

62
7

Код ниже работает нормально и рисует цветной треугольник равными сторонами:

GLfloat triangle_pos[] =
{
-0.5, -0.25, 0.0,
0.5, -0.25, 0.0,
0.0, 0.559016994, 0.0
};

void draw_triangle()
{
glUseProgram(SHADER.program);

matrix mv;
multiply_matrix(VIEW_MATRIX/*ident*/, MODEL_MATRIX/*ident*/, mv);
matrix mvp;
multiply_matrix(PROJECTION_MATRIX/*ortho*/, mv, mvp);

glUniformMatrix4fv(SHADER.uniforms[0]/*um_mvp*/, 1, GL_FALSE, mvp);

glEnableVertexAttribArray(SHADER.atributes[0]/*av_pos*/);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, triangle_pos);

glDrawArrays(GL_TRIANGLES, 0, 3);

glDisableVertexAttribArray(SHADER.atributes[0]/*av_pos*/);

glUseProgram(0);
}

Vertex shader:

attribute vec4 av_pos;
varying vec4 vv_col;
uniform mat4 um_mvp;
void main()
{
vv_col = um_mvp * av_pos;
gl_Position = vv_col;
}

Фрагментный шейдер:

precision lowp float;
varying vec4 vv_col;
void main()
{
gl_FragColor = vv_col;
}

Позволяет изменить вершинный шейдер для загрузки значений цвета извне:

attribute vec4 av_pos;
attribute vec4 av_col;
varying vec4 vv_col;
uniform mat4 um_mvp;
void main()
{
vv_col = av_col
gl_Position = um_mvp * av_pos;
}

Измененный код будет:

GLfloat triangle_pos[] =
{
-0.5, -0.25, 0.0,
0.5, -0.25, 0.0,
0.0, 0.559016994, 0.0
};

GLfloat triangle_col[]=
{
1.0,0.0,1.0,1.0,
0.0,1.0,1.0,1.0,
1.0,0.0,0.0,1.0
};

void draw_triangle()
{
glUseProgram(SHADER.program);

matrix mv;
multiply_matrix(VIEW_MATRIX, MODEL_MATRIX, mv);
matrix mvp;
multiply_matrix(PROJECTION_MATRIX, mv, mvp);

glUniformMatrix4fv(SHADER.uniforms[0]/*um_mvp*/, 1, GL_FALSE, mvp);

glEnableVertexAttribArray(SHADER.atributes[0]/*av_pos*/);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, triangle_pos);

glEnableVertexAttribArray(SHADER.atributes[1]/*av_col*/);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, triangle_col);

glDrawArrays(GL_TRIANGLES, 0, 3); // just crashing i can't even glGetError() after that line

glDisableVertexAttribArray(SHADER.atributes[0]);

glDisableVertexAttribArray(SHADER.atributes[1]);

glUseProgram(0);
}

Почему сбой glDrawArrays и как это исправить?

спросил(а) 2021-01-19T19:33:43+03:00 2 месяца, 3 недели назад
1
Решение
97

glEnableVertexAttribArray(SHADER.atributes[0]/*av_pos*/);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, triangle_pos);

glEnableVertexAttribArray(SHADER.atributes[1]/*av_col*/);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, triangle_col);

Первый аргумент glVertexAttribPointer - это атрибут для установки. Это то же значение, что и для glEnableVertexAttribArray. Так что это должно быть:

glEnableVertexAttribArray(SHADER.atributes[0]/*av_pos*/);
glVertexAttribPointer(SHADER.atributes[0], 3, GL_FLOAT, GL_FALSE, 0, triangle_pos);

glEnableVertexAttribArray(SHADER.atributes[1]/*av_col*/);
glVertexAttribPointer(SHADER.atributes[1], 4, GL_FLOAT, GL_FALSE, 0, triangle_col);

ответил(а) 2021-01-19T19:33:43+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема