Nano Hash - криптовалюты, майнинг, программирование

Рендеринг сцены с помощью 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);
}

} это то, что я рисую (не беспокойтесь о цветах, поскольку я их еще не вычисляю) это то, что я  рисовать (не обращайте внимания на цвета, так как я их еще не вычисляю)

это то, что я должен увидеть, если мой код правильный это то, что я должен увидеть, если мой код правильный

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


  • Опубликуйте свои фактические (взятые из работающей программы, а не из некоторых входных файлов) позиции, содержимое массивов треугольников и четырехугольников (в данном примере они невелики). 25.10.2013
  • камера центрирована в 0,0,6 это код, который создает сетки: 25.10.2013
  • новая сетка {frame3f{{-смещение, смещение,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}}, ' 25.10.2013
  • новая сетка {frame3f{ {смещение, смещение,0}, x3f, y3f, z3f}, {{1,1,0}, {-1, 1,0}, {-1,-1,0}, {1 ,-1,0} }, {z3f, z3f, z3f, z3f}, {one2f, y2f, zero2f, x2f}, {}, {{0,1,2,3}}, новый материал{one3f,zero3f, 100} }, 25.10.2013
  • новая сетка {identity_frame3f, {{-смещение,1-смещение,0}, {-1-смещение,-1-смещение,0}, {1-смещение,-1-смещение,0}}, {z3f, z3f, z3f}, {zero2f, y2f, x2f}, {{0,1,2}}, {}, новый материал{one3f,zero3f,100}}, 25.10.2013
  • новая сетка {identity_frame3f, {{1+смещение,1-смещение,0}, {-1+смещение, 1-смещение,0}, {-1+смещение,-1-смещение,0}, {1+смещение, -1-смещение,0} }, {z3f, z3f, z3f, z3f}, {one2f, y2f, zero2f, x2f}, {}, {{0,1,2,3}}, новый материал{one3f,zero3f ,100} }, },' 25.10.2013

Ответы:


1
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());

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

25.10.2013
  • извините, я вставил старую версию, теперь она отредактирована по вопросу, однако у меня есть другие (более сложные) сцены для рендеринга, и они представляют собой полный беспорядок с вершинами, плавающими повсюду, поэтому я думаю, что это только удача, что я могу визуализировать два треугольника правильно 25.10.2013
  • спасибо, теперь первая сцена выглядит нормально. но другие сцены выглядят странно: похоже, что некоторые вершины не нарисованы. Вы можете увидеть целевые изображения и мои изображения в этом альбом photobucket обратите внимание, что я использую шейдер, написанный мной, он почти ничего не делает, но я не могу сказать, может ли это вызвать проблему.... 25.10.2013

  • 2

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

    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());
    
    26.10.2013
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..