Я использую шейдеры GLSL в небольшом проекте Java OpenGL, который я делаю, и я пытаюсь создать хорошо написанный объектно-ориентированный способ организации моего кода. До сих пор у меня есть класс под названием Model
, который может содержать несколько сеток, каждый из которых имеет свою собственную текстуру и материал (материал представляет собой набор параметров для описания окружающего, диффузного, зеркального, смешивания и т. Д.). Для этого я понимаю, что каждый раз, когда мне нужно менять материал, я могу передавать однородные переменные в шейдер. Однако рисунок имеет место в методе модели draw()
. Означает ли это, что каждый экземпляр класса Model
должен иметь определенный шейдер, связанный с ним?Несколько шейдеров, объектов и материалов с OOP
Кроме того, у меня есть класс Camera
, который создает матрицу, которая преобразует вершины, имитирует шаг, рыскание и положение камеры. Затем эта матрица должна быть загружена в шейдер в качестве матрицы представлений. Разве это не означает, что мне нужно загрузить эту матрицу в каждый шейдер, который я использую? Так что, если у каждого Model
может быть свой собственный шейдер, как я могу загрузить матрицу просмотра камеры для всех? И даже несмотря на это, разве неэффективно для каждой модели иметь свой собственный шейдер? Если бы вы хотели нарисовать определенную модель много раз, тогда вы должны были бы занять шейдер и загружать матрицу в шейдер каждый раз, когда вы ее нарисовали.
Я действительно изо всех сил пытаюсь найти объектно-ориентированное решение, которое связывает несколько шейдеров, несколько объектов и множество материалов. Любая помощь приветствуется.
Но каждый экземпляр класса модели проявляет себя, поэтому теоретически я мог бы иметь любое количество объектов, выполняющих рендеринг. Было бы лучше написать класс «Renderer», который может принимать и отображать классы «Model»? – Tristram
Да, я так думаю. После того, как ваши сцены будут достаточно сложными, вы захотите отсортировать «Модели с помощью изменений состояния (похожие шейдеры, текстуры и т. Д.), А также объект, который выполняет сортировку, также может быть« Renderer ». Кроме того, это может помочь подумать о многопроходных сценариях, таких как отражения или причудливые световые эффекты (или это может сбивать с толку, и в этом случае просто иметь дело с ним, когда вы приходите к нему :). – chronospoon