Фиксированная функция Vs. Шейдеры - помогите понять концептуальные различия - PullRequest
8 голосов
/ 26 августа 2011

Мой фон: Я впервые начал экспериментировать с OpenGL несколько месяцев назад, без особой цели, просто для удовольствия. Я начал читать RedGL Redbook и достиг планетарной системы с большим количеством различного освещения. Это продолжалось в течение месяца, и мой интерес к openGL исчез. Он снова проснулся неделю назад или около того, и, как я понял из некоторых публикаций SO, справочник устарел, и OpenGL Superbible является лучшим источником для обучения. И я начал читать. Мне нравится концепция шейдеров, но в моем мозгу происходит настоящий беспорядок из-за перехода от моих старых воспоминаний о фиксированном конвейере и новой концепции шейдеров.

Вопрос: Я хотел бы написать несколько утверждений, которые я считаю верными, и я прошу экспертов OpenGL проверить их (то есть, правильно ли я понимаю, не совсем правильно или абсолютно неправильно). Итак ...

1) Если мы не используем любую шейдерную программу, ничего не изменится. У нас есть текущий цвет, текущая нормаль, текущая матрица преобразования, текущее все, и как только мы вызываем glVertex**(...), эти текущие значения берутся, и вершина подается на ... Я не знаю, что. Дело в том, что он трансформируется с помощью текущей матрицы, к ней применяются текущий цвет и нормаль и т. Д.

2) Как только мы используем шейдерную программу, все вышеперечисленное перестает работать. То есть glColor, glRotate и т. Д. Не имеют смысла (не так ли?). Я имею в виду, glColor все еще устанавливает текущий цвет, glRotate все еще умножает текущую матрицу на матрицу вращения, но они не используются вообще. Вместо этого мы добавляем атрибуты вершин на glVertexAttrib. Какой атрибут означает, что полностью зависит от нашего вершинного шейдера и привязки переменной in. Мы также находим, что ANS устанавливает значения униформ, а затем вызывает glVertex, и шейдер выполняется (я не знаю сразу или после вызова glEnd ()). Фактическая обработка вершин и фрагментов выполняется полностью вручную в программе шейдера.

3) Шейдеры ничего не добавляют к глубинному тестированию. То есть мне не нужно заботиться об этом в шейдере. Я просто звоню glEnable(GL_DEPTH_TEST). Не влияет и отбор лица.

4) В шейдерах не нужно заботиться об альфа-смешивании и сглаживании. glEnable звонков будет достаточно.

5) Является ли хорошей идеей использовать функции gluPerspective, glRotate, glPushMatrix и другие матрицы, а затем извлекать текущую матрицу и передавать ее в виде униформы в шейдер? Таким образом, не будет необходимости использовать стороннюю матричную библиотеку.

Ответы [ 2 ]

6 голосов
/ 26 августа 2011
  1. Это зависит от того, о какой версии OpenGL вы говорите. До OpenGL 3.0 все фиксированные функциональные возможности все еще присутствуют, так что да, если вы решите просто использовать фиксированные функциональные возможности, они продолжат работать, как всегда. Начиная с версии 3.0, значительная часть исправленного конвейера устарела, а с версии 3.1 она полностью исчезает. Используя их, у вас больше нет возможности просто использовать фиксированный конвейер.

  2. Опять же, это зависит. Например, до OpenGL 3.0, glColor по-прежнему поддерживается, даже если вы используете шейдер. Разница в том, что вместо того, чтобы автоматически применяться к тому, что рисуется, оно подается в ваш шейдер, который может использовать его без изменений, изменять его по своему усмотрению или полностью игнорировать. Итак, ваш фрагментный шейдер получает gl_FrontColor и gl_BackColor и записывает фактический цвет фрагмента в gl_FragColor. Если вы используете OpenGL 3.1 или новее, однако, glColor (например) просто больше не существует - цвет будет просто еще одним значением, которое вы предоставляете своему шейдеру, как если бы вы могли / могли бы что-нибудь еще.

  3. Это верно, по крайней мере, до OpenGL 3.1. Начиная с 4.0, появился новый вычислительный шейдер, который (я считаю) может участвовать в таких вещах, как глубинное тестирование (но я не использовал его, поэтому я немного не уверен в этом).

  4. Да, вы все еще можете использовать встроенное альфа-смешение. В зависимости от вашего оборудования вы также можете рассмотреть возможность использования расширения gl_ARB_draw_buffers_blend (которое является обязательным для OpenGL 4, если я правильно помню).

  5. Опять же, это зависит от версии OpenGL, о которой вы говорите. Текущий OpenGL полностью исключает любую поддержку матриц, поэтому у вас нет выбора, кроме как использовать какую-то другую матричную библиотеку. Более старые версии предоставляли такие вещи, как gl_ModelViewMatrix и gl_NormalMatrix для вашего шейдера в виде униформы, чтобы вы могли пойти по этому пути, если захотите.

1 голос
/ 26 августа 2011

2) В современном OpenGL нет glColor, glBegin, glVertex, glRotate и т. Д., Поэтому они не имеют смысла.

5) В современном OpenGL нет встроенных матриц, поэтомунужно использовать стороннюю библиотеку или написать свою.Поэтому, чтобы ответить на ваш вопрос, нет, это не очень хорошая идея.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...