C语言中的类GLSL向量访问

C语言中的类GLSL向量访问,c,vector,macros,unions,C,Vector,Macros,Unions,在GLSL中,您可以使用名称和索引访问向量的组件,例如,如果您有vec2 foo,则可以执行foo.x和foo[0]之类的操作 可以用C语言复制这个接口吗 我目前有以下情况: typedef union{ struct{ float x1, x2; }; struct{ float x, y; }; float d[2]; }vec2; 它允许我访问vec2 foo的组件,如foo.x和foo.d[0] 有没有可能摆脱那种讨厌的.d,到达foo[0]?(无论如何,也许使

在GLSL中,您可以使用名称和索引访问向量的组件,例如,如果您有
vec2 foo
,则可以执行
foo.x
foo[0]
之类的操作

可以用C语言复制这个接口吗

我目前有以下情况:

typedef union{
  struct{  float x1, x2;  };
  struct{  float  x,  y;  };
  float d[2];
}vec2;
它允许我访问
vec2 foo
的组件,如
foo.x
foo.d[0]


有没有可能摆脱那种讨厌的
.d
,到达
foo[0]
?(无论如何,也许使用一些(甚至更讨厌的)宏诡计?)

可能不可能。在C++中,代码是可执行的<代码> ~ 224 kByth/Cuth>(),但是C缺少工具来做它(至少在我的知识范围内),并且宏本身不能允许所有的访问组合(或者至少我没有看到它)。您缺少了一些坐标,对于
vec4
,有
xyzw、rgba、stpq
,访问可以是任何类似
yzx、xyw、wzy、xgq…
,构造函数也组合在一起,类似
vec3(vec2,float)、vec3(float,float)、vec3(float,float)、vec4(vec3,float)、vec4(flaot,vec2,float)
…正如您所见,有许多组合可以正确支持所有的
vec2/3/4
。但是我不在C中编码(我是C++的编码器)所以我可能会丢失一些东西…@ SpktReYes,C++中,它看起来是直观的,尤其是因为你可以超载<代码> []/Cord>运算符(我想我以前见过它)。也谢谢你的参考@étale上同调链接中的代码缺少最后一点:
typedef\u vec2;类型def_vec3 vec3;typedef_vec4 vec4;类型def_vec2 dvec2;类型def_vec3 dvec3;类型def_vec4 dvec4;typedef_vec2 bvec2;typedef_vec3 bvec3;typedef_vec4 bvec4;类型定义2 ivec2;类型定义向量3 ivec3;类型定义4 ivec4;类型def_vec2 uvec2;类型def_vec3 uvec3;类型def_vec4 uvec4如果没有模板,代码将延长5倍