Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么这会导致访问冲突?_C++_Opengl_Glsl - Fatal编程技术网

C++ 为什么这会导致访问冲突?

C++ 为什么这会导致访问冲突?,c++,opengl,glsl,C++,Opengl,Glsl,这是一个相当庞大的程序,所以我试图将其缩小到我认为导致0xFEEEFEEE违规的范围。虽然这是一个巨大的程序,(无论如何,按行数计算),但它做了一件非常简单的事情:使用OpenGL绘制一个三角形。需要注意的一点是,如果我从控制台中取出x,程序似乎只会触发访问冲突,假设它没有正确地破坏 标题: #include <iostream> #include <vector> #include <string> class Mesh { public: M

这是一个相当庞大的程序,所以我试图将其缩小到我认为导致0xFEEEFEEE违规的范围。虽然这是一个巨大的程序,(无论如何,按行数计算),但它做了一件非常简单的事情:使用OpenGL绘制一个三角形。需要注意的一点是,如果我从控制台中取出x,程序似乎只会触发访问冲突,假设它没有正确地破坏

标题:

#include <iostream>
#include <vector>
#include <string>

class Mesh
{

public:

    Mesh(std::string FileName);
    ~Mesh();
    void Draw();

private:

    unsigned int VBO = 0;
    unsigned int VAO = 0;

    std::vector<float> Vertices;

    const char* VertexShader =
        "#version 330\n"
        "in vec3 vp;"
        "void main () {"
        "  gl_Position = vec4 (vp, 2.0);"
        "}";

    const char* FragmentShader =
        "#version 330\n"
        "out vec4 frag_colour;"
        "void main () {"
        "  frag_colour = vec4 (0.5, 0.0, 0.5, 1.0);"
        "}";

};

#endif // MESH_H
#包括
#包括
#包括
类网格
{
公众:
网格(std::字符串文件名);
~Mesh();
无效抽取();
私人:
无符号整数VBO=0;
无符号整数VAO=0;
向量顶点;
常量字符*顶点着色器=
“#版本330\n”
“在vec3 vp中;”
“void main(){”
“gl_位置=向量4(vp,2.0);”
"}";
常量字符*碎片着色器=
“#版本330\n”
“输出矢量4 frag_颜色;”
“void main(){”
frag_color=vec4(0.5,0.0,0.5,1.0)
"}";
};
#endif//MESH\u
cpp:

#定义GLEW#U静态
#包括
#包括
#包括
#包括
#包括
#包括“Mesh.h”
网格::网格(标准::字符串文件名)
{
浮动X;
浮动Y;
浮动Z;
int LoopCount=1;
int VerticesCount=0;
std::字符串输入;
std::ifstream OBJFile;
打开(文件名);
而(!OBJFile.eof())
{
OBJFile>>输入;
如果(输入=“v”)
{
OBJFile>>X;
OBJFile>>Y;
OBJFile>>Z;

std::cout关于你的程序的一个注意事项——你正在重新创建你所有的顶点数组和程序等等,并且每次调用
Draw
时都重新编译着色器。如果你在主循环中这样做,那就意味着你在每一帧上都要重做,这将是非常缓慢的。GL对象的全部要点是你在当程序启动时,然后每次绘制时重复使用它们。因此,您的
draw
函数应为:

void Mesh::Draw() {
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBindVertexArray(VAO);
    glUseProgram(shader_programme);
    glDrawArrays(GL_TRIANGLES, 0, 3);
}

所有其余的设置内容都应该在构造函数中。

我怀疑您调试了它,一直关注变量和指针值,不是吗?您所说的“if I x out the console”错误是什么意思,而不是通过在末尾输入我的人工暂停(getchar())让程序正常运行我按下窗口上的X。你知道,最小化,最大化,X。@Nooble仅供参考,如果向量为空,这是未定义的行为:
&顶点.front()
@Nooble-
我试图将其缩小到我认为导致0xFEEEFEEE违规的原因
您是否在调试器下运行此程序,如果它崩溃,请查看调用堆栈以查看导致错误的函数?另外,请查看指向Microsoft幻数错误的链接:错误超过l我希望您正在访问MS运行时已标记为“已释放”的内存。
void Mesh::Draw() {
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBindVertexArray(VAO);
    glUseProgram(shader_programme);
    glDrawArrays(GL_TRIANGLES, 0, 3);
}