GLSL — ничего не делающий вершинный шейдер?

Итак, у меня есть программа opengl, которая рисует группу объектов. Когда я рисую эти объекты, я хочу использовать свою шейдерную программу, являющуюся вершинным шейдером и исключительно вершинным шейдером. По сути, я стремлюсь настроить высоту модели внутри вершинного шейдера в зависимости от расчета текстуры. И это все. В противном случае я хочу, чтобы объект рисовался, как будто с использованием открытого openGL (без шейдеров). Я не хочу реализовывать фрагментный шейдер.

Однако я не смог найти, как сделать так, чтобы у меня была шейдерная программа только с вершинным шейдером и ничем другим. Забыв часть о настройке высоты моей модели, до сих пор у меня есть:

gl_FrontColor = gl_Color;
gl_Position = modelViewProjectionMain * Position;

Он правильно трансформирует объект в правильное положение, однако, когда я это делаю, я теряю координаты текстуры, а также информацию об освещении (теряются нормали). Что мне не хватает? Как написать «ничего не делающий» вершинный шейдер? То есть вершинный шейдер можно было включать и выключать при отрисовке текстурированного .obj с нормалями, и разницы бы не было?


person danglingPointer    schedule 18.05.2014    source источник
comment
Ваш вершинный шейдер ничего не делает фактически gl_Position = ftransform ();. Конечно, это устарело, но ваш вопрос заставляет меня поверить, что это не имеет значения.   -  person Andon M. Coleman    schedule 18.05.2014


Ответы (2)


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

Что вы можете сделать, так это:

glUseProgram(handle)
 // draw objects with shader
glUseProgram(0)
// draw objects with fixed functionality
person Abhishek Bansal    schedule 18.05.2014

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

Из вашего поста под «голым OpenGL» вы подразумеваете конвейер с фиксированными функциями в OpenGL 1 и 2, который включал встроенное освещение и текстурирование. Шейдеры в OpenGL полностью заменяют конвейер фиксированных функций, а не расширяют его. А в OpenGL 3+ старый функционал убрали, так что теперь они обязательны.

Хорошей новостью является то, что вершинные/фрагментные шейдеры, выполняющие ту же функцию, что и оригинальное освещение и текстурирование OpenGL, легко найти и легко модифицировать для своих целей. В книге OpenGL Shading Language, написанной Ростом, Лицеей-Кейном и т. д., есть целая глава «Эмуляция фиксированной функциональности OpenGL». Или вы можете получить копию книги и кода OpenGL SuperBible 5-го издания (не 6-го издания), которая поставляется с кучей полезные предустановленные шейдеры. Или, если вы предпочитаете онлайн-ресурсы книгам, есть учебные пособия NeHe.

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

person Hugh Fisher    schedule 19.05.2014