簡體   English   中英

opengl着色器(glsl)中的c ++位標志

[英]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.

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