Это менее мольба о помощи в решении проблемы и еще вопрос о чем-то особенном, обнаруженном после решения проблемы. Я работал над своей игрой OpenGL для начинающих и пытался написать дружественный файл OOP. Все данные vbo хранились в классе модели, где он был загружен и буферизирован в конструкторе.Конструктор, вызванный в неподходящее время
Значительно упрощенная структура этого из магистрали будет выглядеть примерно так:
int main(){
vector <Model> Models;
Graphics.GLInit();
Models.push_back(Model(vertices,texcoords,36,0));
Graphics.EnableAttributePointers();
main loop
{
Graphics.draw(Models,Textures,Entities);
}
return 0;
}
Конструктор выглядел как:
Model::Model(vector <vec3> &vertices,vector <vec2> &texcoords,int NumVertices,int StartVertex)
{
iNumVertices=NumVertices;
iStartVertex=StartVertex;
Vertices=vertices;
Texcoords=texcoords;
glGenBuffers(1,&vboVertex);
glGenBuffers(1,&vboTexcoord);
glBindBuffer(GL_ARRAY_BUFFER,vboVertex);
glBufferData(GL_ARRAY_BUFFER,Vertices.size()*12,Vertices.data(),GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER,vboTexcoord);
glBufferData(GL_ARRAY_BUFFER,TexCoord.size()*8,TexCoord.data(),GL_STATIC_DRAW);
}
После вызова glDrawArrays в функции рисования ошибки сегментации будет происходить:
0xC0000005 cannot access 0x00000000 yadda yadda.
Так что я проверил все бесчисленное количество времени чтобы убедиться, что все это имеет смысл. В конце концов я разорвал программу, сделав более простую версию, в которой тот же самый точный код используется без класса модели. Это сработало хорошо. Выяснив, что что-то не так с классом Model, я в конечном итоге поместил буферный код в отдельную функцию, которая будет вызываться непосредственно после конструктора. Это фиксировало это.
В любом случае, все это ставит вопрос о том, почему конструктор, казалось бы, был вызван из последовательности; перед кодом GLInit. Это или есть некоторые поведенческие причуды конструкторов, о которых я не знаю, в которых конечный автомат OpenGL не может быть соответствующим образом модифицирован ими по какой-то причудливой причине. Мои знания о C++ - это только уровень свободного времени для свободного времени, так что я пропущу что-то очевидное здесь?
Где находится 'Models.push_back (Model (vertices, texcoords, 36,0));' called? Согласно вашему коду он находится вне любой области, поэтому он не будет компилироваться. – Jack
Весь этот код выполняется в основном. «значительно упрощенная структура этого от main ...« В любом случае, отредактировал это, чтобы быть более ясным. –
Можете ли вы опубликовать SSCCE? –