2016-12-24 37 views
0

我想設計一個類,它將以這樣的方式包裝着色器參數,它將使用戶能夠輕鬆地設置和獲得它的價值,而無需編寫噸此類實現之外的驗證代碼。什麼是包裝着色器參數值的類的一個很好的設計模式

問題是,明顯的着色器參數值可以是不同的類型,並且我是否使用模板或方法重載它會導致很多凌亂的代碼,如果一個人使用這個類,它可能不會是一個非常愉快的體驗。

有沒有一些巧妙的設計模式曾經實現會使所述類的使用更直接?我不介意這個機制是否更復雜,只要它的實現不會暴露給這個類的用戶。

另外,爲了更清楚起見,這個着色器參數類有些抽象,因爲它的目的只是存儲參數,以便在我的代碼庫中進行編輯和處理。它不會與實際着色器相互作用或有任何知識。

編輯1: 以下是我嘗試使用模板前解決這個問題,爲什麼我失敗:

我的模板值從我用它們存儲在STL非模板基類派生容器,但我在檢索值時遇到問題,無法將其重新轉換回模板值,另一個問題是使用此類實現時需要設置和獲取值的代碼量

編輯2:

理想的用法是:

ShaderParameter* param = ShaderParameterCollection.GetParameter("color_param"); 
ShaderParameterCollection->GetParameter("property_name")->Set(vec3()); 
ShaderParameterCollection->GetParameter("property_name")->Get(&out); 
ShaderParameterCollection->AddParameter("property_name", FLOAT_VEC3, vec3()); 

ShaderParamterCollection僅僅是內部使用STL容器,執行製圖和驗證存儲類,我已經有一個排序。

+0

你不想使用模板也不會重載,因爲_they會導致很多messy_(真的?)。你知道你已經排除了所有可用的解決方案嗎? – skypjack

+0

我沒有說我根本不想使用它們,但是我嘗試使用模板來解決問題導致了更復雜的用法,這正是我想要避免的。我很想聽聽你的想法,但你會如何使用這個誘惑,並保持簡單易用? – MrDanTheMan

+0

你可以將這個問題與使用這樣一個類的例子整合在一起嗎?想象一下,不知何故,你是一個用戶。你會如何使用它?我無法弄清楚你想要什麼。 – skypjack

回答

0

模板值類怎麼樣?這不是一個具體的設計模式,但可以通過封裝滿足您的需求相當不錯:當數據正在改變要執行不同類型的

1)您的私人着色器的數據和他們的公共存取

2)驗證碼(編碼的制定者爲例)

+0

謝謝,我之前嘗試過,我已更新我的問題並提供了更多信息 – MrDanTheMan

0

我會通過更換您目前有輸入鍵的字符串屬性的名稱,例如啓動:

ShaderParameterKey<color> color_key("color_param"); 
ShaderParameterKey<vec3> property_key("property_name"); 

那麼你的收集方法可能需要ShaderParameterKey<T>作爲輸入並返回ShaderParameter<T>。您的使用情況會是什麼樣子:

ShaderParameter<color>* param = ShaderParameterCollection.GetParameter(color_key); 
ShaderParameterCollection->GetParameter(property_key)->Set(vec3()); 
ShaderParameterCollection->GetParameter(property_key)->Get(&out); 
ShaderParameterCollection->AddParameter(property_key, vec3()); 

您不再需要,因爲在關鍵編碼的類型(FLOAT_VEC3)傳遞給AddParameter

我不確定在之前的模板基類嘗試中遇到了什麼問題,但此解決方案需要類似的東西。

相關問題