2014-03-13 4 views
0

Хорошо, поэтому я пытаюсь изучить OpenGL. Я успешно выполнил пример, чтобы отобразить треугольник. Поэтому я попытался двигаться дальше, и вместо использования вершин, представленных в примере, я попытался прочитать в вершинах из файла (произвольное количество вершин). Поскольку он произволен, я читаю в std::vector, а затем попытаюсь присвоить его массиву, чтобы перейти к glBufferData. FWIW, я хочу нарисовать GL_LINE_STRIP, а не GL_TRIANGLES. Моя программа работает на второй, затем во всплывающем окне с появляется сообщение об ошибке:OpenGL VBO Troubles

Debug assertion failed... то говорит ...Expression: vector subscript out of range

код я собираюсь опубликовать это пример программы, которая делает треугольник, однако, я прокомментировал мою попытку чтения из файла (код, который дает мне ошибку). Таким образом, вы можете видеть, где это происходит. Единственное, что действительно изменилось в MY-версии, это изменение жестко закодированных вершин в массиве, которое должно считываться с ввода, а затем в функции drawArray я меняю GL_TRIANGLES на GL_LINE_STRIP. Я знаю, что делаю что-то очень глупое, и я его пропускаю, меня просто путают с немедленным режимом в OpenGL (экстремальный нуб, который я знаю). ИНАЧЕ, вот код:

void CreateVBO(void) 
{ 
/* 
string line; 
int count = 0; 
vector<GLfloat> vertices; 
vector<GLfloat> colors; 

ifstream myfile("C:\\Users\\Andrew\\Documents\\Visual Studio 2013\\Projects\\Control\\Control\\bin\\Debug\\GeoTemp.test"); 
if (myfile.is_open()) 
{ 
    while (getline(myfile, line)) 
    { 
     float temp = (float)atof(line.c_str()); 

     if (count == 3) 
     { 
      vertices.push_back(1.0); 
      colors.push_back(1.0); 
      count = 0; 
     } 
     else 
     { 
      vertices.push_back(temp); 
      colors.push_back(0.0); 
      count++; 
     } 

     //cout << line << '\n'; 
    } 
    myfile.close(); 
} 

GLfloat* Vertices = &vertices[0]; 
GLfloat* Colors = &colors[0]; 
*/ 

GLfloat Vertices[] = { 
    -0.8f, -0.8f, 0.0f, 1.0f, 
    0.0f, 0.8f, 0.0f, 1.0f, 
    0.8f, -0.8f, 0.0f, 1.0f 
}; 

GLfloat Colors[] = { 
    1.0f, 0.0f, 0.0f, 1.0f, 
    0.0f, 1.0f, 0.0f, 1.0f, 
    0.0f, 0.0f, 1.0f, 1.0f 
}; 


GLenum ErrorCheckValue = glGetError(); 

glGenVertexArrays(1, &VaoId); 
glBindVertexArray(VaoId); 

glGenBuffers(1, &VboId); 
glBindBuffer(GL_ARRAY_BUFFER, VboId); 
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW); 
//glBufferData(GL_ARRAY_BUFFER, vertices.size()*sizeof(GLfloat), &vertices[0], GL_STATIC_DRAW); 
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0); 
glEnableVertexAttribArray(0); 

glGenBuffers(1, &ColorBufferId); 
glBindBuffer(GL_ARRAY_BUFFER, ColorBufferId); 
glBufferData(GL_ARRAY_BUFFER, sizeof(Colors), Colors, GL_STATIC_DRAW); 
//glBufferData(GL_ARRAY_BUFFER, colors.size()*sizeof(GLfloat), &colors[0], GL_STATIC_DRAW); 
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, 0); 
glEnableVertexAttribArray(1); 

ErrorCheckValue = glGetError(); 
if (ErrorCheckValue != GL_NO_ERROR) 
{ 
    fprintf(
     stderr, 
     "ERROR: Could not create a VBO: %s \n", 
     gluErrorString(ErrorCheckValue) 
     ); 

    exit(-1); 
} 
} 
+0

Вы проверили, что '! Vertices.empty() &&! Colors.empty()' перед 'GLfloat * Vertices = & vertices [0]' line? – genpfault

ответ

0

Я подозреваю, что ваши vertices/colors векторы пусты, когда вы нажмете эти строки:

GLfloat* Vertices = &vertices[0]; 
GLfloat* Colors = &colors[0]; 

Добавить проверку размера после вашего файла чтения кода:

if(vertices.empty() || colors.empty()) 
{ 
    exit(-1); 
}