2014-09-21 4 views
-1

Это довольно огромная программа, поэтому я попробовал, чтобы сузить ее до того, что, по моему мнению, вызывает нарушение на 0xFEEEFEEE. Хотя огромная программа (по количеству строк в любом случае), она делает довольно простую вещь: нарисуйте треугольник с помощью OpenGL. Следует отметить, что программа, по-видимому, вызывает только нарушение прав доступа, если я выхожу из консоли, полагая, что она не разрушает должным образом.Почему это вызывает нарушение прав доступа?

Заголовок:

#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 

каст:

#define GLEW_STATIC 

#include <GL\glew.h> 
#include <glm\glm.hpp> 

#include <iostream> 
#include <fstream> 
#include <string> 

#include "Mesh.h" 

Mesh::Mesh(std::string FileName) 
{ 
    float X; 
    float Y; 
    float Z; 

    int LoopCount = 1; 
    int VerticesCount = 0; 

    std::string Input; 

    std::ifstream OBJFile; 
    OBJFile.open(FileName); 

    while (!OBJFile.eof()) 
    { 

     OBJFile >> Input; 

     if (Input == "v") 
     { 
      OBJFile >> X; 
      OBJFile >> Y; 
      OBJFile >> Z; 

      std::cout << "Loaded in " << X << " for X # " << LoopCount << std::endl; 
      std::cout << "Loaded in " << Y << " for Y # " << LoopCount << std::endl; 
      std::cout << "Loaded in " << Z << " for Z # " << LoopCount << std::endl; 

      Vertices.push_back(X); 
      Vertices.push_back(Y); 
      Vertices.push_back(Z); 

      LoopCount++; 
      VerticesCount = VerticesCount + 3; 
     } 
     else 
     { 
      std::cout << "In loading " << FileName << " " << "skipped " << Input << std::endl; 
      continue; 
     } 

    } 

} 

Mesh::~Mesh() 
{ 
    std::cout << "Deconstructed" << std::endl; 
} 

void Mesh::Draw() 
{ 

    glGenBuffers(1, &VBO); 
    glBindBuffer(GL_ARRAY_BUFFER, VBO); 
    glBufferData(GL_ARRAY_BUFFER, Vertices.size() * sizeof(float), &Vertices.front(), GL_STATIC_DRAW); 

    glGenVertexArrays(1, &VAO); 
    glBindVertexArray(VAO); 
    glEnableVertexAttribArray(0); 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); 

    GLuint vs = glCreateShader(GL_VERTEX_SHADER); 
    glShaderSource(vs, 1, &VertexShader, NULL); 
    glCompileShader(vs); 
    GLuint fs = glCreateShader(GL_FRAGMENT_SHADER); 
    glShaderSource(fs, 1, &FragmentShader, NULL); 
    glCompileShader(fs); 

    GLuint shader_programme = glCreateProgram(); 
    glAttachShader(shader_programme, fs); 
    glAttachShader(shader_programme, vs); 
    glLinkProgram(shader_programme); 

    glUseProgram(shader_programme); 
    glDrawArrays(GL_TRIANGLES, 0, 3); 
} 

тогда я Mesh myMesh, а затем в моем главном цикле Mesh.draw()

+0

Я подозреваю, что вы отлаживали его, сохраняя при этом значения переменных и указателей, не так ли? –

+0

Что вы подразумеваете под словом «if I x out the console» – bjskishore123

+0

Err, вместо того чтобы пропускать программу нормально, введя мою искусственную паузу в конце (getchar()) Я нажимаю кнопку X в окне. Вы знаете, свести к минимуму, maximixe, X. – Nooble

ответ

1

Одно замечание о вашей программе - вы воссоздавать все ваши вершинных массивов и программ и таких и перекомпиляции шейдеров каждый раз, когда вы вызываете Draw. Если вы делаете это в своем основном цикле, это означает, что вы переделываете его на каждый кадр, который будет очень медленным. целая точка объектов GL состоит в том, что вы устанавливаете их раз при запуске программы, а затем повторно используете их каждый раз, когда вы рисуете. Так что ваша Draw функция должна быть:

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

Все остальные вещи настройки должны быть в конструкторе.

Смежные вопросы