123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- #version 450
-
- #extension GL_ARB_separate_shader_objects : enable
- #extension GL_ARB_shading_language_420pack : enable
-
- layout (binding = 1) uniform sampler2D samplerposition;
- layout (binding = 2) uniform sampler2D samplerNormal;
- layout (binding = 3) uniform sampler2D samplerAlbedo;
-
- layout (location = 0) in vec2 inUV;
-
- layout (location = 0) out vec4 outFragcolor;
-
- struct Light {
- vec4 position;
- vec3 color;
- float radius;
- };
-
- layout (binding = 4) uniform UBO
- {
- Light lights[6];
- vec4 viewPos;
- } ubo;
-
-
- void main()
- {
- // Get G-Buffer values
- vec3 fragPos = texture(samplerposition, inUV).rgb;
- vec3 normal = texture(samplerNormal, inUV).rgb;
- vec4 albedo = texture(samplerAlbedo, inUV);
-
- #define lightCount 6
- #define ambient 0.0
-
- // Ambient part
- vec3 fragcolor = albedo.rgb * ambient;
-
- for(int i = 0; i < lightCount; ++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);
-
- //if(dist < ubo.lights[i].radius)
- {
- // 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, 16.0) * atten;
-
- fragcolor += diff + spec;
- }
- }
-
- outFragcolor = vec4(fragcolor, 1.0);
- }
|