Ошибка сегментации OpenGL при рисовании модели - PullRequest
0 голосов
/ 25 мая 2018

Я столкнулся со странной вещью.Посмотрите на эту часть кода:

Models::ziemia.drawSolid();
Models::ptaszek.drawSolid();
Models::dach5.drawSolid();

Models::sciany1.drawSolid();
Models::sciany2.drawSolid();
Models::sciany3.drawSolid();
Models::sciany4.drawSolid();
// Models::sciany5.drawSolid();

Models::zewnetrznydach1.drawSolid();
Models::zewnetrznydach2.drawSolid();
// Models::zewnetrznydach3.drawSolid();
// Models::zewnetrznydach4.drawSolid();

Models::wewnetrznydach1.drawSolid();
Models::wewnetrznydach2.drawSolid();
Models::wewnetrznydach3.drawSolid();
Models::wewnetrznydach4.drawSolid();

Обычно эти модели генерируются моим скриптом на python (поэтому все файлы одинаковы, только некоторые изменения данных - например, вершины для каждой модели).Я могу нормально запустить мою программу с таким набором.Но когда я раскомментирую одну из прокомментированных моделей, произойдет сбой сегментации и произойдет сброс ядра.Я работаю на Ubuntu 16.04.Я попытался изменить драйверы (где-то еще это помогло в подобной проблеме), и ничего не изменилось.Вот вам пример для сравнения (одна рабочая модель и одна не рабочая):

модель zewnetrznyDach2 (рабочая):

#include "zewnetrznydach2.h"

namespace Models {

    ZewnetrznyDach2 zewnetrznydach2;

    ZewnetrznyDach2::ZewnetrznyDach2() {
        vertices=ZewnetrznyDach2Internal::vertices;
        normals=ZewnetrznyDach2Internal::normals;
        vertexNormals=ZewnetrznyDach2Internal::vertexNormals;
        texCoords=ZewnetrznyDach2Internal::texCoords;
        colors=ZewnetrznyDach2Internal::colors;
        vertexCount=ZewnetrznyDach2Internal::vertexCount;
    }

    ZewnetrznyDach2::~ZewnetrznyDach2() {
    }

    void ZewnetrznyDach2::drawSolid() {
        glEnable(GL_NORMALIZE);

        glEnableClientState(GL_VERTEX_ARRAY);
        //glEnableClientState(GL_COLOR_ARRAY);
        glEnableClientState(GL_NORMAL_ARRAY);
        glEnableClientState(GL_TEXTURE_COORD_ARRAY);

        glVertexPointer(4,GL_FLOAT,0,vertices);
        //glColorPointer(4,GL_FLOAT,0,colors);
        glNormalPointer(GL_FLOAT,sizeof(float)*4,vertexNormals);
        glTexCoordPointer(2,GL_FLOAT,0,texCoords);

        glDrawArrays(GL_TRIANGLES,0,vertexCount);

        glDisableClientState(GL_VERTEX_ARRAY);
        //glDisableClientState(GL_COLOR_ARRAY);
        glDisableClientState(GL_NORMAL_ARRAY);
        glDisableClientState(GL_TEXTURE_COORD_ARRAY);
    }

    namespace ZewnetrznyDach2Internal {
            unsigned int vertexCount=36;

            float vertices[]={
                -16.193,-2.25,-9.829,1.0,
                -15.999,-2.099,-9.829,1.0,
                -5.413,-2.25,-9.829,1.0,
                -15.999,-2.099,-9.829,1.0,
                -16.193,-2.25,-9.829,1.0,
                -16.193,6.2,-9.829,1.0,
                -15.999,-2.099,-9.829,1.0,
                -16.193,6.2,-9.829,1.0,
                -15.999,5.820,-9.829,1.0,
                -15.999,5.820,-9.829,1.0,
                -16.193,6.2,-9.829,1.0,
                -5.639,5.820,-9.829,1.0,
                -5.413,6.2,-9.829,1.0,
                -5.639,5.820,-9.829,1.0,
                -16.193,6.2,-9.829,1.0,
                -5.413,6.2,-9.829,1.0,
                -5.639,-2.099,-9.829,1.0,
                -5.639,5.820,-9.829,1.0,
                -5.413,-2.25,-9.829,1.0,
                -5.639,-2.099,-9.829,1.0,
                -5.413,6.2,-9.829,1.0,
                -5.639,-2.099,-9.829,1.0,
                -5.413,-2.25,-9.829,1.0,
                -15.999,-2.099,-9.829,1.0,
                -5.639,-2.099,-9.829,1.0,
                -15.999,-2.099,-9.829,1.0,
                -15.999,-2.099,-9.769,1.0,
                -15.999,-2.099,-9.829,1.0,
                -15.999,5.820,-9.829,1.0,
                -15.999,5.820,-9.769,1.0,
                -15.999,5.820,-9.829,1.0,
                -5.639,5.820,-9.829,1.0,
                -5.639,5.820,-9.769,1.0,
                -5.639,5.820,-9.829,1.0,
                -5.639,-2.099,-9.829,1.0,
                -5.639,-2.099,-9.769,1.0,


            };

