gs_effect结构体
2024-07-12
10
0
gs_effect代表一个着色器件解析后的数据。
struct gs_effect {
bool processing;//没有用
bool cached; //该effect是否已经缓存
char *effect_path, *effect_dir; //effect文件名称路径
gs_effect_param_array_t params;
DARRAY(struct gs_effect_technique) techniques;
//一个effect中有可以有多个tech,一个tech下一般只有一个pass
struct gs_effect_technique *cur_technique;//当前正在运行的tech
struct gs_effect_pass *cur_pass; //当前正在运行的pass,pass中有pixelshader和vertshader
gs_eparam_t *view_proj, *world, *scale;
graphics_t *graphics;
struct gs_effect *next;
size_t loop_pass; //pass的索引在cur_technique中的索引,即指针cur_pass
bool looping; //tech是否正在运行
};
一个effect文件中一般会有多个tech,故使用数组techniques来存储。每个tech下可能有多个pass,使用数组passes来存储,实际一般只有一个。
struct gs_effect_technique {
char *name;
enum effect_section section;
struct gs_effect *effect;
DARRAY(struct gs_effect_pass) passes;
gs_effect结构体中的cur_technique和cur_pass分别代表正在使用时的tech和pass,而loop_pass则变成了pass的索引,一般为0,不过计数变为了1.
在解析effect文件时,解析后的数据使用临时变量effect_parser结构体存储。可以看到,其主要解析以下几种类型。
struct effect_parser {
gs_effect_t *effect;
ep_param_array_t params;
DARRAY(struct ep_struct) structs;
DARRAY(struct ep_func) funcs;
DARRAY(struct ep_sampler) samplers;
DARRAY(struct ep_technique) techniques;
/* internal vars */
DARRAY(struct cf_lexer) files;
cf_token_array_t tokens;
struct gs_effect_pass *cur_pass;
struct cf_parser cfp;
};
static inline void ep_init(struct effect_parser *ep)
{
da_init(ep->params); //参数4
da_init(ep->structs); //结构体1
da_init(ep->funcs); //函数5
da_init(ep->samplers);//采样器3
da_init(ep->techniques);//tech2
//这两个好像没有用
da_init(ep->files); //filter
da_init(ep->tokens); //token
ep->cur_pass = NULL;
cf_parser_init(&ep->cfp);//解析过程中的临时token
}
struct
struct使用ep_struct来存储,其中name为名称,其成员使用数组ep_var_array_t来存储,各个成员的类型为ep_var。
struct ep_struct {
char *name;
ep_var_array_t vars; /* struct ep_var */
bool written;
};
typedef DARRAY(struct ep_var) ep_var_array_t;
struct ep_var {
char *type, *name, *mapping;
enum ep_var_type var_type;
};
enum ep_var_type {
EP_VAR_NONE,
EP_VAR_IN = EP_VAR_NONE,
EP_VAR_INOUT,
EP_VAR_OUT,
EP_VAR_UNIFORM
};
ep_technique
technique使用变量ep_technique存储。每个technique会有多个pass,实际一般只有一个,使用成员ep_pass来表示。
struct ep_technique {
char *name;
DARRAY(struct ep_pass) passes; /* struct ep_pass */
};
struct ep_pass {
char *name;
cf_token_array_t vertex_program;
cf_token_array_t fragment_program;
struct gs_effect_pass *pass;
};
生成的pass内容为:
struct gs_effect_pass {
char *name;
enum effect_section section;
gs_shader_t *vertshader;
gs_shader_t *pixelshader;
pass_shaderparam_array_t vertshader_params;
pass_shaderparam_array_t pixelshader_params;
};
生成的着色器内容如下:
struct gs_shader {
gs_device_t *device;
enum gs_shader_type type;
GLuint obj;
struct gs_shader_param *viewproj;
struct gs_shader_param *world;
DARRAY(struct shader_attrib) attribs;
DARRAY(struct gs_shader_param) params;
DARRAY(gs_samplerstate_t *) samplers;
};
struct gs_shader {
gs_device_t *device;
enum gs_shader_type type;
GLuint obj;
struct gs_shader_param *viewproj;
struct gs_shader_param *world;
DARRAY(struct shader_attrib) attribs;
DARRAY(struct gs_shader_param) params;
DARRAY(gs_samplerstate_t *) samplers;
};
sampler
struct ep_sampler {
char *name;
DARRAY(char *) states;
DARRAY(char *) values;
bool written;
};
param
struct ep_param {
char *type, *name;
DARRAY(uint8_t) default_val;
DARRAY(char *) properties;
struct gs_effect_param *param;
bool is_const, is_property, is_uniform, is_texture, written;
int writeorder, array_count;
ep_param_array_t annotations;
};