2013-10-25 3 views
0

Я должен отобразить сцену, которая включает в себя различные сетки с openGL. мешите определяются следующим образом:Провести сцену с openGL

struct Mesh { 
frame3f   frame;  // frame 
vector<vec3f> pos;  // vertex position 
vector<vec3f> norm;  // vertex normal 
vector<vec2f> texcoord; // vertex texcture coordinates 
vector<vec3i> triangle; // triangle 
vector<vec4i> quad;  // quad 
Material*  mat;  // material} 

сетка может быть изготовлена ​​из треугольников и четырехугольников, я пытаюсь сделать вершину с этим кодом:

for (auto mesh : scene->meshes) 
{ 
    // bind material kd, ks, n 
    glVertexAttrib3f(material_kd_loc, mesh->mat->kd.x, mesh->mat->kd.y, mesh->mat->kd.z); 
    glVertexAttrib3f(material_ks_loc, mesh->mat->ks.x, mesh->mat->ks.y, mesh->mat->ks.z); 
    glVertexAttrib1f(material_n_loc, mesh->mat->n); 

    // bind mesh frame - use frame_to_matrix 
    mat4f mesh_mat = frame_to_matrix(mesh->frame); 
    glUniformMatrix4fv(mesh_frame_loc, 1, GL_TRUE, &mesh_mat[0][0]); 

    // enable vertex attributes arrays 
    glEnableVertexAttribArray(0); 
    glEnableVertexAttribArray(1); 

    //and set up pointers to the mesh data 
    glVertexAttribPointer(vertex_pos_loc, mesh->pos.size(), GL_FLOAT, GL_FALSE, 0, mesh->pos.data()); 
    glVertexAttribPointer(vertex_norm_loc, mesh->norm.size(), GL_FLOAT, GL_TRUE, 0, mesh->norm.data()); 

    // draw triangles and quads 
    if (mesh->triangle.size() != 0){ 

     glDrawElements(GL_TRIANGLES, mesh->pos.size(), GL_UNSIGNED_INT, mesh->triangle.data()); 
    } 
    if (mesh->quad.size() != 0){ 
     glDrawElements(GL_QUADS, mesh->pos.size(), GL_UNSIGNED_INT, mesh->quad.data()); 

    } 
    // disable vertex attribute arrays 
    glDisableVertexAttribArray(0); 
    glDisableVertexAttribArray(1); 
} 

} это то, что я рисую (дон «т заботиться о цветах, как я не вычислить их еще) this is what i draw (don't care about colors as i don't calculate them yet)

это то, что я должен видеть, если мой код правильный this is what i should see if my code is correct

Кто-нибудь, как идея о том, где ошибка?

+0

Публикация фактических (взятых из управляемой программы, а не некоторых входных файлов) позиций, содержимого треугольников и квадрантов (они невелики в данном примере). – keltar

+0

камера сосредоточена в 0,0,6 это код, который создает сетки: –

+0

новый Mesh {frame3f {{-offset, offset, 0}, x3f, y3f, z3f}, {{0,1,0 }, {-1, -1,0}, {1, -1,0}}, {z3f, z3f, z3f}, {zero2f, y2f, x2f}, {{0,1,2}}, { }, новый материал {one3f, zero3f, 100}}, ' –

ответ

0

посмотреть, как функция opengl хочет, чтобы общее число vertecx было записано, а не только количество разных вершин. так:

glDrawElements(GL_TRIANGLES, mesh->triangle.size()*3, GL_UNSIGNED_INT, mesh->triangle.data()); 
glDrawElements(GL_QUADS, mesh->quad.size()*4, GL_UNSIGNED_INT, mesh->quad.data()); 
0
glDrawElements(GL_TRIANGLES, mesh->pos.size(), GL_UNSIGNED_INT, mesh->triangle.data()); 
glDrawElements(GL_QUADS, mesh->quad.size(), GL_UNSIGNED_INT, mesh->quad.data()); 

Посмотрите на второй аргумент для обоих вызовов. Это неверно для квадроциклов.

glVertexAttribPointer(vertex_pos_loc, mesh->pos.size(), GL_FLOAT, GL_FALSE, 0, mesh->pos.data()); 

Неверный слишком - второй параметр - количество компонентов на вершину, а не размер массива.

+0

жаль я вставить старую версию, теперь редактируется на вопрос однако я' другие (более сложные) сцены для рендеринга, и они являются полным беспорядком с вершиной, плавающей вокруг везде, поэтому я думаю, что только удача в том, что я могу правильно изобразить два треугольника –

+0

Нашел еще одну ошибку. Добавлено в ответ. – keltar

+0

спасибо, теперь первая сцена выглядит нормально. но другие сцены выглядят странно: похоже, что некоторые вершины не выделены. Вы можете видеть целевые изображения и мои изображения в этом альбоме [photobucket album] (http://s338.photobucket.com/user/jack_the_beast/library/graphic) Заметьте, что я использую шейдер, написанный мной, он почти ничего не делает, но я не могу сказать, может ли это вызвать проблему .... –

Смежные вопросы