我有一个程序可以读取文件,将其存储为三角形网格,然后使用OpenGL将其发送到GPU。我现在正在尝试向程序添加阴影选项,以便我们可以进行平面或平滑阴影处理。因此,我编写了一个函数,该函数可以找到每面法线,然后获取每个顶点的平均值,最后得到每个顶点法线。
我相信一切都会好起来的。
但是,一旦我添加了这个,就有一个非常奇怪的错误将我完全甩开了,大约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
为清楚起见,它应该只在中心用红色绘制凹凸不平的立方体。
我完全迷失了为什么有时会出现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);"
"}";
答案 0 :(得分:5)
您遇到的错误与着色器无关。您的程序中某处有一个“用后可用”或相关的错误。本质上,您要么写出了已分配内存区域的边界,从而损坏了内存管理数据,要么释放了内存之后再写到内存中。
越界示例:
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的代码中。