В моих проектах OpenGL я никогда не использовал собственные структуры в своих шейдерах GLSL.До сих пор я был в порядке с массивами mat4,vec4,int
.В моем последнем проекте я рассматриваю возможность добавления поддержки системы с несколькими источниками света.Опять же, когда это было необходимо, я просто использовал отдельные массивы для светлых позиций, цветов и так далее.Это, очевидно, не удобно, но, учитывая масштаб моих прошлых приложений, этого было достаточно.
В моем последнем проекте, хотя я думаю, что мне придется организовывать свои данные немного больше, потому что массивы абсолютно не так управляемы, но ине так уж и расходно.Кстати, я знаю, что GLSL поддерживает структуры, но проблема в том, что в моем основном коде у меня есть более «сложные» классы с данными, которые мне не нужны в шейдере GLSL.Например, это мой основной класс освещения, который на самом деле является производным от очень простого модельного класса:
public class Model
{
public string name;
public Vector3 position;
public Matrix4 rotationMatrix;
//Many more attributes and properties related to the GUI
}
public class Light: Model
{
public Vector3 color;
public Vector3 ambient;
public float intensity;
public float specular;
}
Учитывая эту структуру данных, я абсолютно не знаю, как использовать это непосредственно в шейдерах GLSL.Поэтому мое решение на данный момент состоит в том, чтобы предоставить упрощенную версию класса в виде структуры, которая содержит только необходимую информацию, необходимую мне в шейдерах.Это не кажется хорошим решением, потому что мне придется практически поддерживать 2 версии для всех моих разных классов моделей.
public struct SimpleLightStruct
{
public Vector4 position;
public Vector3 color;
public Vector3 ambient;
public float intensity;
public float specular;
}
Итак, мой вопрос, является ли это решение единственным вариантом?Как более продвинутые разработчики игр организуют свои данные?
Поскольку я использую графический интерфейс пользователя для изменения свойств объекта, мне нужно каким-то образом добавить свойства почти ко всем моим классам данных, и это отнимает всепростота классов, я не могу, очевидно, учитывать размеры классов для обратных вызовов OpenGL, но даже если у меня не было дополнительных свойств, даже поле имени не позволяет мне использовать общую структуру для обоих применений.