diff options
Diffstat (limited to 'src/core/shader.h')
-rw-r--r-- | src/core/shader.h | 113 |
1 files changed, 50 insertions, 63 deletions
diff --git a/src/core/shader.h b/src/core/shader.h index fd71f5a..f433f0e 100644 --- a/src/core/shader.h +++ b/src/core/shader.h @@ -4,7 +4,6 @@ #include "../math/math.h" #include "vert.h" #include "texture.h" -#include "clip.h" typedef struct { /*built in varaibles*/ @@ -32,26 +31,23 @@ typedef struct { #define UN(i) (&uniforms->var_num[i]) #define UU (uniforms->userdata) -typedef struct VertexShaderIn { +#define REG_TOTAL 32 +#define REG_NUM_COUNT 4 +#define REG_V2_COUNT 8 +#define REG_V3_COUNT 12 +#define REG_V4_COUNT 8 + +typedef struct { Vert* vertex; } VertexShaderIn; typedef void(*VertexShader)(UniformCollection* uniforms, VertexShaderIn* in, Vec4* homocoord); -typedef struct FragmentShaderIn { - /*value from vertices interpolation*/ - Vec3 position; - Vec3 normal; - Vec3 tangent; - Vec2 texcoord; - Color color; - Vec4 joint; - Vec4 weight; - /*value from registers interpolation*/ - float num[4]; - Vec2 v2[6]; - Vec3 v3[8]; - Vec4 v4[6]; +typedef struct { + float num[REG_NUM_COUNT]; + Vec2 v2[REG_V2_COUNT]; + Vec3 v3[REG_V3_COUNT]; + Vec4 v4[REG_V4_COUNT]; } FragmentShaderIn; typedef bool(*FragmentShader)(UniformCollection* uniforms, FragmentShaderIn* in, Color32* color); @@ -64,18 +60,6 @@ typedef struct { #define VARYING_NONE (0) -#define VARYING_POSITION (1u << 31) -#define VARYING_NORMAL (1u << 30) -#define VARYING_TANGENT (1u << 29) -#define VARYING_TEXCOORD (1u << 28) -#define VARYING_COLOR (1u << 27) -#define VARYING_JOINT (1u << 26) -#define VARYING_WEIGHT (1u << 25) - -#define VARYING_UNUSED (1u << 24) - -#define VARYING_BASIC ( VARYING_UNUSED | VARYING_POSITION | VARYING_NORMAL | VARYING_TANGENT | VARYING_TEXCOORD | VARYING_COLOR | VARYING_JOINT | VARYING_WEIGHT ) - #define VARYING_NUM_00 (1u) #define VARYING_NUM_01 (1u << 1) #define VARYING_NUM_02 (1u << 2) @@ -89,30 +73,38 @@ typedef struct { #define VARYING_V2_03 (1u << 7) #define VARYING_V2_04 (1u << 8) #define VARYING_V2_05 (1u << 9) - -#define VARYING_V2 (VARYING_V2_00 | VARYING_V2_01 | VARYING_V2_02 | VARYING_V2_03 | VARYING_V2_04 | VARYING_V2_05) - -#define VARYING_V3_00 (1u << 10) -#define VARYING_V3_01 (1u << 11) -#define VARYING_V3_02 (1u << 12) -#define VARYING_V3_03 (1u << 13) -#define VARYING_V3_04 (1u << 14) -#define VARYING_V3_05 (1u << 15) -#define VARYING_V3_06 (1u << 16) -#define VARYING_V3_07 (1u << 17) - -#define VARYING_V3 (VARYING_V3_00 | VARYING_V3_01 | VARYING_V3_02 | VARYING_V3_03 | VARYING_V3_04 | VARYING_V3_05| VARYING_V3_06| VARYING_V3_07) - -#define VARYING_V4_00 (1u << 18) -#define VARYING_V4_01 (1u << 19) -#define VARYING_V4_02 (1u << 20) -#define VARYING_V4_03 (1u << 21) -#define VARYING_V4_04 (1u << 22) -#define VARYING_V4_05 (1u << 23) - -#define VARYING_V4 (VARYING_V4_00 | VARYING_V4_01 | VARYING_V4_02 | VARYING_V4_03 | VARYING_V4_04 | VARYING_V4_05) - -#define VARYING_EXTRA (VARYING_NUM | VARYING_V2 | VARYING_V3 | VARYING_V4) +#define VARYING_V2_06 (1u << 10) +#define VARYING_V2_07 (1u << 11) + +#define VARYING_V2 (VARYING_V2_00 | VARYING_V2_01 | VARYING_V2_02 | VARYING_V2_03 | VARYING_V2_04 | VARYING_V2_05 | VARYING_V2_06 | VARYING_V2_07) + +#define VARYING_V3_00 (1u << 12) +#define VARYING_V3_01 (1u << 13) +#define VARYING_V3_02 (1u << 14) +#define VARYING_V3_03 (1u << 15) +#define VARYING_V3_04 (1u << 16) +#define VARYING_V3_05 (1u << 17) +#define VARYING_V3_06 (1u << 18) +#define VARYING_V3_07 (1u << 19) +#define VARYING_V3_08 (1u << 20) +#define VARYING_V3_09 (1u << 21) +#define VARYING_V3_10 (1u << 22) +#define VARYING_V3_11 (1u << 23) + +#define VARYING_V3 (VARYING_V3_00 | VARYING_V3_01 | VARYING_V3_02 | VARYING_V3_03 | VARYING_V3_04 | VARYING_V3_05| VARYING_V3_06| VARYING_V3_07 | VARYING_V3_08 |VARYING_V3_09 | VARYING_V3_10 | VARYING_V3_11) + +#define VARYING_V4_00 (1u << 24) +#define VARYING_V4_01 (1u << 25) +#define VARYING_V4_02 (1u << 26) +#define VARYING_V4_03 (1u << 27) +#define VARYING_V4_04 (1u << 28) +#define VARYING_V4_05 (1u << 29) +#define VARYING_V4_06 (1u << 30) +#define VARYING_V4_07 (1u << 31) + +#define VARYING_V4 (VARYING_V4_00 | VARYING_V4_01 | VARYING_V4_02 | VARYING_V4_03 | VARYING_V4_04 | VARYING_V4_05 | VARYING_V4_06 | VARYING_V4_07) + +#define VARYING_ANY (VARYING_NUM | VARYING_V2 | VARYING_V3 | VARYING_V4) Color* ssrS_bcpcolor(Vec3* bc, Color A, Color B, Color C, Color* out); float* ssrS_bcpnum(Vec3* bc, float* A, float* B, float* C, float* out); @@ -151,6 +143,9 @@ typedef struct { }; } Register; +typedef void* (*BcpInterpolator)(Vec3* bc, void* a, void* b, void* c, void* out); +typedef void* (*LinearInterpolator)(float t, void* a, void* b, void* c, void* out); + typedef struct { uint element_size; byte* data; /*mutable, either of registers or temp-registers*/ @@ -159,21 +154,15 @@ typedef struct { byte* output; /*fragment-in*/ } ActiveReg; -#define REG_TOTAL 24 -#define REG_NUM_COUNT 4 -#define REG_V2_COUNT 6 -#define REG_V3_COUNT 8 -#define REG_V4_COUNT 6 - Register registers[REG_TOTAL]; ActiveReg active_regs[REG_TOTAL]; uint open_regsi[REG_TOTAL]; /*draw call用到的寄存器,可以索引到registers和active_regs*/ /*寄存器指针accessor,指向寄存器中的某个值,用于在shader里快速访问,使用错误可能会出现野指针*/ float *reg_num_00, *reg_num_01, *reg_num_02, *reg_num_03; -Vec2 *reg_v2_00, *reg_v2_01, *reg_v2_02, *reg_v2_03, *reg_v2_04, *reg_v2_05; -Vec3 *reg_v3_00, *reg_v3_01, *reg_v3_02, *reg_v3_03, *reg_v3_04, *reg_v3_05, *reg_v3_06, *reg_v3_07; -Vec4 *reg_v4_00, *reg_v4_01, *reg_v4_02, *reg_v4_03, *reg_v4_04, *reg_v4_05; +Vec2 *reg_v2_00, *reg_v2_01, *reg_v2_02, *reg_v2_03, *reg_v2_04, *reg_v2_05, *reg_v2_06, *reg_v2_07; +Vec3 *reg_v3_00, *reg_v3_01, *reg_v3_02, *reg_v3_03, *reg_v3_04, *reg_v3_05, *reg_v3_06, *reg_v3_07, *reg_v3_08, *reg_v3_09, *reg_v3_10, *reg_v3_11; +Vec4 *reg_v4_00, *reg_v4_01, *reg_v4_02, *reg_v4_03, *reg_v4_04, *reg_v4_05, *reg_v4_06, *reg_v4_07; void ssrS_openregs(uint varying_flag); void ssrS_setactiveregr(); @@ -187,8 +176,6 @@ void ssrS_setupregisterpoints(int idx); /*设置寄存器指针,指向fragIn结构*/ void ssrS_setregtofragin(); -void ssrS_solveprops(uint varying, Vec3* bc, Vert* a, Vert* b, Vert* c); - #define tex2d(tex, uv) \ texture_sampling(tex, ssr_getfiltermode(), ssr_getwrapmode(), (uv).x, (uv).y) |