9

Вопрос по opengl, directx – Почему OpenGL изначально разрабатывался как конечный автомат? [Закрыто]

Во время моего опыта OpenGL я часто забывал устанавливать некоторые состояния. Поэтому я считаю, что конечный автомат сегодня не может быть хорошим дизайном. Но теперь это должно быть совместимо. И я также знаю, что DirectX также был конечным автоматом в первые дни. Я'Хотелось бы узнать, почему OpenGL, так же как и DirectX, изначально разрабатывался как конечный автомат?

<span>При использовании конечного автомата вы должны передавать меньше аргументов при каждом вызове (хотя вам, возможно, придется делать больше вызовов, если вы часто делаете это). Если вы посмотрите на то, как вещи развивались с течением времени,Теперь о командных потоках, то есть отправке блоков данных для изменения состояния, а не вызове множества небольших функций изменения состояния.</span>

Mar 04, 2013, 4:01 AMотRobinson

2ответа

23

Это'не ясно, что люди имеют в виду, когда они имеют в виду "Государственный аппарат", поскольку они никогда не объясняют, что является противоположностью. Так что я'поговорим об этом как в целом, так и конкретно с точки зрения OpenGL "Государственный аппарат" против текущего D3D "не конечный автомат ".

И OpenGL, и Direct3D используют глобальное состояние. Каждая команда рендеринга требует, чтобы вы установили группу состояний.

Чтобы выполнить рендеринг в обоих API, вы должны установить группу глобальных состояний. Вы должны установить, какие шейдеры высобираюсь использовать. Вы должны установить текущие параметры, с которыми вы хотите использовать эту форму. Если ты'Если вы используете текстуры, вам нужно их настроить. Вам необходимо установить текущие параметры окна просмотра. И так далее.

Причина дляэтот вид "Государственный аппарат" это просто: этоS, как аппаратное обеспечение обычно работает.

Каждый бит состояния представляет некоторые регистры в графическом процессоре. Эти регистрыявляются государственными, Шейдеры должны быть загружены для рендеринга. Вам необходимо установить регистры области просмотра. Вам нужно указать, какая адресация текстур регистрирует васповторное использование. И так далее. Таким образом, API являются конечными автоматами, потому чтоGPU это конечный автомат.

Вымог представьте, что это будет сделано командой рендеринга. Но только посмотрите, сколько объектов вымне нужно пройти. Вы'Я должен передать кучу шейдеров, кучу текстур, данные вершин, буфер кадров, настройки окна просмотра, настройки смешивания и т. д.

Вместо этого API-интерфейсы заставляют вас делать то же, что и GPU. Вы устанавливаете все это заранее.

Плюс, это делает APIБыстрее, Зачем? Потому что теперь API знает, в каком вы состоянииповторное использование. Если вы хотите визуализировать, скажем, разные части одной сетки с разными текстурами, вы можете оставить кадровый буфер, область просмотра, данные вершин и т. Д. Одинаковыми. Единственное, что вы меняете между ними, это то, какие текстуры вы используете.

Если вы использовали какой-то гигантский вызов Draw с десятками параметров, теперь API должен посмотреть на каждый параметр, чтобы увидеть,такой же, как ваш последний колл И если этоНет, он должен обновлять регистры GPU.

Теперь о разнице между OpenGL и D3D. В этом случае разница в том, как они относятся к объектам.

D3D основан на объектах, поскольку функции, которые изменяют объекты, принимают объект в качестве параметра. Кроме того, большинство объектов D3Dнеизменный; как только вы их создадите, вы можетеизменить большинство своих настроек. Как только вы создадите текстуру определенного размера, формата и т. Д.,сделано. Вы можете'перераспределить его с другим размером / форматом / и т. д., не удаляя объект и не создавая новый.

OpenGL основан на состоянии. Это означает, что функции OpenGL, которые изменяют объекты (по большей части), не принимают объект, с которым работают, в качестве параметров.

Это недизайн" столько, сколько просто OpenGL 'строгое соблюдение обратной совместимости. Объекты в OpenGL - это просто фрагменты глобального состояния; тот'как онипереопределено. Зачем?

Потому что изначально, в OpenGL 1.0,не было никаких объектов (кроме отображения списков). Да даже необъекты текстуры, Когда они решили, что это глупо и им нужны объекты, они решили реализовать их обратно совместимым способом. Все уже использовали функции, которые работали на глобальном состоянии. Поэтому они просто сказали, что, связывая объект, вы переопределяете глобальное состояние. Те функции, которые раньше меняли глобальное состояние, теперь меняют объектсостояние

Таким образом, они могли бы вводить объекты в API, не вводя при этом кучу новых функций, которые работают только с объектами. Таким образом, код, который работал раньше, мог работать с объектами только с незначительными изменениями, вместо принудительного переписывания кода. Это также означает, что если им нужно будет ввести новые функции, которые работают с текстурами, они будут работать са также без предметов. Таким образом, он был как обратно, так и вперед совместим.

Большинство объектов OpenGL работают таким образом: если вы хотите изменить их, вы должны связать их, а затем изменить "Глобальный" государство.

9

Отhttp://www.cs.tufts.edu/research/graphics/resources/OpenGL/OpenGL.htm:

Причина, по которой OpenGL работает как конечный автомат, состоит в том, чтобы избежать необходимости передавать много аргументов при каждом вызове функции.

Минимальный аргумент прохождения

Связь между прикладной программой и OpenGL должна в конечном итоге проходить через шину данных рабочей станции к графическому оборудованию. Шина данных, как правило, намного медленнее, чем процессор рабочей станции и графическое оборудование, и поэтому часто может быть узким местом в высокоскоростной графике. Чтобы поддерживать максимально возможную скорость, OpenGL передает как можно меньше аргументов в своих вызовах функций, что можно увидеть, просмотрев документацию OpenGL. Все вызовы предполагают, что многие внутренние переменные были предварительно установлены в значения, которые вы хотите.

RelatedQuestions