Затенение OpenGL в GPU иногда выдает ошибку malloc - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть программа, которая читает файл, сохраняет его в виде треугольной сетки и отправляет его в графический процессор с помощью OpenGL.Сейчас я пытаюсь добавить параметры затенения в программу, чтобы мы могли делать плоское или плавное затенение.Итак, я написал функцию, которая находит нормали для каждой грани, а затем получает среднее значение для каждой вершины, чтобы наконец получить нормальную для каждой вершины.

Я считаю, что все должно быть в порядке.

Однако, как только я добавил это, есть очень странная ошибка, которая полностью меня сбивает с толку: примерно в 90% случаев, когда я запускаю программу, я получаю следующую ошибку:

malloc: *** error for object 0x7fb16e942410: incorrect checksum for freed object - object was probably modified after being freed.
*** set a breakpoint in malloc_error_break to debug

Другой10% времени это привлекает это чудовище.enter image description here

Для пояснения нужно просто нарисовать неровный куб в центре красным.

Я совершенно растерялся, почему иногда получаю mallocошибка и иногда получаю это странное изображение.Я вполне уверен, что ошибка заключается в чем-то, что связано с нормалями, но это не объясняет кажущуюся случайность запуска.

Мой вершинный шейдер и фрагментный шейдер

const GLchar* vertex_shader =
        "#version 150 core\n"
                "in vec3 position;"
                "in vec3 color;"
                "in vec3 normals;"

                "out vec3 FragPos;"
                "out vec3 Normal;"
                "out vec3 f_color;"

                "uniform mat4 model;"
                "uniform mat4 view;"
                "uniform mat4 proj;"

                "void main()"
                "{"
                "    FragPos = vec3(model * vec4(position, 1.0));"
                "    Normal = mat3(transpose(inverse(model))) * normals;"
                "    f_color = color;"
                "    gl_Position = vec4(FragPos, 1.0);"
                "}";
const GLchar* fragment_shader =
        "#version 150 core\n"
                "in vec3 Normal;"
                "in vec3 FragPos;"
                "in vec3 f_color;"

                "uniform vec3 lightPos;"
                "uniform vec3 lightColor;"
                "uniform vec3 triangleColor;"

                "out vec4 outColor;"

                "void main()"
                "{"
                "    float ambientStrength = 0.4;"
                "    vec3 ambient = ambientStrength * vec3(1, 0, 0);"

                "    vec3 norm = normalize(Normal);"
                "    vec3 lightDir = normalize(lightPos - FragPos);"
                "    float diff = max(dot(norm, lightDir), 0.0);"
                "    vec3 diffuse = diff * lightColor;"
                "    vec3 shaded_color = (ambient + diffuse) * f_color;"
                "    outColor = vec4(shaded_color, 1.0);"
                "}";

1 Ответ

0 голосов
/ 23 ноября 2018

Ошибка, которая у вас есть, не имеет ничего общего с шейдерами.У вас есть ошибка, связанная с использованием после освобождения или связанная с ней ошибка где-то в вашей программе.По сути, вы либо записываете за пределы выделенной области памяти, тем самым повреждая данные управления памятью, либо записываете в память после того, как вы ее освободили.

Пример выхода за пределыграницы:

void out_of_bounds()
{
    char *buf;
#ifdef __cplusplus
    buf = new char[8];
#else
    buf = malloc(8);
#endif
    buf[8] = 'x'; /* out of bounds just one element past the end */
    buf[999] = 'x'; /* out of bounds waaay past the end */
}

Пример использования после освобождения:

void use_after_free(char *buf)
{ 
    #ifdef __cplusplus
        delete[] buf;
    #else
        free(buf);
    #endif

    buf[0] = '\0';
}

Сообщение об ошибке довольно ясно о проблеме:

malloc: ***ошибка для объекта 0x7fb16e942410: неверная контрольная сумма для освобожденного объекта - объект, вероятно, был изменен после освобождения.*** установите точку останова в malloc_error_break для отладки

Где-то в вашей программе вы обнаружили ошибку, семантически эквивалентную приведенным выше фрагментам кода.Вы должны найти и исправить это.

Скорее всего, ошибка заключается в коде, который читает файлы и передает их содержимое в OpenGL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...