Хорошо, поэтому я пытаюсь изучить 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);
}
}
Вы проверили, что '! Vertices.empty() &&! Colors.empty()' перед 'GLfloat * Vertices = & vertices [0]' line? – genpfault