[英]c++ bit flags in opengl shaders (glsl)
將我的位標志發送到片段着色器以便能夠對它進行if()的最佳方法是什么?
我有以下位標記(枚舉):
uint32_t options;
enum Options {
ON = 1 << 0, /// row 1 | enable or disable
OFF = 1 << 1,
DUMMY1 = 1 << 2,
DUMMY2 = 1 << 3,
NONE = 1 << 4, /// row 2 | contours
SILHOUETTE = 1 << 5,
SUGGESTIVE = 1 << 6,
APPARENTRIDGES = 1 << 7,
PHOTOREALISTIC = 1 << 8, /// row 3 | shading
TONE = 1 << 9,
TONESPLASHBACK = 1 << 10,
EXAGGERATED = 1 << 11
};
對應於表[] =將i,j放置在表中([位為整數])
[1] [2] [4] [8]
[16] [32] [64] [128]
[256] [512] [1024] [2048]
因此,當在我的實際表中的每一行中選擇所有第一個選項時,我的位標記(選項)的可能值將為我提供273的值。在每一行中,只能選擇一個選項。
現在,當我想檢查使用位標志在CPU上啟用了哪些選項時,我可以簡單地執行以下操作(對於選擇第一列的示例情況):
if (options & ON) {} // true
if (options & OFF) {} // false
if (options & PHOTOREALISTIC) // true
這個想法是基於位標志中顯示的選擇,執行着色器的不同部分。 為此,我需要執行以下操作:
if( options == 273)
// do enable object, render with no contours and in a photorealistic manner
並跳過(在着色器中)禁用的其余選項。 但是,在理想情況下,我想使用位標志將其簡化為如何在CPU上完成。 因此,在我的着色器中,我想要一些類似的東西:
if ( (options & PHOTOREALISTIC) & (options & ON)) // true
// do stuff
是否有可能實現這樣的目標。 可能不是完全相同的東西,而是比對位標志產生的所有可能整數簡單地“ if()-ing”更為優雅的東西? (例如:if(1 + 16 + 256),if(1 + 16 + 512),... if(8 + 128 + 2048))
由於要使用不同的代碼路徑,因此優雅地枚舉標志毫無意義。 在C ++中,您可以執行跳轉功能表之類的操作,但是在GLSL中,您不能做到這一點(相信我-您不想這樣做)。 因此,請定期檢查:
if (options & (ON | PHOTOREALISTIC)) { /*do something*/ }
如果您不受限於Uber-shader方法,則可以選擇-考慮從GLSL對象中實現的單獨功能塊構建GLSL程序。
例如,一個塊可以實現常規渲染器,而第二個塊則以照片級方式實現。 兩者應具有相同的功能名稱,該名稱在主着色器中外部鏈接並從那里進行調用。 鏈接GLSL程序時,您只能附加與所需行為匹配的這些塊之一。
你能用這個嗎?
if ((options & (PHOTOREALISTIC | ON)) == (PHOTOREALISTIC | ON))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.