From bcb7c0a426e66dc57007ae9a0e879358c7860fbb Mon Sep 17 00:00:00 2001 From: chai Date: Sun, 15 Dec 2019 16:01:48 +0800 Subject: *misc --- src/core/rasterizer.c | 1 - src/example/02_cube.c | 2 +- src/example/03_texture.c | 16 ++++++++---- src/math/mat.c | 4 +-- src/math/math.h | 4 +-- src/math/vec3.c | 2 +- src/shaders/default.c | 4 +-- src/shaders/pbr.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++++ src/shaders/unlit.c | 4 +-- src/test/test_quat.c | 2 +- 10 files changed, 87 insertions(+), 17 deletions(-) create mode 100644 src/shaders/pbr.c diff --git a/src/core/rasterizer.c b/src/core/rasterizer.c index aad29e9..4f23f52 100644 --- a/src/core/rasterizer.c +++ b/src/core/rasterizer.c @@ -156,7 +156,6 @@ void ssrR_triangle( Vec4* CA, Vec4* CB, Vec4* CC, Vert* A, Vert* B, Vert* C, Pro if(program->fragmentshader(uniforms, &ssr_frag_in, &color)) { \ /*MSAA*/ \ if(multi_sample) { \ - \ } \ /*blend*/ \ if(blend) { \ diff --git a/src/example/02_cube.c b/src/example/02_cube.c index caedd64..c1f2796 100644 --- a/src/example/02_cube.c +++ b/src/example/02_cube.c @@ -53,7 +53,7 @@ void ondrawcube(void*data) { for (int i = 0; i < 8; ++i) { Vec4 v = { verts[i].x, verts[i].y ,verts[i].z ,1 }, temp; - mat4_applytovec4(&m, &v, &temp); + mat4_mulvec4(&m, &v, &temp); temp.x /= temp.w; temp.y /= temp.w; temp.z /= temp.w; diff --git a/src/example/03_texture.c b/src/example/03_texture.c index deea341..fbd442a 100644 --- a/src/example/03_texture.c +++ b/src/example/03_texture.c @@ -21,7 +21,7 @@ static Vert verts[] = { {7, {1, -1, -1}, {1, -1, -1}, zerovec3, {1, 1} , 0xffFAFF00}, }; -extern Program ssr_built_in_shader_default; +extern Program ssr_built_in_shader_pbr; static Vec3 light = {-1, -1, -1}; @@ -37,6 +37,9 @@ static Mesh* ground_mesh; static Texture* yingham_albedo; static Mesh* yingham_mesh; +static Texture* gun_albedo; +static Mesh* gun_mesh; + void onloadtexture(void* data) { ssr_matrixmode(MATRIX_PROJECTION); ssr_loadidentity(); @@ -44,7 +47,7 @@ void onloadtexture(void* data) { //ssr_ortho(-5, 5, -4, 4, 0.1, 10); ssr_bindvertices(verts, 8, cube, 12); - ssr_useprogram(&ssr_built_in_shader_default); + ssr_useprogram(&ssr_built_in_shader_pbr); ssr_enable(ENABLE_BACKFACECULL | ENABLE_DEPTHTEST | ENABLE_WRITEDEPTH | ENABLE_BLEND); ssr_setwrapmode(WRAPMODE_CLAMP); @@ -61,7 +64,6 @@ void onloadtexture(void* data) { ground_mesh = mesh_loadfromobj("res/dieselpunk/ground.obj"); yingham_albedo = texture_loadfromfile("res/dieselpunk/yingham_basecolor.tga"); yingham_mesh = mesh_loadfromobj("res/dieselpunk/yingham.obj"); - } void oneventtexture(void* data) { @@ -77,7 +79,8 @@ void onupdatetexture(void*data) { ssr_matrixmode(MATRIX_VIEW); ssr_loadidentity(); - Vec3 p = { 800 * sin(_t), 500,800 * cos(_t) }, target = { 0, 0, 0 }; + float distance = 700; + Vec3 p = { distance * sin(_t), 300, distance * cos(_t) }, target = { 0, 0, 0 }; //Vec3 p = { 0, 0, 700}, target = { 0, 0, 0 }; ssr_lookat(&p, &target, &vec3up); @@ -98,7 +101,7 @@ void onupdatetexture(void*data) { } void ondrawtexture(void*data) { - ssr_clearcolor(0xff252525); + ssr_clearcolor(0xff202020); ssr_cleardepth(); ssr_setuniformtex(0, mech_albedo); @@ -112,8 +115,11 @@ void ondrawtexture(void*data) { ssr_bindvertices(yingham_mesh->vertices, yingham_mesh->verts_count, yingham_mesh->triangles, yingham_mesh->tris_count); ssr_draw(PRIMITIVE_TRIANGLE); + ssr_disable(ENABLE_BACKFACECULL); + 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_enable(ENABLE_BACKFACECULL); } diff --git a/src/math/mat.c b/src/math/mat.c index f889697..8b32ba2 100644 --- a/src/math/mat.c +++ b/src/math/mat.c @@ -322,7 +322,7 @@ bool mat4_setlookrotation(Vec3* view, Vec3* up, Mat4* out) { return 1; } -void mat4_applytovec4(Mat4* mat, Vec4* v, Vec4* out) { +void mat4_mulvec4(Mat4* mat, Vec4* v, Vec4* out) { ssr_assert(mat && v && out); if (v == out) { sharedVec4 = *v; @@ -337,7 +337,7 @@ void mat4_applytovec4(Mat4* mat, Vec4* v, Vec4* out) { /* ** mat3 apply to vec3 */ -void mat4_applytovec3(Mat4* mat, Vec3* v, Vec3* out) { +void mat4_mulvec3(Mat4* mat, Vec3* v, Vec3* out) { ssr_assert(mat && v && out); if (v == out) { sharedVec3 = *v; diff --git a/src/math/math.h b/src/math/math.h index 41b4607..8793336 100644 --- a/src/math/math.h +++ b/src/math/math.h @@ -235,8 +235,8 @@ void mat4_invertpos(Mat4* pos, Mat4* out); /* void mat4_decomposetrs(Mat4* src, Vec3* pos, Quat* quat, Vec3* scale); /*分解trs矩阵*/ -void mat4_applytovec4(Mat4* m, Vec4* v, Vec4* out); -void mat4_applytovec3(Mat4* m, Vec3* v, Vec3* out); +void mat4_mulvec4(Mat4* m, Vec4* v, Vec4* out); +void mat4_mulvec3(Mat4* m, Vec3* v, Vec3* out); bool mat4_toeuler(Mat4* in, Euler* out); /* 计算YXZ旋转矩阵的欧拉角 */ void mat4_toquat(Mat4* in, Quat* out); /*in是正交矩阵*/ diff --git a/src/math/vec3.c b/src/math/vec3.c index 917c4d1..d2fb652 100644 --- a/src/math/vec3.c +++ b/src/math/vec3.c @@ -77,7 +77,7 @@ void vec3_slerp(Vec3* v1, Vec3* v2, float t, Vec3* out) { Vec3 v1n; vec3_normalize(v1, &v1n); float angle = acos(dot) * t; //Mat4 m; mat4_setaxisangle(&axis, angle, &m); - //mat4_applytovec4(&m, &v1n, &v1n); + //mat4_mulvec4(&m, &v1n, &v1n); Quat q; quat_fromaxisangle(&axis, angle, &q); quat_applytovec3(&q, &v1n, &v1n); vec3_scale(&v1n, lerplen, out); diff --git a/src/shaders/default.c b/src/shaders/default.c index df3f121..00b436c 100644 --- a/src/shaders/default.c +++ b/src/shaders/default.c @@ -13,14 +13,14 @@ static void vert(UniformCollection* uniforms, VertexShaderIn* in, Vec4* clipcoord) { static Vec4 p; p.xyz = in->vertex->position; p.w = 1; - mat4_applytovec4(uniforms->mvp, &p, clipcoord); + mat4_mulvec4(uniforms->mvp, &p, clipcoord); Vec4 normal = { in->vertex->normal.x, in->vertex->normal.y, in->vertex->normal.z, 1 }; - Vec4 worldnormal; mat4_applytovec4(object2world, &normal, &worldnormal); + Vec4 worldnormal; mat4_mulvec4(object2world, &normal, &worldnormal); vec3_normalize(light, light); *rough = 1 - vec3_dot(&worldnormal, light); } diff --git a/src/shaders/pbr.c b/src/shaders/pbr.c new file mode 100644 index 0000000..c154f02 --- /dev/null +++ b/src/shaders/pbr.c @@ -0,0 +1,65 @@ +#include "common.h" + +/*uniforms*/ +#define object2world UM4(0) +#define light UV3(0) + +#define albedo_tex UTEX(0) +#define noraml_tex UTEX(1) +#define roughness_tex UTEX(2) +#define metalness_tex UTEX(3) + +/*varyings*/ +#define rough reg_num_00 +#define world_pos reg_v3_00 +#define depth_pos reg_v3_01 +#define clip_pos reg_v4_00 +#define world_normal reg_v3_02 +#define world_tangent reg_v3_03 +#define world_bitangent reg_v3_04 + +static void vert(UniformCollection* uniforms, VertexShaderIn* in, Vec4* clipcoord) { + static Vec4 p; p.xyz = in->vertex->position; p.w = 1; + mat4_mulvec4(uniforms->mvp, &p, clipcoord); + Vec4 normal = { + in->vertex->normal.x, + in->vertex->normal.y, + in->vertex->normal.z, + 1 + }; + Vec4 worldnormal; mat4_mulvec4(object2world, &normal, &worldnormal); + vec3_normalize(light, 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 = *rough; + //(*color).r = 1; + //(*color).g = 1; + //(*color).b = 1; + //(*color).a = 1; + //return 1; + //float rough = 1- vec3_dot(&in->normal, light); + Color32 c = tex2d(albedo_tex, in->texcoord); + //Color32 nc = tex2d(noramltex, in->texcoord); + //vec3_scale(&c, roughness, &c); + color32_saturate(&c); + *color = c; + return 1; +} + +Program ssr_built_in_shader_pbr = { + vert, frag, + VARYING_TEXCOORD | + VARYING_NORMAL | + + VARYING_NUM_00 | + VARYING_V3_00 | + VARYING_V3_01 | + VARYING_V3_02 | + VARYING_V3_03 | + VARYING_V3_04 | + VARYING_V4_00 +}; \ No newline at end of file diff --git a/src/shaders/unlit.c b/src/shaders/unlit.c index e5abdce..59510dd 100644 --- a/src/shaders/unlit.c +++ b/src/shaders/unlit.c @@ -10,14 +10,14 @@ static void vert(UniformCollection* uniforms, VertexShaderIn* in, Vec4* clipcoord) { static Vec4 p; p.xyz = in->vertex->position; p.w = 1; - mat4_applytovec4(uniforms->mvp, &p, clipcoord); + mat4_mulvec4(uniforms->mvp, &p, clipcoord); Vec4 normal = { in->vertex->normal.x, in->vertex->normal.y, in->vertex->normal.z, 1 }; - Vec4 worldnormal; mat4_applytovec4(object2world, &normal, &worldnormal); + Vec4 worldnormal; mat4_mulvec4(object2world, &normal, &worldnormal); vec3_normalize(light, light); *reg_num_00 = 1 - vec3_dot(&worldnormal, light); } diff --git a/src/test/test_quat.c b/src/test/test_quat.c index c932082..5d86842 100644 --- a/src/test/test_quat.c +++ b/src/test/test_quat.c @@ -23,7 +23,7 @@ mat4_print(&mat); Vec4 p2 = { 2,3,4,1 }; Vec4 res2; -mat4_applytovec4(&mat, &p2, &res2); +mat4_mulvec4(&mat, &p2, &res2); vec4_print(&res2); END -- cgit v1.1-26-g67d0