diff options
Diffstat (limited to 'src/shaders/pbr.c')
-rw-r--r-- | src/shaders/pbr.c | 65 |
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 |