// shader.frag #version 450 struct Material { vec4 albedo; }; // Variables layout(location=0) in vec2 vert_uv; layout(location=0) out vec4 out_color; layout(set=0,binding=0) uniform Uniforms { mat4 _ViewMatrix; mat4 _ProjMatrixInv; vec3 _CamPos; vec3 _SunDir; float _Time; }; layout(set=1,binding=0) uniform usampler3D _NodesTexture; layout(set=2,binding=0) uniform usampler3D _BricksTexture; layout(set=3, binding=0) uniform Materials { Material _Materials[256]; }; // Defines // #define PI 3.141592 // #define EPSILON 0.01 // #define NEAR 0.01 // Include #include "structs.cginc" #include "shading.cginc" #include "raycasting.cginc" void main() { // Black by default out_color = vec4(0,0,0,1); // Calculate ray direction vec3 view_dir = (_ProjMatrixInv * vec4(vert_uv, 0, 1)).xyz; vec3 ray_dir = normalize(_ViewMatrix * vec4(view_dir,0)).xyz; // Raycast HitResult primary = castNodes(_CamPos, ray_dir); if(primary.data > 0) { out_color = vec4(applyLighting(primary.pos, ray_dir, primary.normal, primary.data), 1.0); HitResult shadow = castNodes(primary.pos-ray_dir*0.000001, _SunDir); if(shadow.data > 0) out_color *= 0.1; } else { float up = clamp(dot(ray_dir, vec3(0, 1, 0)) + 0.1, 0, 1); vec3 sky = vec3(0.176, 0.592, 0.901) * up; out_color = vec4(sky, 1.0); } }