C# 有没有办法在GLSL中使用复杂/派生类?

C# 有没有办法在GLSL中使用复杂/派生类?,c#,opengl,glsl,opentk,C#,Opengl,Glsl,Opentk,在我的OpenGL项目中,我从未在GLSL着色器中使用自定义结构。到目前为止,我对mat4、vec4、int的数组都非常满意。在我的最新项目中,我正在考虑增加对多灯光系统的支持。无论何时需要,我都会简单地使用单独的数组来表示灯光位置、颜色等。这显然不方便,但考虑到我过去申请的规模,这已经足够了 但在我的最新项目中,我认为我必须对数据进行更多的组织,因为数组绝对不是那么容易管理,也不是那么容易消耗。说到这里,我知道GLSL支持结构,但问题是在我的主代码中,我有一个更“复杂”的类,其中包含GLSL着

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

public struct SimpleLightStruct
{
    public Vector4 position;
    public Vector3 color;
    public Vector3 ambient;
    public float intensity;
    public float specular;
}
所以我的问题是,这个解决方案是唯一的选择吗?更高级的游戏开发者如何组织他们的数据

由于我使用GUI来修改对象属性,因此我必须以某种方式将属性添加到几乎所有的数据类中,这就剥夺了类的所有简单性,我显然无法解释OpenGL回调的类大小,但即使我没有额外的属性,甚至名称字段也禁止我在这两种用途中使用公共结构。

C(因此OpenGL)不会说C。它只讲C#的一小部分。因此,当与C API交互时,这就是您必须坚持的

您正在将数据从C#封送到C API,因此必须遵循相关规则。这通常意味着,如果您只想将某个对象直接复制到C API的内存中,那么只需要使用具有C类似物的C#struct类型


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

“有没有办法在GLSL中使用复杂/派生类?”-简短回答:没有。@rabbi76所以只有为同一类使用2个版本?GLSL不支持类。glsl有结构,就是这样。见,第页33@GregK.:“我完全不知道如何将此直接用于GLSL着色器。”你不能。您将它声明为一个
,因此不能将其传递给像OpenGL这样的C API。@NicolBolas这就是我在这里要强调的。即使我确实使用了结构,比如说字符串字段,我也能直接使用结构吗?所以据我所知,没有“指示性”的方法来做这样的事情。这再次取决于程序员来决定哪种方法是最好的。这正是我想知道的。谢谢