GPU中的OpenGL阴影有时会引发malloc错误

时间:2018-11-23 07:24:59

标签: c++ opengl

我有一个程序可以读取文件,将其存储为三角形网格,然后使用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

其他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 :(得分: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的代码中。