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

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

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

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

4
xbelanch 28 Авг 2011 в 20:50

2 ответа

Лучший ответ

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

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

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

Если вы хотите увидеть серию руководств, в которых используется ядро ​​GL 3.x, вы можете посмотреть мою серию руководств < / а>.

12
Nicol Bolas 4 Янв 2020 в 03:36

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

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

3
datenwolf 28 Авг 2011 в 20:10