Что именно разделяется между двумя NSOpenGLContexts? - PullRequest
4 голосов
/ 29 февраля 2012

Я пытаюсь создать NSOpenGLContext, инициализировать мой механизм рендеринга, затем создать новые NSOpenGLContextex, используя параметр share из первого контекста.Это не работает, и прежде чем я продолжу, что именно разделяется между контекстом?Документация немного освещает это:

Общие контексты совместно используют все объекты текстуры, списки отображения, программы вершин, программы фрагментов и объекты буфера, созданные до и после инициации совместного использования.Состояние объектов также является общим, но не другим контекстным состоянием, таким как текущий цвет, настройки координат текстуры, параметры матрицы и освещения, состояние растеризации и параметры среды текстуры.

Когда я создаю свой первыйNSOpenGLContext, я инициализирую свой механизм рендеринга, который выполняет следующие типы вызовов:

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

1 Ответ

4 голосов
/ 29 февраля 2012

Вызовы функций не передаются по контексту.Только предметы.И только некоторые объекты.

Как правило, объекты, к которым предоставлен общий доступ, - это объекты, которые, очевидно, было бы непозволительно создавать заново в другом контексте.Либо из-за хранения большого количества данных, либо относительно длительного времени установки.

Если вам нужен список, вы можете использовать следующие объекты:

  • Отображать списки
  • Текстуры
  • Renderbuffers
  • Буферные объекты
  • Шейдеры и программы

Известные объекты, которые не являются общими:

  • Объекты массива вершин (входящие в них буферные объекты являются общими, но не сам объект)
  • Объекты кадрового буфера (как и в VAO, только те объекты, которые входят в них, являются общими)

Общий объект означает, что он поддерживает все состояния в разных контекстах.Поэтому, если вы измените состояние из одного контекста, вы увидите его в другом.Однако это также означает, что вы должны синхронизировать ваш доступ к общим объектам GL, если вы используете несколько потоков.В противном случае могут возникнуть условия гонки и другие неприятности.

...