            float colors[]={
            };

            float normals[]={
                0,0,-1,0,
                0,0,-1,0,
                0,0,-1,0,
                0,0,-1,0,
                0,0,-1,0,
                0,0,-1,0,
                0,0,-1,0,
                0,0,-1,0,
                0,0,-1,0,
                0,0,-1,0,
                0,0,-1,0,
                0,0,-1,0,
                0,0,-1,0,
                0,0,-1,0,
                0,0,-1,0,
                0,0,-1,0,
                0,0,-1,0,
                0,0,-1,0,
                0,0,-1,0,
                0,0,-1,0,
                0,0,-1,0,
                0,0,-1,0,
                0,0,-1,0,
                0,0,-1,0,
                0,1,-0,0,
                0,1,-0,0,
                0,1,-0,0,
                1,0,-0,0,
                1,0,-0,0,
                1,0,-0,0,
                0,-1,-0,0,
                0,-1,-0,0,
                0,-1,-0,0,
                -1,0,-0,0,
                -1,0,-0,0,
                -1,0,-0,0,

            };

            float vertexNormals[]={
            };

            float texCoords[]={
                637.526,-88.582,
                629.904,-82.667,
                213.116,-88.582,
                629.904,-82.667,
                637.526,-88.582,
                637.526,244.094,
                629.904,-82.667,
                637.526,244.094,
                629.904,229.143,
                629.904,229.143,
                637.526,244.094,
                222.03,229.143,
                213.116,244.094,
                222.03,229.143,
                637.526,244.094,
                213.116,244.094,
                222.03,-82.667,
                222.03,229.143,
                213.116,-88.582,
                222.03,-82.667,
                213.116,244.094,
                222.03,-82.667,
                213.116,-88.582,
                629.904,-82.667,
                -222.03,386.989,
                -629.904,386.989,
                -629.904,384.626,
                386.989,-82.667,
                386.989,229.143,
                384.626,229.143,
                629.904,386.989,
                222.03,386.989,
                222.03,384.626,
                -386.989,229.143,
                -386.989,-82.667,
                -384.626,-82.667,

            };
    }
}

модель zewnetrznydach3 (закомментированная и не рабочая):

#include "zewnetrznydach3.h"

namespace Models {

    ZewnetrznyDach3 zewnetrznydach3;

    ZewnetrznyDach3::ZewnetrznyDach3() {
        vertices=ZewnetrznyDach3Internal::vertices;
        normals=ZewnetrznyDach3Internal::normals;
        vertexNormals=ZewnetrznyDach3Internal::vertexNormals;
        texCoords=ZewnetrznyDach3Internal::texCoords;
        colors=ZewnetrznyDach3Internal::colors;
        vertexCount=ZewnetrznyDach3Internal::vertexCount;
    }

    ZewnetrznyDach3::~ZewnetrznyDach3() {
    }

    void ZewnetrznyDach3::drawSolid() {
        glEnable(GL_NORMALIZE);

        glEnableClientState(GL_VERTEX_ARRAY);
        //glEnableClientState(GL_COLOR_ARRAY);
        glEnableClientState(GL_NORMAL_ARRAY);
        glEnableClientState(GL_TEXTURE_COORD_ARRAY);

        glVertexPointer(4,GL_FLOAT,0,vertices);
        //glColorPointer(4,GL_FLOAT,0,colors);
        glNormalPointer(GL_FLOAT,sizeof(float)*4,vertexNormals);
        glTexCoordPointer(2,GL_FLOAT,0,texCoords);

        glDrawArrays(GL_TRIANGLES,0,vertexCount);

        glDisableClientState(GL_VERTEX_ARRAY);
        //glDisableClientState(GL_COLOR_ARRAY);
        glDisableClientState(GL_NORMAL_ARRAY);
        glDisableClientState(GL_TEXTURE_COORD_ARRAY);
    }

    namespace ZewnetrznyDach3Internal {
            unsigned int vertexCount=36;

