Есть ли способ использовать сложные / производные классы в GLSL? - PullRequest
0 голосов
/ 17 июня 2019

В моих проектах 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, но даже если у меня не было дополнительных свойств, даже поле имени не позволяет мне использовать общую структуру для обоих применений.

1 Ответ

1 голос
/ 17 июня 2019

C (и, следовательно, OpenGL) не говорит на C #. Он говорит только о очень маленьком подмножестве C #. Поэтому при взаимодействии с C API вы должны придерживаться этого.

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

Как именно вы это делаете, зависит от вас. Вы можете хранить ваши данные в C # по своему усмотрению, а затем скопировать их во временный объект для пересылки в буферный объект OpenGL. Или вы можете сохранить массив структур C, который параллелен данным C # light, с вашими данными C #, имеющими индекс структуры C, которому они соответствуют. Или другие вещи.

...