summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/device.c78
-rw-r--r--src/core/device.h30
-rw-r--r--src/core/framebuffer.c5
-rw-r--r--src/core/rasterizer.c22
-rw-r--r--src/core/rasterizer.h3
-rw-r--r--src/core/shader.c15
-rw-r--r--src/core/shader.h11
-rw-r--r--src/example/03_texture.c20
-rw-r--r--src/shaders/default.c18
-rw-r--r--src/widget/widget.h21
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