У меня есть программа, которая читает файл, сохраняет его в виде треугольной сетки и отправляет его в графический процессор с помощью 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% времени это привлекает это чудовище.
Для пояснения нужно просто нарисовать неровный куб в центре красным.
Я совершенно растерялся, почему иногда получаю 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);"
"}";