diff options
-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 | ||||
-rw-r--r-- | src/example/03_texture.c | 20 | ||||
-rw-r--r-- | src/shaders/default.c | 18 | ||||
-rw-r--r-- | src/widget/widget.h | 21 |
10 files changed, 158 insertions, 65 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) diff --git a/src/example/03_texture.c b/src/example/03_texture.c index b172b5c..deea341 100644 --- a/src/example/03_texture.c +++ b/src/example/03_texture.c @@ -40,16 +40,18 @@ static Mesh* yingham_mesh; void onloadtexture(void* data) { ssr_matrixmode(MATRIX_PROJECTION); ssr_loadidentity(); - ssr_perspective(90, ssr_getaspect(), 0.1f, 1000); + ssr_perspective(90, ssr_getaspect(), 0.1f, 1500); //ssr_ortho(-5, 5, -4, 4, 0.1, 10); ssr_bindvertices(verts, 8, cube, 12); ssr_useprogram(&ssr_built_in_shader_default); - ssr_enable(ENABLEMASK_BACKFACECULL | ENABLEMASK_DEPTHTEST | ENABLEMASK_WRITEDEPTH); + ssr_enable(ENABLE_BACKFACECULL | ENABLE_DEPTHTEST | ENABLE_WRITEDEPTH | ENABLE_BLEND); ssr_setwrapmode(WRAPMODE_CLAMP); ssr_setfiltermode(FILTERMODE_POINT); + ssr_setblendfunc(BLEND_SRC_ALPHA, BLEND_ONE_MINUS_SRC_ALPHA); + mech_albedo = texture_loadfromfile("res/dieselpunk/mech_basecolor.tga"); mech_normal = texture_loadfromfile("res/dieselpunk/mech_normal.tga"); mech_roughness = texture_loadfromfile("res/dieselpunk/mech_roughness.tga"); @@ -75,14 +77,14 @@ void onupdatetexture(void*data) { ssr_matrixmode(MATRIX_VIEW); ssr_loadidentity(); - // Vec3 p = { 700 * sin(_t), 0,700 * cos(_t) }, target = { 0, 0, 0 }; - Vec3 p = { 0, 0, 800}, target = { 0, 0, 0 }; + Vec3 p = { 800 * sin(_t), 500,800 * cos(_t) }, target = { 0, 0, 0 }; + //Vec3 p = { 0, 0, 700}, target = { 0, 0, 0 }; ssr_lookat(&p, &target, &vec3up); ssr_matrixmode(MATRIX_MODEL); ssr_loadidentity(); //ssr_translate(0, 0, -700); - ssr_rotate(_t * 10, 0, 1, 0); + //ssr_rotate(_t * 10, 0, 1, 0); Vec3 light = {1, 0, 0}; ssr_setuniformvec3(0, &light); @@ -106,12 +108,12 @@ void ondrawtexture(void*data) { ssr_bindvertices(mech_mesh->vertices, mech_mesh->verts_count, mech_mesh->triangles, mech_mesh->tris_count); ssr_draw(PRIMITIVE_TRIANGLE); - ssr_setuniformtex(0, ground_albedo); - ssr_bindvertices(ground_mesh->vertices, ground_mesh->verts_count, ground_mesh->triangles, ground_mesh->tris_count); - ssr_draw(PRIMITIVE_TRIANGLE); - ssr_setuniformtex(0, yingham_albedo); ssr_bindvertices(yingham_mesh->vertices, yingham_mesh->verts_count, yingham_mesh->triangles, yingham_mesh->tris_count); ssr_draw(PRIMITIVE_TRIANGLE); + ssr_setuniformtex(0, ground_albedo); + ssr_bindvertices(ground_mesh->vertices, ground_mesh->verts_count, ground_mesh->triangles, ground_mesh->tris_count); + ssr_draw(PRIMITIVE_TRIANGLE); + } diff --git a/src/shaders/default.c b/src/shaders/default.c index 49a80d1..df3f121 100644 --- a/src/shaders/default.c +++ b/src/shaders/default.c @@ -1,15 +1,15 @@ #include "common.h" /*uniforms*/ -#define object2world UM4(0) -#define light UV3(0) -#define maintex UTEX(0) -#define noramltex UTEX(1) -#define roughnesstex UTEX(2) -#define metalnesstex UTEX(3) +#define object2world UM4(0) +#define light UV3(0) +#define maintex UTEX(0) +#define noramltex UTEX(1) +#define roughnesstex UTEX(2) +#define metalnesstex UTEX(3) /*varyings*/ -#define rough reg_num_00 +#define rough reg_num_00 static void vert(UniformCollection* uniforms, VertexShaderIn* in, Vec4* clipcoord) { static Vec4 p; p.xyz = in->vertex->position; p.w = 1; @@ -22,13 +22,13 @@ static void vert(UniformCollection* uniforms, VertexShaderIn* in, Vec4* clipcoor }; Vec4 worldnormal; mat4_applytovec4(object2world, &normal, &worldnormal); vec3_normalize(light, light); - *reg_num_00 = 1 - vec3_dot(&worldnormal, light); + *rough = 1 - vec3_dot(&worldnormal, light); } static bool frag(UniformCollection* uniforms, FragmentShaderIn* in, Color32* color) { vec3_normalize(light, light); vec3_normalize(&in->normal, &in->normal); - float roughness = *reg_num_00; + float roughness = *rough; //(*color).r = 1; //(*color).g = 1; //(*color).b = 1; diff --git a/src/widget/widget.h b/src/widget/widget.h new file mode 100644 index 0000000..a4b329e --- /dev/null +++ b/src/widget/widget.h @@ -0,0 +1,21 @@ +#ifndef _SOFTSHADEROOM_WIDGET_H_ +#define _SOFTSHADEROOM_WIDGET_H_ + +#include "../core/texture.h" + +typedef struct { + uint control_id; +} Widget; + +typedef struct { + Widget base; + Texture* normal; + Texture* down; +} Button; + +typedef struct { + Widget base; + +} RadioButton; + +#endif
\ No newline at end of file |