I have a problem while trying to make game using OpenGL.
Imagine that I have Object class which hold all information about any game object which should be drawn, like this:
void Object::Init(char* vShader, char* fShader, Vertex verticies[4], std::string texture)
{
m_shaders = new Shaders();
m_shaders->Init(vShader, fShader);
m_vertices[0] = verticies[0];
m_vertices[1] = verticies[1];
m_vertices[2] = verticies[2];
m_vertices[3] = verticies[3];
m_textures = new Texture(GL_TEXTURE_2D, texture);
m_textures->Load();
glGenBuffers(1, &m_VBO);
glBindBuffer(GL_ARRAY_BUFFER, m_VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(m_vertices), m_vertices, GL_STATIC_DRAW);
unsigned int Indices[] = { 0, 1, 2,
0, 2, 3
};
glGenBuffers(1, m_IBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_IBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Indices), Indices, GL_STATIC_DRAW);
}
As far as I debug all parts (shaders and texture ) inited succesfully.
Then I have draw function like this:
void Object::Draw(double dt, appdata_s* ad, double offset)
{
glUseProgram(m_shaders->program);
glUniformMatrix4fv(ad->idx_mvp, 1, GL_FALSE, ad->mvp);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, m_VBO);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid*)12);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_IBO);
m_textures->Bind(GL_TEXTURE0);
u_time = glGetUniformLocation(m_shaders->program, "u_time");
glUniform1f(u_time, dt);
u_offset = glGetUniformLocation(m_shaders->program, "u_offset");
glUniform1f(u_offset, offset);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, (void*)0);
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glUseProgram(0);
}
This is draw function from main file:
static void draw_gl(Evas_Object *obj)
{
appdata_s *ad = (appdata_s *)evas_object_data_get(obj, "ad");
float model[16], view[16];
float aspect;
int rotation;
if (!ad)
return;
/* ad->time_stamp += ad->stride_time_stamp;
if (ad->time_stamp > 2 * M_PI)
ad->time_stamp = 0.0f;
if (ad->stop_count < 0) {
ad->angle += 1.0f;
if (ad->angle >= 360.0f)
ad->angle -= 360.0f;
float remain = ad->angle - 90.0f * (float) ((int) (ad->angle / 90.0f));
if (remain > -EPSILON && remain < EPSILON)
ad->stop_count = 0;
} else {
ad->stop_count++;
if (ad->stop_count == PAUSE_TIME)
ad->stop_count = -1;
}*/
//glUseProgram(ad->program);
init_matrix(model);
init_matrix(view);
rotation = elm_glview_rotation_get(obj);
if (rotation % 180)
aspect = (float) ad->glview_h / (float) ad->glview_w;
else
aspect = (float) ad->glview_w / (float) ad->glview_h;
view_set_perspective(view, 60.0f, aspect, 1.0f, 20.0f);
if (rotation != ad->view_rotation)
rotate_xyz(view, (rotation - ad->view_rotation), 0.0f, 0.0f, -1.0f);
translate_xyz(model, 0.0f, 0.0f, -1.9f);
rotate_xyz(model, ad->angle, 1.0f, 0.0f, 0.0f);
multiply_matrix(ad->mvp, view, model);
glViewport(0, 0, ad->glview_w, ad->glview_h);
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
/*glUniform4fv(ad->idx_light_dir, 1, ad->light_dir);
glUniformMatrix4fv(ad->idx_mvp, 1, GL_FALSE, ad->mvp);
glUniform1f(ad->idx_time_stamp, ad->time_stamp);
glBindBuffer(GL_ARRAY_BUFFER, ad->idx_vbo);
glVertexAttribPointer(ad->idx_vposition, 3, GL_FLOAT, GL_FALSE,
sizeof(float) * 6, 0);
glEnableVertexAttribArray(ad->idx_vposition);
glVertexAttribPointer(ad->idx_vnormal, 3, GL_FLOAT, GL_FALSE,
sizeof(float) * 6, (void*) (sizeof(float) * 3));
glEnableVertexAttribArray(ad->idx_vnormal);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ad->idx_ibo);*/
//glDrawElements(GL_TRIANGLES, MAX_F_COUNT * 3, GL_UNSIGNED_SHORT, 0);
/*glDisableVertexAttribArray(ad->idx_vposition);
glDisableVertexAttribArray(ad->idx_vnormal);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);*/
//glUseProgram(0);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
bg.Draw(0.05, ad);
fb_title.Draw(0.05, ad);
glDisable(GL_BLEND);
glFlush();
display_fps();
}
Commented parts - unused template parts which used to draw standart teapot.
And it works fine, if I try to draw 1 object (like bg.Draw()). Everything is ok. But when I trying to draw 2, 3 or more object I faced with unexpected crashes.
Does Gear S2 have some restrictions or memory problems ? Thank you. And Sorry for my english.