GPU中的OpenGL着色有时会抛出malloc错误

Liv*_*bot 0 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
Run Code Online (Sandbox Code Playgroud)

另外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);"
                "}";
Run Code Online (Sandbox Code Playgroud)

dat*_*olf 5

你得到的错误与着色器无关.你的程序中某处有一个免费使用或相关的bug.从本质上讲,你要么写出已分配内存区域的越界,从而破坏内存管理数据,要么在释放后写入内存.

越界的例子:

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 */
}
Run Code Online (Sandbox Code Playgroud)

免费使用后的例子:

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

    buf[0] = '\0';
}
Run Code Online (Sandbox Code Playgroud)

该问题的错误信息非常明确:

malloc:***对象0x7fb16e942410的错误:释放对象的校验和不正确 - 对象可能在被释放后被修改.***在malloc_error_break中设置断点以进行调试

在程序的某个地方,你有一个错误,它在语义上等同于上面的说明性代码片段.你必须找到并解决这个问题.

最有可能的错误是在代码中读取文件并将其内容传递给OpenGL.