summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/rasterizer.c1
-rw-r--r--src/example/02_cube.c2
-rw-r--r--src/example/03_texture.c16
-rw-r--r--src/math/mat.c4
-rw-r--r--src/math/math.h4
-rw-r--r--src/math/vec3.c2
-rw-r--r--src/shaders/default.c4
-rw-r--r--src/shaders/pbr.c65
-rw-r--r--src/shaders/unlit.c4
-rw-r--r--src/test/test_quat.c2
10 files changed, 87 insertions, 17 deletions
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