OBS图形及渲染
+ -

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;
};

0 篇笔记 写笔记

作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!