12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- #version 450
-
- #extension GL_ARB_separate_shader_objects : enable
- #extension GL_ARB_shading_language_420pack : enable
-
- layout (input_attachment_index = 0, binding = 0) uniform subpassInput samplerposition;
- layout (input_attachment_index = 1, binding = 1) uniform subpassInput samplerNormal;
- layout (input_attachment_index = 2, binding = 2) uniform subpassInput samplerAlbedo;
-
- layout (location = 0) in vec2 inUV;
-
- layout (location = 0) out vec4 outColor;
-
- layout (constant_id = 0) const int NUM_LIGHTS = 64;
-
- struct Light {
- vec4 position;
- vec3 color;
- float radius;
- };
-
- layout (binding = 3) uniform UBO
- {
- vec4 viewPos;
- Light lights[NUM_LIGHTS];
- } ubo;
-
-
- void main()
- {
- // Read G-Buffer values from previous sub pass
- vec3 fragPos = subpassLoad(samplerposition).rgb;
- vec3 normal = subpassLoad(samplerNormal).rgb;
- vec4 albedo = subpassLoad(samplerAlbedo);
-
- #define ambient 0.15
-
- // Ambient part
- vec3 fragcolor = albedo.rgb * ambient;
-
- for(int i = 0; i < NUM_LIGHTS; ++i)
- {
- // Vector to light
- vec3 L = ubo.lights[i].position.xyz - fragPos;
- // Distance from light to fragment position
- float dist = length(L);
-
- // Viewer to fragment
- vec3 V = ubo.viewPos.xyz - fragPos;
- V = normalize(V);
-
- // Light to fragment
- L = normalize(L);
-
- // Attenuation
- float atten = ubo.lights[i].radius / (pow(dist, 2.0) + 1.0);
-
- // Diffuse part
- vec3 N = normalize(normal);
- float NdotL = max(0.0, dot(N, L));
- vec3 diff = ubo.lights[i].color * albedo.rgb * NdotL * atten;
-
- // Specular part
- // Specular map values are stored in alpha of albedo mrt
- vec3 R = reflect(-L, N);
- float NdotR = max(0.0, dot(R, V));
- //vec3 spec = ubo.lights[i].color * albedo.a * pow(NdotR, 32.0) * atten;
-
- fragcolor += diff;// + spec;
- }
-
- outColor = vec4(fragcolor, 1.0);
- }
|