有什么方法可以在 GLSL 中使用 complex/derived 类 吗?

Is there any way to use complex/derived classes in GLSL?

在我的 OpenGL 项目中,我从未在我的 GLSL 着色器中使用自定义结构。到目前为止,我对 mat4,vec4,int 的数组非常满意。在我的最新项目中,我正在考虑添加对多光系统的支持。同样,无论何时需要,我都简单地使用单独的数组来表示灯光位置、颜色等。这显然不方便,但考虑到我过去应用程序的规模,这已经足够了。

不过在我的最新项目中,我认为我必须更多地组织我的数据,因为数组绝对不是那么易于管理,但也不是那么可消耗。总而言之,我知道 GLSL 支持结构,但问题是在我的主要代码中我有更多 "complicated" classes 包含我在 GLSL 着色器中不需要的数据。例如,这是我的主灯 class,它实际上来自一个非常基本的模型 class:

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 着色器。所以我现在的解决方案是提供 class 的简化版本作为结构,它只包含我在着色器中需要的必要信息。这听起来不是一个好的解决方案,因为我实际上必须为我的所有不同模型维护 2 个版本 classes。

public struct SimpleLightStruct
{
    public Vector4 position;
    public Vector3 color;
    public Vector3 ambient;
    public float intensity;
    public float specular;
}

所以我的问题是,这个解决方案是唯一的选择吗?更高级的游戏开发者如何组织他们的数据?

因为我使用 GUI 来修改对象属性,所以我必须以某种方式将属性添加到几乎所有数据 classes 中,这消除了 class 是的,我显然无法解释 OpenGL 回调的 class 大小,但即使我没有额外的属性,即使名称字段也禁止我对两种用途使用通用结构。

C(因此 OpenGL)不支持 C#。它只支持 C# 的 非常小的 子集。所以在和C打交道的时候API,这就是你要坚持的。

您正在将数据从 C# 封送到 C API,因此您必须遵守这样做的规则。这通常意味着,如果您只想将某些对象直接复制到 C API 的内存中,您需要坚持只使用具有 C 类似物的 C# 结构类型。

具体怎么做取决于您。您可以根据需要将数据存储在 C# 中,然后将其复制到临时对象以转发到 OpenGL 缓冲区对象中。或者您可以存储一个 C 结构数组,它与 C# light 数据并行,您的 C# 数据具有它匹配的 C 结构的索引。或者其他东西。