Pergunta

Estou tentando criar um NSOpenGLContext, inicializar meu mecanismo de renderização e, em seguida, criar novos NSOpenGLContexts usando o parâmetro share do primeiro contexto.Isso não funciona e, antes de continuar, o que exatamente é compartilhado entre um contexto?A documentação é um pouco clara sobre isso:

Os contextos compartilhados compartilham todos os objetos de textura, listas de exibição, programas de vértices, programas de fragmentos e objetos de buffer criados antes e depois do início do compartilhamento.O estado dos objetos também é compartilhado, mas não outro estado de contexto, como cor atual, configurações de coordenadas de textura, configurações de matriz e iluminação, estado de rasterização e configurações de ambiente de textura.

Quando crio meu primeiro NSOpenGLContext, inicializo meu mecanismo de renderização, que faz os seguintes tipos de chamadas:

  • glGenTextures, glActiveTexture, glBindTexture
  • glEnable
  • glUseProgram, glGetAttribLocation, glGetUniformLocation
  • glUniform1i, glUniform3f
  • glGenVertexArraysAPPLE, glBindVertexArrayAPPLE, glBindBuffer
  • glVertexAttribPointer, glEnableVertexAttribArray

A maioria deles é para três tipos de tarefas - criação de programas de vértices e sombreadores, armazenamento de referências a atributos e locais uniformes dentro dos programas, criação de matrizes de vértices e ligação de algumas texturas.

Você esperaria que todos esses itens fossem compartilhados entre contextos?

Foi útil?

Solução

As chamadas de função não são compartilhadas entre contextos.Apenas objetos.E somente alguns objetos.

Em geral, os objetos que são compartilhados são aqueles que seria obviamente proibitivo recriar em outro contexto.Seja devido ao armazenamento de muitos dados ou ao tempo de configuração relativamente longo.

Se você quiser uma lista, os seguintes objetos serão compartilhados:

  • Listas de exibição
  • Texturas
  • Renderbuffers
  • Objetos buffer
  • Shaders e programas

Objetos notáveis ​​que não são compartilhados:

  • Objetos de matriz de vértices (os objetos de buffer que estão neles são compartilhados, mas não o objeto em si)
  • Objetos Framebuffer (como acontece com VAOs, apenas as coisas que estão neles são compartilhadas)

Um objeto sendo compartilhado significa que ele mantém todo o estado nos contextos.Portanto, se você modificar o estado de um contexto, você o verá no outro.No entanto, isso também significa que você deve sincronizar seu acesso a objetos GL compartilhados se você estiver usando vários threads.Caso contrário, poderão ocorrer condições de corrida e outros males.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top