60 lines
1.4 KiB
GLSL
60 lines
1.4 KiB
GLSL
// 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);
|
|
}
|
|
} |