簡體   English   中英

有沒有辦法在GLSL中使用復雜/派生類?

[英]Is there any way to use complex/derived classes in 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着色器。 因此,我現在的解決方案是提供該類的簡化版本作為結構,其中僅包含我在着色器中所需的必要信息。 這聽起來不是一個好的解決方案,因為我實際上必須為我所有的不同模型類維護2個版本。

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

所以我的問題是,這種解決方案是唯一的選擇嗎? 更多高級游戲開發商如何組織他們的數據?

由於我使用GUI來修改對象屬性,因此我不得不以某種方式將Properties添加到幾乎所有數據類中,這剝奪了類的所有簡單性,我顯然不能考慮OpenGL的類大小回調,但是即使我沒有多余的屬性,即使name字段也禁止我將通用結構用於這兩種用法。

C(因此OpenGL)不講C#。 它只講很小的C#子集。 因此,在與C API交互時,這就是您必須堅持的。

您正在將數據從C#編組到C API,因此必須遵循規則。 這通常意味着,如果您只想將某些對象直接復制到C API的內存中,則只需要堅持使用具有C類似物的C#結構類型。

具體如何操作取決於您。 您可以根據需要將數據存儲在C#中,然后將其復制到一個臨時對象中,以轉發到OpenGL緩沖區對象中。 或者,您可以存儲C結構數組,該數組與C#燈光數據平行,並且C#數據具有與其匹配的C結構的索引。 或其他東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM