diff options
Diffstat (limited to 'src/core/shader.h')
-rw-r--r-- | src/core/shader.h | 161 |
1 files changed, 135 insertions, 26 deletions
diff --git a/src/core/shader.h b/src/core/shader.h index 15dfc26..3024a0d 100644 --- a/src/core/shader.h +++ b/src/core/shader.h @@ -11,17 +11,21 @@ typedef struct UniformCollection { Mat4* projection; Mat4* mvp; Mat4* mv; - /*userside variables*/ + /*extra variables*/ Mat4 var_mat4[8]; Vec4 var_vec4[8]; Vec3 var_vec3[8]; Vec2 var_vec2[8]; + float var_num[8]; + /*userdata*/ + void* userdata; } UniformCollection; #define UM4(i) (&uniforms->var_mat4[i]) #define UV2(i) (&uniforms->var_vec2[i]) #define UV3(i) (&uniforms->var_vec3[i]) #define UV4(i) (&uniforms->var_vec4[i]) +#define UN(i) (&uniforms->var_num[i]) typedef struct VertexShaderIn { Vert* vertex; @@ -30,58 +34,163 @@ typedef struct VertexShaderIn { typedef void(*VertexShader)(UniformCollection* uniforms, VertexShaderIn* in, Vec4* homocoord); typedef struct FragmentShaderIn { - Vert *A, *B, *C; - Vec3* bc; + /*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]; } FragmentShaderIn; typedef bool(*FragmentShader)(UniformCollection* uniforms, FragmentShaderIn* in, Color* color); typedef struct Program { - VertexShader vertexshader; + VertexShader vertexshader; FragmentShader fragmentshader; + uint varying_flag; } Program; -void ssrS_bcpcolor(Vec3* bc, Color A, Color B, Color C, Color* out); -void ssrS_bcpvec2(Vec3* bc, Vec2* A, Vec2* B, Vec2* C, Vec2* out); -void ssrS_bcpvec3(Vec3* bc, Vec3* A, Vec3* B, Vec3* C, Vec3* out); -void ssrS_bcpvec4(Vec3* bc, Vec4* A, Vec4* B, Vec4* C, Vec4* out); +#define VARYING_NONE (0) +#define VARYING_POSITION (1 << 31) +#define VARYING_NORMAL (1 << 30) +#define VARYING_TANGENT (1 << 29) +#define VARYING_TEXCOORD (1 << 28) +#define VARYING_COLOR (1 << 27) +#define VARYING_JOINT (1 << 26) +#define VARYING_WEIGHT (1 << 25) + +#define VARYING_UNUSED (1 << 24) + +#define VARYING_BASIC ( VARYING_UNUSED | VARYING_POSITION | VARYING_NORMAL | VARYING_TANGENT | VARYING_TEXCOORD | VARYING_COLOR | VARYING_JOINT | VARYING_WEIGHT ) + +#define VARYING_NUM_00 (1 << 20) +#define VARYING_NUM_01 (1 << 21) +#define VARYING_NUM_02 (1 << 22) +#define VARYING_NUM_03 (1 << 23) + +#define VARYING_NUM (VARYING_NUM_00 | VARYING_NUM_01 | VARYING_NUM_02 | VARYING_NUM_03 ) + +#define VARYING_V2_00 (1) +#define VARYING_V2_01 (1 << 1) +#define VARYING_V2_02 (1 << 2) +#define VARYING_V2_03 (1 << 3) +#define VARYING_V2_04 (1 << 4) +#define VARYING_V2_05 (1 << 5) + +#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 (1 << 6) +#define VARYING_V3_01 (1 << 7) +#define VARYING_V3_02 (1 << 8) +#define VARYING_V3_03 (1 << 9) +#define VARYING_V3_04 (1 << 10) +#define VARYING_V3_05 (1 << 11) +#define VARYING_V3_06 (1 << 12) +#define VARYING_V3_07 (1 << 13) + +#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 (1 << 14) +#define VARYING_V4_01 (1 << 15) +#define VARYING_V4_02 (1 << 16) +#define VARYING_V4_03 (1 << 17) +#define VARYING_V4_04 (1 << 18) +#define VARYING_V4_05 (1 << 19) + +#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_BASIC) + +float* ssrS_bcpnum(Vec3* bc, float A, float B, float C, float* out); +Color* ssrS_bcpcolor(Vec3* bc, Color A, Color B, Color C, Color* out); +Vec2* ssrS_bcpvec2(Vec3* bc, Vec2* A, Vec2* B, Vec2* C, Vec2* out); +Vec3* ssrS_bcpvec3(Vec3* bc, Vec3* A, Vec3* B, Vec3* C, Vec3* out); +Vec4* ssrS_bcpvec4(Vec3* bc, Vec4* A, Vec4* B, Vec4* C, Vec4* out); + +void ssrS_lerpnum(float t, float A, float B, float* out); void ssrS_lerpcolor(float t, Color A, Color B, Color* out); void ssrS_lerpvec2(float t, Vec2* A, Vec2* B, Vec2* out); void ssrS_lerpvec3(float t, Vec3* A, Vec3* B, Vec3* out); void ssrS_lerpvec4(float t, Vec4* A, Vec4* B, Vec4* out); +void ssrS_setregisters(uint flag, int capacity); + /* -** 顶点数据外,还提供额外的寄存器 +** 顶点数据外,还提供额外的寄存器用来存储vertex shader输出的顶点额外数据 +** 共24个 */ enum RegisterType { - REGTYPE_VEC2 = 1, - REGTYPE_VEC4 = 2, - REGTYPE_VEC3 = 3, + REGTYPE_NUM = 1, + REGTYPE_VEC2, + REGTYPE_VEC4, + REGTYPE_VEC3, }; typedef struct Register { uint length; uint type; union { - Vec4* v4; + float* num; Vec2* v2; + Vec4* v4; Vec3* v3; }; } Register; -void ssrS_setregvec4_01(Vert* vert, Vec4* value); -void ssrS_setregvec4_02(Vert* vert, Vec4* value); -void ssrS_setregvec2_01(Vert* vert, Vec2* value); -void ssrS_setregvec2_02(Vert* vert, Vec2* value); -void ssrS_setregvec3_01(Vert* vert, Vec3* value); -void ssrS_setregvec3_02(Vert* vert, Vec3* value); - -Vec4* ssrS_getregvec4_01(Vert* vert); -Vec4* ssrS_getregvec4_02(Vert* vert); -Vec2* ssrS_getregvec2_01(Vert* vert); -Vec2* ssrS_getregvec2_02(Vert* vert); -Vec3* ssrS_getregvec3_01(Vert* vert); -Vec3* ssrS_getregvec3_02(Vert* vert); +#define REG_NUM_COUNT 4 +#define REG_V2_COUNT 6 +#define REG_V3_COUNT 8 +#define REG_V4_COUNT 6 + +Register reg_num[4]; +Register reg_v2[6]; +Register reg_v3[8]; +Register reg_v4[6]; + +void reg_all_wipe(); /*标记清空所有寄存器*/ + +/*寄存器指针,使用错误可能会出现野指针*/ + +float* reg_num_00; +float* reg_num_01; +float* reg_num_02; +float* reg_num_03; + +Vec2* reg_v2_00; +Vec2* reg_v2_01; +Vec2* reg_v2_02; +Vec2* reg_v2_03; +Vec2* reg_v2_04; +Vec2* reg_v2_05; + +Vec3* reg_v3_00; +Vec3* reg_v3_01; +Vec3* reg_v3_02; +Vec3* reg_v3_03; +Vec3* reg_v3_04; +Vec3* reg_v3_05; +Vec3* reg_v3_06; +Vec3* reg_v3_07; + +Vec4* reg_v4_00; +Vec4* reg_v4_01; +Vec4* reg_v4_02; +Vec4* reg_v4_03; +Vec4* reg_v4_04; +Vec4* reg_v4_05; + +/*设置寄存器指针,指向寄存器(注意在fragment阶段,指针会指向fragmentIn结构)*/ +void ssrS_setupregisterpoints(uint extra_varying_flag, int idx); + +/*设置寄存器指针,指向fragIn结构*/ +void ssrS_setregtofragin(uint extra_varying_flag, FragmentShaderIn* frag_in); #endif
\ No newline at end of file |