diff options
Diffstat (limited to 'src/shaders')
-rw-r--r-- | src/shaders/common/core.c (renamed from src/shaders/common.c) | 11 | ||||
-rw-r--r-- | src/shaders/common/core.h (renamed from src/shaders/common.h) | 16 | ||||
-rw-r--r-- | src/shaders/common/light.c | 0 | ||||
-rw-r--r-- | src/shaders/common/light.h | 0 | ||||
-rw-r--r-- | src/shaders/common/mathlib.c | 138 | ||||
-rw-r--r-- | src/shaders/common/mathlib.h | 63 | ||||
-rw-r--r-- | src/shaders/common/shadow.c | 0 | ||||
-rw-r--r-- | src/shaders/common/shadow.h | 6 | ||||
-rw-r--r-- | src/shaders/default.c | 2 | ||||
-rw-r--r-- | src/shaders/pbr.c | 19 | ||||
-rw-r--r-- | src/shaders/unlit.c | 2 |
11 files changed, 218 insertions, 39 deletions
diff --git a/src/shaders/common.c b/src/shaders/common/core.c index 333b433..703458c 100644 --- a/src/shaders/common.c +++ b/src/shaders/common/core.c @@ -1,4 +1,4 @@ -#include "common.h" +#include "core.h" Vec4 _proj_params; Vec2 _time; @@ -15,15 +15,6 @@ Vec3 unpacknormal(Color32 c32) { Mat4 mat4(Vec4* c1, Vec4* c2, Vec4* c3, Vec4* c4); -Mat3 mat3(Vec3* c1, Vec3* c2, Vec3* c3) { - Mat3 m = { - c1->x,c1->y,c1->z, - c2->x,c2->y,c2->z, - c3->x,c3->y,c3->z, - }; - return m; -} - Vec2 texsize(Texture* texture) { Vec2 size = {texture->width, texture->height}; return size; diff --git a/src/shaders/common.h b/src/shaders/common/core.h index 8d0ac83..623409e 100644 --- a/src/shaders/common.h +++ b/src/shaders/common/core.h @@ -1,19 +1,7 @@ #ifndef _SOFTSHADEROOM_COMMON_HEADER_H_ #define _SOFTSHADEROOM_COMMON_HEADER_H_ -#include "../core/shader.h" - -/************************************************************************/ -/* constants */ -/************************************************************************/ - -#define SSR_PI 3.14159265359f -#define SSR_TWO_PI 6.28318530718f -#define SSR_FOUR_PI 12.56637061436f -#define SSR_INV_PI 0.31830988618f -#define SSR_INV_TWO_PI 0.15915494309f -#define SSR_INV_FOUR_PI 0.07957747155f -#define SSR_HALF_PI 1.57079632679f -#define SSR_INV_HALF_PI 0.636619772367f +#include "../../core/shader.h" +#include "mathlib.h" /************************************************************************/ /* variables */ diff --git a/src/shaders/common/light.c b/src/shaders/common/light.c new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/src/shaders/common/light.c diff --git a/src/shaders/common/light.h b/src/shaders/common/light.h new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/src/shaders/common/light.h diff --git a/src/shaders/common/mathlib.c b/src/shaders/common/mathlib.c new file mode 100644 index 0000000..356357c --- /dev/null +++ b/src/shaders/common/mathlib.c @@ -0,0 +1,138 @@ +#include "mathlib.h" +#include "../../math/math.h" + +#define INTERNAL_FUNCTION(T, NAME)\ +T NAME(T v1, T v2) {\ + T out; \ + internal_##NAME(&v1, &v2, &out);\ + return out;\ +} + +/************************************************************************/ +/* Vec2 */ +/************************************************************************/ +Vec2 vec2(float x, float y) { + Vec2 v = {x, y}; + return v; +} + +INTERNAL_FUNCTION(Vec2, vec2_minus); +INTERNAL_FUNCTION(Vec2, vec2_plus); + +float vec2_dot(Vec2 v1, Vec2 v2) { + return internal_vec2_dot(&v1, &v2); +} + +/************************************************************************/ +/* Vec3 */ +/************************************************************************/ +Vec3 vec3(float x, float y, float z) { + Vec3 v = {x, y, z}; + return v; +} + +INTERNAL_FUNCTION(Vec3, vec3_minus); +INTERNAL_FUNCTION(Vec3, vec3_plus); +INTERNAL_FUNCTION(Vec3, vec3_cross); + +float vec3_dot(Vec3 v1, Vec3 v2) { + return internal_vec3_dot(&v1, &v2); +} + +Vec3 vec3_lerp(Vec3 v1, Vec3 v2, float t) { + Vec3 out; + internal_vec3_lerp(&v1, &v2, t, &out); + return out; +} + +Vec3 vec3_slerp(Vec3 v1, Vec3 v2, float t) { + Vec3 out; + internal_vec3_slerp(&v1, &v2, t, &out); + return out; +} + +Vec3 vec3_scale(Vec3 v, float scale) { + Vec3 out; + internal_vec3_scale(&v, scale, &out); + return out; +} + +Vec3 vec3_normalize(Vec3 v) { + Vec3 out; + internal_vec3_normalize(&v, &out); + return out; +} + +/************************************************************************/ +/* Vec4 */ +/************************************************************************/ + +Vec4 vec4(float x, float y, float z, float w) { + Vec4 v = {x, y, z, w}; + return v; +} + +INTERNAL_FUNCTION(Vec4, vec4_minus); +INTERNAL_FUNCTION(Vec4, vec4_plus); + +Vec4 vec4_scale(Vec4 v, float scale) { + Vec4 out; + internal_vec4_scale(&v, scale, &out); + return out; +} + +Vec4 vec4_saturate(Vec4 v) { + Vec4 out; + out.x = clamp(v.x, 0, 1); + out.y = clamp(v.y, 0, 1); + out.z = clamp(v.z, 0, 1); + out.w = clamp(v.w, 0, 1); + return out; +} + +/************************************************************************/ +/* Matrix */ +/************************************************************************/ + +Mat3 mat3(Vec3 c1, Vec3 c2, Vec3 c3) { + Mat3 m = {c1, c2, c3}; + return m; +} + +Vec3 mat3_mulvec3(Mat3 m, Vec3 v) { + Vec3 out; + internal_mat3_multvec3(&m, &v, &out); + return out; +} + +Mat3 mat3_mulmat3(Mat3 m, Mat3 m2) { + Mat3 out; + internal_mat3_multmat3(&m, &m2, &out); + return out; +} + +Mat4 mat4(Vec4 c1, Vec4 c2, Vec4 c3, Vec4 c4) { + Mat4 m ; + m.axisx = c1; + m.axisy = c2; + m.axisz = c3; + m.pos = c4; + return m; +} + +Vec3 mat4_mulvec3(Mat4 m, Vec3 v) { + Vec4 v2 = {v.x, v.y, v.z, 0}; + return mat4_mulvec4(m, v2).xyz; +} + +Vec4 mat4_mulvec4(Mat4 m, Vec4 v) { + Vec4 out; + internal_mat4_mulvec4(&m, &v, &out); + return out; +} + +Mat4 mat4_mulmat4(Mat4 m1, Mat4 m2) { + Mat4 out; + internal_mat4_multiply(&m1, &m2, &out); + return out; +} diff --git a/src/shaders/common/mathlib.h b/src/shaders/common/mathlib.h new file mode 100644 index 0000000..fcc54ea --- /dev/null +++ b/src/shaders/common/mathlib.h @@ -0,0 +1,63 @@ +#ifndef SSR_SHADER_MATH_H +#define SSR_SHADER_MATH_H + +#include "../../math/structs.h" + +/************************************************************************/ +/* constants */ +/************************************************************************/ + +#define SSR_PI 3.14159265359f +#define SSR_TWO_PI 6.28318530718f +#define SSR_FOUR_PI 12.56637061436f +#define SSR_INV_PI 0.31830988618f +#define SSR_INV_TWO_PI 0.15915494309f +#define SSR_INV_FOUR_PI 0.07957747155f +#define SSR_HALF_PI 1.57079632679f +#define SSR_INV_HALF_PI 0.636619772367f + +/************************************************************************/ +/* Vec3 */ +/************************************************************************/ +Vec2 vec2(float x, float y); +Vec2 vec2_minus(Vec2 v1, Vec2 v2); +Vec2 vec2_plus(Vec2 v1, Vec2 v2); +float vec2_dot(Vec2 v1, Vec2 v2); + +/************************************************************************/ +/* Vec3 */ +/************************************************************************/ +Vec3 vec3(float x, float y, float z); +Vec3 vec3_minus(Vec3 v1, Vec3 v2); +Vec3 vec3_plus(Vec3 v1, Vec3 v2); +float vec3_dot(Vec3 v1, Vec3 v2); +Vec3 vec3_cross(Vec3 v1, Vec3 v2); +Vec3 vec3_lerp(Vec3 v1, Vec3 v2, float t); +Vec3 vec3_slerp(Vec3 v1, Vec3 v2, float t); +Vec3 vec3_scale(Vec3 v, float scale); +Vec3 vec3_normalize(Vec3 v); + +/************************************************************************/ +/* Vec4 */ +/************************************************************************/ +Vec4 vec4(float x, float y, float z, float w); +Vec4 vec4_minus(Vec4 v1, Vec4 v2); +Vec4 vec4_plus(Vec4 v1, Vec4 v2); +Vec4 vec4_scale(Vec4 v, float scale); +Vec4 vec4_saturate(Vec4 v); +Vec4 vec4_normalize(Vec4 v); + +/************************************************************************/ +/* Matrix */ +/************************************************************************/ +Mat3 mat3(Vec3 colum1, Vec3 colum2, Vec3 colum3); // colum major +Vec3 mat3_mulvec3(Mat3 m, Vec3 v); +Mat3 mat3_mulmat3(Mat3 m, Mat3 m2); + +Mat4 mat4(Vec4 colum1, Vec4 colum2, Vec4 colum3, Vec4 colum4); +Vec3 mat4_mulvec3(Mat4 m, Vec3 v); +Vec4 mat4_mulvec4(Mat4 m, Vec4 v); +Mat4 mat4_mulmat4(Mat4 m, Mat4 m2); + + +#endif
\ No newline at end of file diff --git a/src/shaders/common/shadow.c b/src/shaders/common/shadow.c new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/src/shaders/common/shadow.c diff --git a/src/shaders/common/shadow.h b/src/shaders/common/shadow.h new file mode 100644 index 0000000..2fef82d --- /dev/null +++ b/src/shaders/common/shadow.h @@ -0,0 +1,6 @@ +#ifndef _SSR_SHADOW_H_ +#define _SSR_SHADOW_H_ + + + +#endif
\ No newline at end of file diff --git a/src/shaders/default.c b/src/shaders/default.c index 6d12c8e..d348cdf 100644 --- a/src/shaders/default.c +++ b/src/shaders/default.c @@ -1,4 +1,4 @@ -#include "common.h" +#include "common/core.h" /*uniforms*/ #define object2world UM4(0) diff --git a/src/shaders/pbr.c b/src/shaders/pbr.c index 89556af..bbf1c2b 100644 --- a/src/shaders/pbr.c +++ b/src/shaders/pbr.c @@ -1,4 +1,4 @@ -#include "common.h" +#include "common/core.h" /*uniforms*/ #define _object2world UM4(0) @@ -22,14 +22,8 @@ static void vert(UniformCollection* uniforms, VertexShaderIn* in, Vec4* clipcoord) { static Vec4 p; p.xyz = in->vertex->position; p.w = 1; object2clip(&p, clipcoord); - Vec4 normal = { - in->vertex->normal.x, - in->vertex->normal.y, - in->vertex->normal.z, - 1 - }; - Vec4 worldnormal; internal_mat4_mulvec4(_object2world, &normal, &worldnormal); - internal_vec3_normalize(_light, _light); + Vec3 worldnormal = mat4_mulvec3(*_object2world, in->vertex->normal); + worldnormal = vec3_normalize(worldnormal); //*rough = 1 - internal_vec3_dot(&worldnormal, light); //*vnormal = in->vertex->normal; *_texcoord = in->vertex->texcoord; @@ -37,7 +31,7 @@ static void vert(UniformCollection* uniforms, VertexShaderIn* in, Vec4* clipcoor _clip_pos->y = clipcoord->w; } -static bool frag(UniformCollection* uniforms, FragmentShaderIn* in, Color32* color) { +static bool frag(UniformCollection* uniforms, FragmentShaderIn* in, Vec4* color) { //internal_vec3_normalize(light, light); //internal_vec3_normalize(vnormal, vnormal); //float roughness = *rough; @@ -50,11 +44,10 @@ static bool frag(UniformCollection* uniforms, FragmentShaderIn* in, Color32* col float depth = _clip_pos->x / _clip_pos->y; depth = (depth + 1) / 2; depth = linear01depth(depth); - Color32 c = tex2d(_albedo_tex, _texcoord); + Vec4 c = tex2d(_albedo_tex, _texcoord); //Color32 nc = tex2d(noramltex, in->texcoord); //internal_vec3_scale(&c, roughness, &c); - color32_saturate(&c); - *color = c; + *color = vec4_saturate(c); //internal_vec3_scale(color, 1 - depth, color); return 1; } diff --git a/src/shaders/unlit.c b/src/shaders/unlit.c index e887d07..5e1b1c1 100644 --- a/src/shaders/unlit.c +++ b/src/shaders/unlit.c @@ -1,4 +1,4 @@ -#include "common.h" +#include "common/core.h" /*uniforms*/ #define object2world UM4(0) |