【问题标题】:OpenGL shading in GPU sometimes throwing malloc errorGPU中的OpenGL着色有时会抛出malloc错误
【发布时间】: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

另外 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);"
                "}";

【问题讨论】:

  • “我收到以下错误:malloc: *** error for object 0x7fb16e942410” - 着色器代码与此问题有何关联?可能您在 c++ 代码中写入超出范围的数组。如果您使用std::vector,那么它会很容易找到。 C++ 和 malloc 不合。

标签: c++ opengl


【解决方案1】:

您遇到的错误与着色器无关。您的程序中某处存在释放后使用或相关错误。从本质上讲,您要么写入超出分配的内存区域的范围,从而破坏内存管理数据,要么在释放内存后写入内存。

越界示例:

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 中设置断点进行调试

在您的程序中的某个地方,您遇到了一个在语义上等同于上述说明性代码 sn-ps 的错误。你必须找到并解决它。

错误很可能出现在读取文件并将其内容传递给 OpenGL 的代码中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多