在我的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;
}
所以我的问题是,此解决方案是唯一的选择吗?更多高级游戏开发商如何组织他们的数据?
由于我使用GUI来修改对象属性,因此我不得不以某种方式将Properties添加到几乎所有数据类中,这剥夺了类的所有简单性,我显然不能考虑类OpenGL回调的大小,但是即使我没有额外的属性,即使name字段也禁止我同时使用通用结构。
答案 0 :(得分:1)
C(因此OpenGL)不讲C#。它只说C#的很小子集。因此,在与C API交互时,这就是您必须坚持的。
您正在将数据从C#编组到C API,因此必须遵循规则。这通常意味着,如果您只想将某些对象直接复制到C API的内存中,则只需要坚持使用具有C类似物的C#结构类型。
具体如何操作取决于您。您可以根据需要将数据存储在C#中,然后将其复制到一个临时对象中,以转发到OpenGL缓冲区对象中。或者,您可以存储C结构数组,该数组与C#灯光数据平行,并且C#数据具有与其匹配的C结构的索引。或其他东西。