【发布时间】:2018-11-23 17:09:48
【问题描述】:
我有一个程序读取文件,将其存储为三角形网格并使用 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);"
"}";
【问题讨论】:
-
“我收到以下错误:malloc: *** error for object 0x7fb16e942410” - 着色器代码与此问题有何关联?可能您在 c++ 代码中写入超出范围的数组。如果您使用
std::vector,那么它会很容易找到。 C++ 和malloc不合。