2016-04-04 23 views
1
私はこのような何か持っている可能性がある場合、私は疑問に思う

:たとえばAttrためGLSL、リテラル定数入力レイアウト修飾子

layout (location = attr.POSITION) in vec3 position; 

私はすでに試した一定の構造

const struct Attr 
{ 
    int POSITION; 
} attr = Attr(0); 

であるが、それは

を不平を言います

シェーダステータスが無効:0(34):エラーC0000:予期しない構文エラー 整数co nstant、私は、このようなattr.POSITIONリテラルとして入力修飾子を宣言するために何か他のものを使用することができ、

あるいは構造体と方法がない場合は「」識別子またはテンプレートの識別子を期待するか、トークンで 識別子を入力?

答えて

2

GLSLには、const struct宣言のようなものはありません。しかし時定数の値をコンパイルしていない:

const int position_loc = 0; 

constant expressionsのための規則は、定数式で初期化されたconst修飾変数は定数式そのものであると言います。

そして、このようなconst修飾変数の型は基本型でなければならないと言う何のルールがないではありません。attrは定数式を含む初期化リストで初期化されているので

struct Attr 
{ 
    int position; 
}; 
const Attr attr = {1}; 

attrがあるがそれ自体は定数式です。つまり、attr.positionも整数型の定数式です。

そして、このようなコンパイル時の整数定数式がlayout qualifiersで使用することができますが、GLSL 4.40またはARB_ehanced_layouts使用している場合にのみ:そのバージョンの前に

layout(location = attr.position) in vec3 position; 

を、あなたが使用する必要がしたいです実際のリテラル。これはあなたができる最善の#defineだろう意味:

#define position_loc 1 
layout(location = position_loc) in vec3 position; 

今個人的に、私は、このような積分定数式 - 内 - 構造体体操に頼ることはありません。ドライバのコードがほとんどこのような方法でテストされることはほとんどありません。したがって、ドライバのバグに遭遇する可能性はかなり高いです。 #defineメソッドは、実際にはるかに機能する可能性があります。

+0

私は '#define ' – elect