Мой фон: Я впервые начал экспериментировать с 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 и другие матрицы, а затем извлекать текущую матрицу и передавать ее в виде униформы в шейдер? Таким образом, не будет необходимости использовать стороннюю матричную библиотеку.