好的,所以我正在努力学习OpenGL。我已经成功地按照一个例子渲染了一个三角形。因此,我尝试继续前进,而不是使用示例中提供的顶点,而是尝试从文件中读取顶点(任意数量的顶点)。因为它是任意的,所以我读入一个std::vector,然后尝试将它赋给一个数组,以便传递给glBufferData。我想画的是GL_LINE_STRIP,而不是GL_TRIANGLES。我的程序运行了一秒钟,然后显示一个带有错误的弹出窗口:
Debug assertion failed...,然后显示为...Expression: vector subscript out of range
我将要发布的代码是渲染三角形的示例程序,但是,我已经注释掉了从文件中读取的尝试(给我错误的代码)。所以你可以看到哪里出了问题。在我的版本中,唯一更改的是将数组中的硬编码顶点更改为从输入读取,然后在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);
}
}发布于 2014-03-14 03:03:17
我怀疑你的vertices/colors向量是空的,当你点击这些代码行时:
GLfloat* Vertices = &vertices[0];
GLfloat* Colors = &colors[0];在文件读取代码后添加一个大小检查:
if( vertices.empty() || colors.empty() )
{
exit( -1 );
}https://stackoverflow.com/questions/22387741
复制相似问题