diff options
author | chai <chaifix@163.com> | 2019-12-15 13:29:05 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2019-12-15 13:29:05 +0800 |
commit | a0b8ef3d482c965901f094879a79dd9c5fd8245c (patch) | |
tree | 1a28d49dc7a6bf0a279f10569cd7e40f3aaaedaa /src/core | |
parent | 749bbc6a54e50c297ab49d9e515a3679651d1461 (diff) |
*misc
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/device.c | 78 | ||||
-rw-r--r-- | src/core/device.h | 30 | ||||
-rw-r--r-- | src/core/framebuffer.c | 5 | ||||
-rw-r--r-- | src/core/rasterizer.c | 22 | ||||
-rw-r--r-- | src/core/rasterizer.h | 3 | ||||
-rw-r--r-- | src/core/shader.c | 15 | ||||
-rw-r--r-- | src/core/shader.h | 11 |
7 files changed, 117 insertions, 47 deletions
diff --git a/src/core/device.c b/src/core/device.c index 3566448..4b16d32 100644 --- a/src/core/device.c +++ b/src/core/device.c @@ -88,8 +88,8 @@ void ssr_init(ssr_Config* conf) { state.filtermode = FILTERMODE_POINT; state.wrapmode = WRAPMODE_CLAMP; - state.blendfactor.src = BLENDFACTOR_SRC_ALPHA; - state.blendfactor.dst = BLENDFACTOR_ONE_MINUS_SRC_ALPHA; + state.blendfactor.src = BLEND_SRC_ALPHA; + state.blendfactor.dst = BLEND_ONE_MINUS_SRC_ALPHA; } float ssr_getaspect() { @@ -313,14 +313,82 @@ void ssr_blend(Color32* src, Color32* dst, Color32* out) { ssrU_blend(state.blendfactor.src, state.blendfactor.dst, src, dst, out); } -void ssrU_blend(ssr_BlendFactor sfactor +static _blend(ssr_BlendFactor factor, Color32* src, Color32* dst, Color32* out) { + switch (factor) { + case BLEND_ONE: + break; + case BLEND_ZERO: + out->r = out->g = out->b = out->a = 0; + break; + case BLEND_SRC_COLOR: + out->r *= src->r; + out->g *= src->g; + out->b *= src->b; + out->a *= src->a; + break; + case BLEND_ONE_MINUS_SRC_COLOR: + out->r *= (1 - src->r); + out->g *= (1 - src->g); + out->b *= (1 - src->b); + out->a *= (1 - src->a); + break; + case BLEND_DST_COLOR: + out->r *= dst->r; + out->g *= dst->g; + out->b *= dst->b; + out->a *= dst->a; + break; + case BLEND_ONE_MINUS_DST_COLOR: + out->r *= (1 - dst->r); + out->g *= (1 - dst->g); + out->b *= (1 - dst->b); + out->a *= (1 - dst->a); + break; + case BLEND_SRC_ALPHA: + out->r *= src->a; + out->g *= src->a; + out->b *= src->a; + out->a *= src->a; + break; + case BLEND_ONE_MINUS_SRC_ALPHA: + out->r *= (1 - src->a); + out->g *= (1 - src->a); + out->b *= (1 - src->a); + out->a *= (1 - src->a); + break; + case BLEND_DST_ALPHA: + out->r *= dst->a; + out->g *= dst->a; + out->b *= dst->a; + out->a *= dst->a; + break; + case BLEND_ONE_MINUS_DST_ALPHA: + out->r *= (1 - dst->a); + out->g *= (1 - dst->a); + out->b *= (1 - dst->a); + out->a *= (1 - dst->a); + break; + default: + ssr_assert(FALSE); + break; + } +} + +void ssrU_blend( + ssr_BlendFactor sfactor , ssr_BlendFactor dfactor , Color32* src , Color32* dst , Color32* out ) { ssr_assert(src && dst && out); - + Color32 s0; s0 = *src; + _blend(sfactor, src, dst, src); + _blend(dfactor, &s0, dst, dst); + out->r = src->r + dst->r; + out->g = src->g + dst->g; + out->b = src->b + dst->b; + out->a = src->a + dst->a; } Color32 ssr_getfbocolor(uint x, uint y) { @@ -426,7 +494,7 @@ void ssr_draw(ssr_PrimitiveType primitive) { v2 = &state.verts[i2]; /*back face culling*/ - if (ssr_isenable(ENABLEMASK_BACKFACECULL)) { + if (ssr_isenable(ENABLE_BACKFACECULL)) { float w0 = 1 / h0->w, w1 = 1 / h1->w, w2 = 1 / h2->w; Vec3 ab, ac; ab.x = h1->x * w1 - h0->x * w0; diff --git a/src/core/device.h b/src/core/device.h index d8daf76..066d399 100644 --- a/src/core/device.h +++ b/src/core/device.h @@ -29,24 +29,24 @@ typedef enum { } ssr_PrimitiveType; typedef enum { - ENABLEMASK_BACKFACECULL = 1, - ENABLEMASK_DEPTHTEST = 1 << 1, - ENABLEMASK_MULTISAMPLE = 1 << 2, - ENABLEMASK_BLEND = 1 << 3, - ENABLEMASK_WRITEDEPTH = 1 << 4, + ENABLE_BACKFACECULL = 1, + ENABLE_DEPTHTEST = 1 << 1, + ENABLE_MULTISAMPLE = 1 << 2, + ENABLE_BLEND = 1 << 3, + ENABLE_WRITEDEPTH = 1 << 4, } ssr_EnableMask; typedef enum { - BLENDFACTOR_ONE, - BLENDFACTOR_ZERO, - BLENDFACTOR_SRC_COLOR, - BLENDFACTOR_ONE_MINUS_SRC_COLOR, - BLENDFACTOR_DST_COLOR, - BLENDFACTOR_ONE_MINUS_DST_COLOR, - BLENDFACTOR_SRC_ALPHA, - BLENDFACTOR_ONE_MINUS_SRC_ALPHA, - BLENDFACTOR_DST_ALPHA, - BLENDFACTOR_ONE_MINUS_DST_ALPHA, + BLEND_ONE, + BLEND_ZERO, + BLEND_SRC_COLOR, + BLEND_ONE_MINUS_SRC_COLOR, + BLEND_DST_COLOR, + BLEND_ONE_MINUS_DST_COLOR, + BLEND_SRC_ALPHA, + BLEND_ONE_MINUS_SRC_ALPHA, + BLEND_DST_ALPHA, + BLEND_ONE_MINUS_DST_ALPHA, } ssr_BlendFactor; void ssr_init(ssr_Config* config); diff --git a/src/core/framebuffer.c b/src/core/framebuffer.c index e69de29..7fa0865 100644 --- a/src/core/framebuffer.c +++ b/src/core/framebuffer.c @@ -0,0 +1,5 @@ +#include "framebuffer.h" + +FrameBuffer* fbo_create(uint height, uint width) { + +} diff --git a/src/core/rasterizer.c b/src/core/rasterizer.c index 772eb29..aad29e9 100644 --- a/src/core/rasterizer.c +++ b/src/core/rasterizer.c @@ -123,21 +123,10 @@ void ssrR_triangle( Vec4* CA, Vec4* CB, Vec4* CC, Vert* A, Vert* B, Vert* C, Pro s[0].x = sc->x - sa->x; s[0].y = sb->x - sa->x; s[1].x = sc->y - sa->y; s[1].y = sb->y - sa->y; - bool depth_test = ssr_isenable(ENABLEMASK_DEPTHTEST); - bool multi_sample = ssr_isenable(ENABLEMASK_MULTISAMPLE); - bool blend = ssr_isenable(ENABLEMASK_BLEND); - bool write_depth = ssr_isenable(ENABLEMASK_WRITEDEPTH); - -#define DO_INTERPOLATION \ - if (varying_flag & VARYING_BASIC) { \ - if (varying_flag & VARYING_POSITION) ssrS_bcpvec3(&bc, &A->position, &B->position, &C->position, &ssr_frag_in.position); \ - if (varying_flag & VARYING_NORMAL) ssrS_bcpvec3(&bc, &A->normal, &B->normal, &C->normal, &ssr_frag_in.normal); \ - if (varying_flag & VARYING_TANGENT) ssrS_bcpvec3(&bc, &A->tangent, &B->tangent, &C->tangent, &ssr_frag_in.tangent); \ - if (varying_flag & VARYING_TEXCOORD) ssrS_bcpvec2(&bc, &A->texcoord, &B->texcoord, &C->texcoord, &ssr_frag_in.texcoord); \ -/* if (varying_flag & VARYING_JOINT) ssrS_bcpvec4(&bc, &A->joint, &B->joint, &C->joint, &ssr_frag_in.joint); \ - if (varying_flag & VARYING_WEIGHT) ssrS_bcpvec4(&bc, &A->weight, &B->weight, &C->weight, &ssr_frag_in.weight); \ - */ if (varying_flag & VARYING_COLOR) ssrS_bcpcolor(&bc, A->color, B->color, C->color, &ssr_frag_in.color); \ - } + bool depth_test = ssr_isenable(ENABLE_DEPTHTEST); + bool multi_sample = ssr_isenable(ENABLE_MULTISAMPLE); + bool blend = ssr_isenable(ENABLE_BLEND); + bool write_depth = ssr_isenable(ENABLE_WRITEDEPTH); #define RENDER_TRIANGLE \ for (p.y = FROM->y; p.y < TO->y + OFFSET; ++p.y) { \ @@ -161,7 +150,7 @@ void ssrR_triangle( Vec4* CA, Vec4* CB, Vec4* CC, Vert* A, Vert* B, Vert* C, Pro discardif(!ssr_testdepth(p.x, p.y, depth)); \ } \ /*set varying variables*/ \ - DO_INTERPOLATION \ + ssrS_solveprops(varying_flag, &bc, A, B, C); \ ssrS_solveregs(&bc, A->index, B->index, C->index); \ /*enter fragment shader*/ \ if(program->fragmentshader(uniforms, &ssr_frag_in, &color)) { \ @@ -177,6 +166,7 @@ void ssrR_triangle( Vec4* CA, Vec4* CB, Vec4* CC, Vert* A, Vert* B, Vert* C, Pro if(write_depth) { \ ssr_writedepth(p.x, p.y, depth); \ } \ + color32_saturate(&color); \ ssr_putpoint32(p.x, p.y, &color); \ } \ } \ diff --git a/src/core/rasterizer.h b/src/core/rasterizer.h index 8e35511..4fa2482 100644 --- a/src/core/rasterizer.h +++ b/src/core/rasterizer.h @@ -13,7 +13,6 @@ bool ssrR_barycentric(Vec2* A, Vec2* B, Vec2* C, Vec2* p, Vec3* out); /*计算重心 void ssrR_center(Vec2* A, Vec2* B, Vec2* C, Vec2* out); /*获得重心*/ bool ssrR_ispointintriangle(Vec2* A, Vec2* B, Vec2* C, Vec2* p); -void ssrR_triangle(Vec4* CA, Vec4* CB, Vec4* CC, Vert* A, Vert* B, Vert* C, Program* program, UniformCollection* uniforms -); +void ssrR_triangle(Vec4* CA, Vec4* CB, Vec4* CC, Vert* A, Vert* B, Vert* C, Program* program, UniformCollection* uniforms); #endif
\ No newline at end of file diff --git a/src/core/shader.c b/src/core/shader.c index 0490362..86c2ad6 100644 --- a/src/core/shader.c +++ b/src/core/shader.c @@ -159,6 +159,21 @@ void ssrS_solveregs(Vec3* bc, uint a, uint b, uint c) { } } +/*计算基础属性的插值,并输出*/ +void ssrS_solveprops(uint varying_flag, Vec3* bc, Vert* A, Vert* B, Vert* C) { + if (varying_flag & VARYING_BASIC) { + if (varying_flag & VARYING_POSITION) ssrS_bcpvec3(bc, &A->position, &B->position, &C->position, &ssr_frag_in.position); + if (varying_flag & VARYING_NORMAL) ssrS_bcpvec3(bc, &A->normal, &B->normal, &C->normal, &ssr_frag_in.normal); + if (varying_flag & VARYING_TANGENT) ssrS_bcpvec3(bc, &A->tangent, &B->tangent, &C->tangent, &ssr_frag_in.tangent); + if (varying_flag & VARYING_TEXCOORD) ssrS_bcpvec2(bc, &A->texcoord, &B->texcoord, &C->texcoord, &ssr_frag_in.texcoord); +/* + if (varying_flag & VARYING_JOINT) ssrS_bcpvec4(&bc, &A->joint, &B->joint, &C->joint, &ssr_frag_in.joint); + if (varying_flag & VARYING_WEIGHT) ssrS_bcpvec4(&bc, &A->weight, &B->weight, &C->weight, &ssr_frag_in.weight); +*/ + if (varying_flag & VARYING_COLOR) ssrS_bcpcolor(bc, A->color, B->color, C->color, &ssr_frag_in.color); + } +} + /*给寄存器扩容(如果需要的话)*/ void ssrS_setregisters(int capacity) { Register* reg; diff --git a/src/core/shader.h b/src/core/shader.h index d74581d..fd71f5a 100644 --- a/src/core/shader.h +++ b/src/core/shader.h @@ -169,15 +169,6 @@ Register registers[REG_TOTAL]; ActiveReg active_regs[REG_TOTAL]; uint open_regsi[REG_TOTAL]; /*draw call用到的寄存器,可以索引到registers和active_regs*/ -#define REG_NUM_OFFSET 0 -#define REG_V2_OFFSET 4 -#define REG_V3_OFFSET 10 -#define REG_V4_OFFSET 18 -#define REG_NUM(i) (registers[i]) -#define REG_V2(i) (registers[REG_V2_OFFSET + i]) -#define REG_V3(i) (registers[REG_V3_OFFSET + i]) -#define REG_V4(i) (registers[REG_V4_OFFSET + i]) - /*寄存器指针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; @@ -196,6 +187,8 @@ 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) |