Как правильно сделать это в OpenGL 3.x? - PullRequest
4 голосов
/ 28 августа 2011

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

Я пытаюсь написать простой пример OpenGL 3.x, чтобы узнать, как работает новый программируемый конвейер (шейдеры). Это учебное пособие действительно полезно (и, как вы можете видеть, использует перенасыщенность для простоты) и прекрасно в качестве отправной точки. Но кошмар и вопросы начинаются , когда я пытаюсь использовать предопределенные объекты перенасыщения (например, чайники) и пытаюсь перемещаться или вращаться локально, как старый и устаревший способ (glScalef, glTranslatef, glRotatef, glLoadIdentity, glMultMatrixf, glPushMatrix и glPopMatrix ...), но пока это невозможно для меня.

Если я пытаюсь сделать это, используя удобную матрицу преобразования с переводом, она перемещает всю сцену глобально (два или более объекта вращаются, не только один, то есть), но не локально. Я нашел этот вопрос здесь, но все еще в беспорядке ... ( работает только с vbos? У каждого объекта в сцене должен быть уникальный шейдер? , .. .)

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

Ответы [ 2 ]

12 голосов
/ 28 августа 2011

Я предполагаю, что когда вы говорите «OpenGL 3.x», вы имеете в виду ядро ​​OpenGL 3.1 или выше . То есть вы не используете контекст совместимости.

Во-первых, вы не можете больше использовать предопределенные объекты GLUT. Также вы не можете использовать предопределенные объекты Glu. Если это слишком большое ограничение для вас, тогда я предлагаю вам создать контекст совместимости.

Причина, по которой все ваши объекты движутся, заключается в том, что вы не сбросили форму между рисованием двух объектов. Униформа - это данные в шейдерах, которые установлены из OpenGL, но не будут меняться при многократном выполнении шейдера в течение одного вызова glDraw*. Матричные функции в предыдущих версиях GL эффективно устанавливают эквивалент униформ. Так что просто конвертируйте эти функции в единую настройку.

Если вы хотите посмотреть серию учебников, в которых используется ядро ​​GL 3.x, вы можете посмотреть мою серию учебников .

3 голосов
/ 29 августа 2011

Ключевым моментом здесь является то, что вам нужно поддерживать свою собственную трансфигурационную иерархию. glPushMatrix создает копию текущей матрицы в активном стеке, затем вы применяете некоторое преобразование, которое применяется к стеку. Затем, рисуя вещи, они получат эту трансформацию. glPopMatrix поднимается на один шаг вверх по иерархии.

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

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