            float vertices[]={
                0.011,-6.68,-10.305,1.0,
                0.142,-6.589,-10.305,1.0,
                4.741,-6.68,-10.305,1.0,
                0.142,-6.589,-10.305,1.0,
                0.011,-6.68,-10.305,1.0,
                0.011,-2,-10.305,1.0,
                0.142,-6.589,-10.305,1.0,
                0.011,-2,-10.305,1.0,
                0.142,-2.229,-10.305,1.0,
                0.142,-2.229,-10.305,1.0,
                0.011,-2,-10.305,1.0,
                4.572,-2.229,-10.305,1.0,
                4.741,-2,-10.305,1.0,
                4.572,-2.229,-10.305,1.0,
                0.011,-2,-10.305,1.0,
                4.741,-2,-10.305,1.0,
                4.572,-6.589,-10.305,1.0,
                4.572,-2.229,-10.305,1.0,
                4.741,-6.68,-10.305,1.0,
                4.572,-6.589,-10.305,1.0,
                4.741,-2,-10.305,1.0,
                4.572,-6.589,-10.305,1.0,
                4.741,-6.68,-10.305,1.0,
                0.142,-6.589,-10.305,1.0,
                4.572,-6.589,-10.305,1.0,
                0.142,-6.589,-10.305,1.0,
                0.142,-6.589,-10.265,1.0,
                0.142,-6.589,-10.305,1.0,
                0.142,-2.229,-10.305,1.0,
                0.142,-2.229,-10.265,1.0,
                0.142,-2.229,-10.305,1.0,
                4.572,-2.229,-10.305,1.0,
                4.572,-2.229,-10.265,1.0,
                4.572,-2.229,-10.305,1.0,
                4.572,-6.589,-10.305,1.0,
                4.572,-6.589,-10.265,1.0,


            };

            float colors[]={
            };

            float normals[]={
                0,0,-1,0,
                0,0,-1,0,
                0,0,-1,0,
                0,0,-1,0,
                0,0,-1,0,
                0,0,-1,0,
                0,0,-1,0,
                0,0,-1,0,
                0,0,-1,0,
                0,0,-1,0,
                0,0,-1,0,
                0,0,-1,0,
                0,0,-1,0,
                0,0,-1,0,
                0,0,-1,0,
                0,0,-1,0,
                0,0,-1,0,
                0,0,-1,0,
                0,0,-1,0,
                0,0,-1,0,
                0,0,-1,0,
                0,0,-1,0,
                0,0,-1,0,
                0,0,-1,0,
                0,1,-0,0,
                0,1,-0,0,
                0,1,-0,0,
                1,0,-0,0,
                1,0,-0,0,
                1,0,-0,0,
                0,-1,-0,0,
                0,-1,-0,0,
                0,-1,-0,0,
                -1,0,-0,0,
                -1,0,-0,0,
                -1,0,-0,0,

            };

            float vertexNormals[]={
            };

            float texCoords[]={
                -0.440,-262.992,
                -5.607,-259.413,
                -186.661,-262.992,
                -5.607,-259.413,
                -0.440,-262.992,
                -0.440,-78.740,
                -5.607,-259.413,
                -0.440,-78.740,
                -5.607,-87.759,
                -5.607,-87.759,
                -0.440,-78.740,
                -180.017,-87.759,
                -186.661,-78.740,
                -180.017,-87.759,
                -0.440,-78.740,
                -186.661,-78.740,
                -180.017,-259.413,
                -180.017,-87.759,
                -186.661,-262.992,
                -180.017,-259.413,
                -186.661,-78.740,
                -180.017,-259.413,
                -186.661,-262.992,
                -5.607,-259.413,
                180.017,405.722,
                5.607,405.722,
                5.607,404.147,
                405.722,-259.413,
                405.722,-87.759,
                404.147,-87.759,
                -5.607,405.722,
                -180.017,405.722,
                -180.017,404.147,
                -405.722,-87.759,
                -405.722,-259.413,
                -404.147,-259.413,

            };
    }
}

Как это возможно?

1 Ответ

0 голосов
/ 25 мая 2018

vertexNormals пусто, но вы просите OpenGL прочитать данные из него.

В лучшем случае OpenGL получает мусор.В худшем случае вы получаете segfault, когда OpenGL пытается читать за пределами выделенных страниц памяти вашего процесса.

Несколько вариантов:

  • Заполните массив соответствующим количеством нормалей
  • Скажите OpenGL для доступа к другому заполненному массиву
  • Отключите состояние GL_NORMAL_ARRAY, чтобы OpenGL вообще не читал из обычного указателя
...