Между картиной и "камерой" у меня есть места, где я бы хотел вести себя как оптический объектив:
Это сложный вопрос. Во-первых, нужно понимать, что OpenGL - это так называемый растеризатор модели локализованного рендеринга , что в терминах непрофессионала означает, что он работает как карандаш и кисть на холсте.
Таким образом, он работает в отличие от глобальных средств визуализации представлений сцены, таких как raytracers. Raytracer фактически работает на полностью определенной сцене, поэтому он может тривиально преломлять такие вещи, как преломление.
Действительно, к OpenGL нужно относиться так, как художник относится к его инструментам. Поэтому любой оптический «эффект», который вы хотите создать, должен быть реализован путем овладения различными техниками рисования, возможными с помощью инструментов, предлагаемых OpenGL. Чтобы создать желаемый эффект, вы должны реализовать многоступенчатый процесс.
Для рефракции вы сначала визуализируете сцену как «видимую» преломляющим объектом во всех направлениях (вы создаете динамическую карту куба), затем вы используете эту карту куба в качестве входных данных для растеризации «преломляющего» объекта, где шейдер используется для определения преломленного направления луча света, падающего на растеризованные фрагменты.
Кстати: то, что справедливо для преломления, справедливо для любого другого, например, взаимодействующего эффекта. Тени столь же нетривиальны, как преломления в OpenGL.