Поэтому я пытался воспроизвести этот пример совместного использования контекста из glfw с glfw, glew и opengl в c ++: https://github.com/glfw/glfw/blob/master/examples/sharing.c.
Во втором окне не отображается ничего, кроме цвета фона, который был установлен независимо в контексте каждого окна, все программы vao, vbo и shader также были связаны в каждом контексте независимо, но основные ресурсы были сгенерированы и заполнены только в первом окне. В контексте (который скрывает все программы VBO, VAO и Shader), эта программа должна показывать красный треугольник на белом фоне в первом окне и красный треугольник на черном фоне во втором окне, но, как указано перед вторым окно не показывает треугольник, хотя все ресурсы для его рисования были связаны до того, как сделать это из контекста первого окна, код довольно большой и содержит некоторую ненужную информацию, поэтому я сделал представление псевдокода:
Initialize glfw
Make win and win2 objects
Set win's context to opengl
Create window of win with the parameters that were set
Make opengl use win's context ( glfwMakeContextCurrent(win) )
Initialize and handle glew
//In the win opengl context
//Triangle shape
/// Note: I don't use indicies for this since it's overkill
GLuint vertArrayID;
glGenVertexArrays(1, &vertArrayID);
glBindVertexArray(vertArrayID);
//Triangle position data
static const GLfloat vertex_positions_data[] = {
-1.0f, -1.0f,
0.0f, 1.0f,
1.0f, -1.0f,
};
GLuint vertexPositionBufferID;
glGenBuffers(1, &vertexPositionBufferID);
glBindBuffer(GL_ARRAY_BUFFER, vertexPositionBufferID);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_positions_data), vertex_positions_data, GL_STATIC_DRAW);glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, (void*) 0);
// Shaders
const std::string vs = std::string("#version 330 core\n") +
std::string("layout(location = 0) in vec2 vertPos;\n")+
std::string("\n")+
std::string("void main(){\n")+
std::string("gl_Position = vec4(vertPos, 1, 1);\n")+
std::string("}\n");
const std::string fs = std::string("#version 330 core\n") +
std::string("out vec3 color;\n")+
std::string("\n")+
std::string("void main(){\n")+
std::string("color = vec3(1, 0, 0);\n")+
std::string("}\n");
GLuint programID = loadVertexAndFragmentShaders(vs, fs); // Compile link and create the program from the shaders
glUseProgram(programID);
glClearColor(255, 255, 255, 255);
//------------------------------------------------------------------------------------------------------------------
Set win2's context to opengl
Set win2 to share it's context with win
Create the window of win2 with the parameters that were set
Make opengl use win2's context ( glfwMakeContextCurrent(win2) )//In the win2 opengl context that dosen't have anything bound but has all the data that is shared from win's context ( i think )
//------------------------------------------------------------------------------------------------------------------
glBindVertexArray(vertArrayID); // Here was were i discovered the error thanks to the approved answer ( vao's don't get shared between contexts )
glBindBuffer(GL_ARRAY_BUFFER, vertexPositionBufferID);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, (void*) 0);
glUseProgram(programID);
glClearColor(0, 0, 0, 255);
//------------------------------------------------------------------------------------------------------------------
Render win and win2 by using glDrawArrays while on their respective context until both windows are closed
glfwTerminate();
Если вам нужен полный исходный код, вот ссылка на основной исходный файл: https://gitlab.com/Error1000/MWH/blob/master/src/OpenGLTest.cpp.
Постскриптум Извините, если код плохой, я все еще немного учусь, также извините за мой английский, это не мой родной язык и за такой большой пример, также, если вы обнаружите какие-либо проблемы в псевдокоде, пожалуйста, проверьте источник и убедитесь, что это проблема с кодом, а не с моим представлением псевдокода.
Совместное использование контекста OpenGL не охватывает всего, некоторые вещи не являются общими.
Как правило большого пальца:
все виды объектов, которые фактически содержат некоторую форму полезной нагрузки (текстуры, буферные объекты {вершина, пиксель, элемент}, списки отображения), являются общими.
все виды объектов, которые связаны с управлением состоянием (объекты массива вершин, объекты кадрового буфера, объекты сэмплера) не общий.
Держу пари, твой код предполагает совместное использование объектов более позднего типа и не справляется с этим.
Других решений пока нет …