Как выполняется затенение фрагментов OpenGL?

У меня есть 3D-объект, который я создал в Maya (и экспортировал в файлы OBJ и MTL), и я создал приложение для просмотра моделей в OGL для его просмотра. Если мои предположения верны (а вы знаете, что они говорят о предположениях...), то, поскольку я не указал свой собственный шейдер GLSL, OGL должен использовать FFP для определения цвета фрагмента для каждого пикселя? Это правильно?

Насколько я понимаю, в FFP должен быть реализован какой-то шейдер по умолчанию, потому что он может отображать зеркальные блики, отражения и т. Д. Может ли кто-нибудь дать мне некоторую информацию об этом и, возможно, сказать мне, как это затенение делается?

Я понимаю, что определения материалов используются для установки свойств материалов объектов, но я не уверен, как получить окончательные эффекты света, взаимодействующего с отображением материала в окне OGL, без указания шейдера вручную (отсюда мое убеждение что есть какой-то шейдер по умолчанию).


person Sonoman    schedule 08.12.2010    source источник


Ответы (1)


В случае графических процессоров 3-го поколения и более поздних все ваши предположения действительно верны. Пока не указан пользовательский шейдер, драйвер предоставляет графическому процессору шейдер по умолчанию, имитирующий FFP.

Шейдер по умолчанию обычно реализует модель освещения Фонга с точными деталями, зависящими от установленных параметров текстурной среды и тому подобного.

Для старых поколений графических процессоров фиксированный конвейер функций является аппаратным.

person datenwolf    schedule 08.12.2010
comment
Спасибо! Я искал несколько дней этот ответ! Я не могу понять, почему эта информация так трудно найти! Включен ли этот шейдер по умолчанию в используемую вами библиотеку OpenGL (JOGL или LWJGL) или он находится где-то еще? Я также предполагаю, что для имитации материала Ламберта нужно просто отключить все настройки отражения в контексте GL? - person Sonoman; 08.12.2010
comment
Этот шейдер по умолчанию обычно поставляется с драйвером. OpenGL, вопреки тому, что предполагает название, не является библиотекой как таковой (конечно, вы ссылаетесь на какую-то библиотеку). Это API для драйвера, и поэтому драйвер также отвечает за реализацию значения по умолчанию. Эмуляция материала Ламберта происходит путем установки компонента GL_SPECULAR материала на 0. - person datenwolf; 08.12.2010
comment
Кстати, эта информация довольно четко указана в спецификации OpenGL. - person datenwolf; 08.12.2010
comment
Возможно, вы могли бы указать мне направление этой информации? Прочитав спецификацию, она кажется мне довольно расплывчатой. Когда текущий программный объект фрагментного шейдера включает в себя фрагментный шейдер, его фрагментный шейдер считается активным и используется для обработки фрагментов. Если программный объект фрагментного шейдера не имеет фрагментного шейдера или программный объект фрагментного шейдера не используется в настоящее время, результаты выполнения фрагментного шейдера не определены. Кажется, там ничего не упоминается о значениях по умолчанию. Возможно, я ищу не в том месте? Хотя еще раз спасибо за ответ! - person Sonoman; 08.12.2010
comment
OpenGL разделяет шейдеры на две части: объекты шейдера, определяющие части полной шейдерной программы, и сама программа. Думайте, что шейдеры любят файлы .obj всей шейдерной программы. И точно так же, как при компиляции исполняемого файла, если объект отсутствует, весь исполняемый файл не определен. Вы также можете иметь в виду OpenGL 4, который действительно требует от вас предоставления достаточного количества шейдеров. Однако в основном по-прежнему используются OpenGL-1.2 и OpenGL-2. Приведение к шейдеру по умолчанию определяется где-то между версиями 2.1 и 3.1 IIRC. - person datenwolf; 08.12.2010