summaryrefslogtreecommitdiff
path: root/src/shaders/pbr.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/shaders/pbr.c')
-rw-r--r--src/shaders/pbr.c65
1 files changed, 65 insertions, 0 deletions
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