| @ -0,0 +1,41 @@ | |||||
| #version 330 | |||||
| // Input vertex attributes (from vertex shader) | |||||
| in vec2 fragTexCoord; | |||||
| in vec4 fragColor; | |||||
| // Input uniform values | |||||
| uniform sampler2D texture0; | |||||
| uniform vec4 colDiffuse; | |||||
| // Output fragment color | |||||
| out vec4 finalColor; | |||||
| // NOTE: Add here your custom variables | |||||
| uniform vec2 resolution = vec2(800, 450); | |||||
| void main() | |||||
| { | |||||
| float x = 1.0/resolution.x; | |||||
| float y = 1.0/resolution.y; | |||||
| vec4 horizEdge = vec4(0.0); | |||||
| horizEdge -= texture2D(texture0, vec2(fragTexCoord.x - x, fragTexCoord.y - y))*1.0; | |||||
| horizEdge -= texture2D(texture0, vec2(fragTexCoord.x - x, fragTexCoord.y ))*2.0; | |||||
| horizEdge -= texture2D(texture0, vec2(fragTexCoord.x - x, fragTexCoord.y + y))*1.0; | |||||
| horizEdge += texture2D(texture0, vec2(fragTexCoord.x + x, fragTexCoord.y - y))*1.0; | |||||
| horizEdge += texture2D(texture0, vec2(fragTexCoord.x + x, fragTexCoord.y ))*2.0; | |||||
| horizEdge += texture2D(texture0, vec2(fragTexCoord.x + x, fragTexCoord.y + y))*1.0; | |||||
| vec4 vertEdge = vec4(0.0); | |||||
| vertEdge -= texture2D(texture0, vec2(fragTexCoord.x - x, fragTexCoord.y - y))*1.0; | |||||
| vertEdge -= texture2D(texture0, vec2(fragTexCoord.x , fragTexCoord.y - y))*2.0; | |||||
| vertEdge -= texture2D(texture0, vec2(fragTexCoord.x + x, fragTexCoord.y - y))*1.0; | |||||
| vertEdge += texture2D(texture0, vec2(fragTexCoord.x - x, fragTexCoord.y + y))*1.0; | |||||
| vertEdge += texture2D(texture0, vec2(fragTexCoord.x , fragTexCoord.y + y))*2.0; | |||||
| vertEdge += texture2D(texture0, vec2(fragTexCoord.x + x, fragTexCoord.y + y))*1.0; | |||||
| vec3 edge = sqrt((horizEdge.rgb*horizEdge.rgb) + (vertEdge.rgb*vertEdge.rgb)); | |||||
| gl_FragColor = vec4(edge, texture2D(texture0, fragTexCoord).a); | |||||
| } | |||||
| @ -0,0 +1,26 @@ | |||||
| #version 330 | |||||
| // Input vertex attributes (from vertex shader) | |||||
| in vec2 fragTexCoord; | |||||
| in vec4 fragColor; | |||||
| // Input uniform values | |||||
| uniform sampler2D texture0; | |||||
| uniform vec4 colDiffuse; | |||||
| // Output fragment color | |||||
| out vec4 finalColor; | |||||
| // NOTE: Add here your custom variables | |||||
| void main() | |||||
| { | |||||
| // To show overdraw, we just render all the fragments | |||||
| // with a solid color and some transparency | |||||
| // NOTE: This is not a postpro render, | |||||
| // it will only render all screen texture in a plain color | |||||
| finalColor = vec4(1.0, 0.0, 0.0, 0.2); | |||||
| } | |||||
| @ -0,0 +1,41 @@ | |||||
| #version 330 | |||||
| // Input vertex attributes (from vertex shader) | |||||
| in vec2 fragTexCoord; | |||||
| in vec4 fragColor; | |||||
| // Input uniform values | |||||
| uniform sampler2D texture0; | |||||
| uniform vec4 colDiffuse; | |||||
| // Output fragment color | |||||
| out vec4 finalColor; | |||||
| // NOTE: Add here your custom variables | |||||
| uniform vec2 resolution = vec2(800, 450); | |||||
| void main() | |||||
| { | |||||
| float x = 1.0/resolution.x; | |||||
| float y = 1.0/resolution.y; | |||||
| vec4 horizEdge = vec4(0.0); | |||||
| horizEdge -= texture2D(texture0, vec2(fragTexCoord.x - x, fragTexCoord.y - y))*1.0; | |||||
| horizEdge -= texture2D(texture0, vec2(fragTexCoord.x - x, fragTexCoord.y ))*2.0; | |||||
| horizEdge -= texture2D(texture0, vec2(fragTexCoord.x - x, fragTexCoord.y + y))*1.0; | |||||
| horizEdge += texture2D(texture0, vec2(fragTexCoord.x + x, fragTexCoord.y - y))*1.0; | |||||
| horizEdge += texture2D(texture0, vec2(fragTexCoord.x + x, fragTexCoord.y ))*2.0; | |||||
| horizEdge += texture2D(texture0, vec2(fragTexCoord.x + x, fragTexCoord.y + y))*1.0; | |||||
| vec4 vertEdge = vec4(0.0); | |||||
| vertEdge -= texture2D(texture0, vec2(fragTexCoord.x - x, fragTexCoord.y - y))*1.0; | |||||
| vertEdge -= texture2D(texture0, vec2(fragTexCoord.x , fragTexCoord.y - y))*2.0; | |||||
| vertEdge -= texture2D(texture0, vec2(fragTexCoord.x + x, fragTexCoord.y - y))*1.0; | |||||
| vertEdge += texture2D(texture0, vec2(fragTexCoord.x - x, fragTexCoord.y + y))*1.0; | |||||
| vertEdge += texture2D(texture0, vec2(fragTexCoord.x , fragTexCoord.y + y))*2.0; | |||||
| vertEdge += texture2D(texture0, vec2(fragTexCoord.x + x, fragTexCoord.y + y))*1.0; | |||||
| vec3 edge = sqrt((horizEdge.rgb*horizEdge.rgb) + (vertEdge.rgb*vertEdge.rgb)); | |||||
| finalColor = vec4(edge, texture2D(texture0, fragTexCoord).a); | |||||
| } | |||||
| @ -1,26 +0,0 @@ | |||||
| #version 100 | |||||
| // Input vertex attributes | |||||
| attribute vec3 vertexPosition; | |||||
| attribute vec2 vertexTexCoord; | |||||
| attribute vec3 vertexNormal; | |||||
| attribute vec4 vertexColor; | |||||
| // Input uniform values | |||||
| uniform mat4 mvpMatrix; | |||||
| // Output vertex attributes (to fragment shader) | |||||
| varying vec2 fragTexCoord; | |||||
| varying vec4 fragColor; | |||||
| // NOTE: Add here your custom variables | |||||
| void main() | |||||
| { | |||||
| // Send vertex attributes to fragment shader | |||||
| fragTexCoord = vertexTexCoord; | |||||
| fragColor = vertexColor; | |||||
| // Calculate final vertex position | |||||
| gl_Position = mvpMatrix*vec4(vertexPosition, 1.0); | |||||
| } | |||||
| @ -1,39 +0,0 @@ | |||||
| #version 100 | |||||
| precision mediump float; | |||||
| // Input vertex attributes (from vertex shader) | |||||
| varying vec2 fragTexCoord; | |||||
| varying vec4 fragColor; | |||||
| // Input uniform values | |||||
| uniform sampler2D texture0; | |||||
| uniform vec4 colDiffuse; | |||||
| // NOTE: Add here your custom variables | |||||
| const vec2 size = vec2(800, 450); // render size | |||||
| const float samples = 5.0; // pixels per axis; higher = bigger glow, worse performance | |||||
| const float quality = 2.5; // lower = smaller glow, better quality | |||||
| void main() | |||||
| { | |||||
| vec4 sum = vec4(0); | |||||
| vec2 sizeFactor = vec2(1)/size*quality; | |||||
| // Texel color fetching from texture sampler | |||||
| vec4 source = texture2D(texture0, fragTexCoord); | |||||
| const int range = 2; // should be = (samples - 1)/2; | |||||
| for (int x = -range; x <= range; x++) | |||||
| { | |||||
| for (int y = -range; y <= range; y++) | |||||
| { | |||||
| sum += texture2D(texture0, fragTexCoord + vec2(x, y)*sizeFactor); | |||||
| } | |||||
| } | |||||
| // Calculate final fragment color | |||||
| gl_FragColor = ((sum/(samples*samples)) + source)*colDiffuse; | |||||
| } | |||||
| @ -1,25 +0,0 @@ | |||||
| #version 100 | |||||
| precision mediump float; | |||||
| // Input vertex attributes (from vertex shader) | |||||
| varying vec2 fragTexCoord; | |||||
| varying vec4 fragColor; | |||||
| // Input uniform values | |||||
| uniform sampler2D texture0; | |||||
| uniform vec4 colDiffuse; | |||||
| // NOTE: Add here your custom variables | |||||
| void main() | |||||
| { | |||||
| // Texel color fetching from texture sampler | |||||
| vec4 texelColor = texture2D(texture0, fragTexCoord)*colDiffuse*fragColor; | |||||
| // Convert texel color to grayscale using NTSC conversion weights | |||||
| float gray = dot(texelColor.rgb, vec3(0.299, 0.587, 0.114)); | |||||
| // Calculate final fragment color | |||||
| gl_FragColor = vec4(gray, gray, gray, texelColor.a); | |||||
| } | |||||
| @ -1,150 +0,0 @@ | |||||
| #version 100 | |||||
| precision mediump float; | |||||
| varying vec3 fragPosition; | |||||
| varying vec2 fragTexCoord; | |||||
| varying vec4 fragColor; | |||||
| varying vec3 fragNormal; | |||||
| uniform sampler2D texture0; | |||||
| uniform sampler2D texture1; | |||||
| uniform sampler2D texture2; | |||||
| uniform vec4 colAmbient; | |||||
| uniform vec4 colDiffuse; | |||||
| uniform vec4 colSpecular; | |||||
| uniform float glossiness; | |||||
| uniform int useNormal; | |||||
| uniform int useSpecular; | |||||
| uniform mat4 modelMatrix; | |||||
| uniform vec3 viewDir; | |||||
| struct Light { | |||||
| int enabled; | |||||
| int type; | |||||
| vec3 position; | |||||
| vec3 direction; | |||||
| vec4 diffuse; | |||||
| float intensity; | |||||
| float radius; | |||||
| float coneAngle; | |||||
| }; | |||||
| const int maxLights = 8; | |||||
| uniform Light lights[maxLights]; | |||||
| vec3 CalcPointLight(Light l, vec3 n, vec3 v, float s) | |||||
| { | |||||
| vec3 surfacePos = vec3(modelMatrix*vec4(fragPosition, 1)); | |||||
| vec3 surfaceToLight = l.position - surfacePos; | |||||
| // Diffuse shading | |||||
| float brightness = clamp(dot(n, surfaceToLight)/(length(surfaceToLight)*length(n)), 0, 1); | |||||
| float diff = 1.0/dot(surfaceToLight/l.radius, surfaceToLight/l.radius)*brightness*l.intensity; | |||||
| // Specular shading | |||||
| float spec = 0.0; | |||||
| if (diff > 0.0) | |||||
| { | |||||
| vec3 h = normalize(-l.direction + v); | |||||
| spec = pow(dot(n, h), 3 + glossiness)*s; | |||||
| } | |||||
| return (diff*l.diffuse.rgb + spec*colSpecular.rgb); | |||||
| } | |||||
| vec3 CalcDirectionalLight(Light l, vec3 n, vec3 v, float s) | |||||
| { | |||||
| vec3 lightDir = normalize(-l.direction); | |||||
| // Diffuse shading | |||||
| float diff = clamp(dot(n, lightDir), 0.0, 1.0)*l.intensity; | |||||
| // Specular shading | |||||
| float spec = 0.0; | |||||
| if (diff > 0.0) | |||||
| { | |||||
| vec3 h = normalize(lightDir + v); | |||||
| spec = pow(dot(n, h), 3 + glossiness)*s; | |||||
| } | |||||
| // Combine results | |||||
| return (diff*l.intensity*l.diffuse.rgb + spec*colSpecular.rgb); | |||||
| } | |||||
| vec3 CalcSpotLight(Light l, vec3 n, vec3 v, float s) | |||||
| { | |||||
| vec3 surfacePos = vec3(modelMatrix*vec4(fragPosition, 1)); | |||||
| vec3 lightToSurface = normalize(surfacePos - l.position); | |||||
| vec3 lightDir = normalize(-l.direction); | |||||
| // Diffuse shading | |||||
| float diff = clamp(dot(n, lightDir), 0.0, 1.0)*l.intensity; | |||||
| // Spot attenuation | |||||
| float attenuation = clamp(dot(n, lightToSurface), 0.0, 1.0); | |||||
| attenuation = dot(lightToSurface, -lightDir); | |||||
| float lightToSurfaceAngle = degrees(acos(attenuation)); | |||||
| if (lightToSurfaceAngle > l.coneAngle) attenuation = 0.0; | |||||
| float falloff = (l.coneAngle - lightToSurfaceAngle)/l.coneAngle; | |||||
| // Combine diffuse and attenuation | |||||
| float diffAttenuation = diff*attenuation; | |||||
| // Specular shading | |||||
| float spec = 0.0; | |||||
| if (diffAttenuation > 0.0) | |||||
| { | |||||
| vec3 h = normalize(lightDir + v); | |||||
| spec = pow(dot(n, h), 3 + glossiness)*s; | |||||
| } | |||||
| return (falloff*(diffAttenuation*l.diffuse.rgb + spec*colSpecular.rgb)); | |||||
| } | |||||
| void main() | |||||
| { | |||||
| // Calculate fragment normal in screen space | |||||
| // NOTE: important to multiply model matrix by fragment normal to apply model transformation (rotation and scale) | |||||
| mat3 normalMatrix = transpose(inverse(mat3(modelMatrix))); | |||||
| vec3 normal = normalize(normalMatrix*fragNormal); | |||||
| // Normalize normal and view direction vectors | |||||
| vec3 n = normalize(normal); | |||||
| vec3 v = normalize(viewDir); | |||||
| // Calculate diffuse texture color fetching | |||||
| vec4 texelColor = texture2D(texture0, fragTexCoord); | |||||
| vec3 lighting = colAmbient.rgb; | |||||
| // Calculate normal texture color fetching or set to maximum normal value by default | |||||
| if (useNormal == 1) | |||||
| { | |||||
| n *= texture2D(texture1, fragTexCoord).rgb; | |||||
| n = normalize(n); | |||||
| } | |||||
| // Calculate specular texture color fetching or set to maximum specular value by default | |||||
| float spec = 1.0; | |||||
| if (useSpecular == 1) spec *= normalize(texture2D(texture2, fragTexCoord).r); | |||||
| for (int i = 0; i < maxLights; i++) | |||||
| { | |||||
| // Check if light is enabled | |||||
| if (lights[i].enabled == 1) | |||||
| { | |||||
| // Calculate lighting based on light type | |||||
| if(lights[i].type == 0) lighting += CalcPointLight(lights[i], n, v, spec); | |||||
| else if(lights[i].type == 1) lighting += CalcDirectionalLight(lights[i], n, v, spec); | |||||
| else if(lights[i].type == 2) lighting += CalcSpotLight(lights[i], n, v, spec); | |||||
| } | |||||
| } | |||||
| // Calculate final fragment color | |||||
| gl_FragColor = vec4(texelColor.rgb*lighting*colDiffuse.rgb, texelColor.a*colDiffuse.a); | |||||
| } | |||||
| @ -1,23 +0,0 @@ | |||||
| #version 100 | |||||
| attribute vec3 vertexPosition; | |||||
| attribute vec3 vertexNormal; | |||||
| attribute vec2 vertexTexCoord; | |||||
| attribute vec4 vertexColor; | |||||
| varying vec3 fragPosition; | |||||
| varying vec2 fragTexCoord; | |||||
| varying vec4 fragColor; | |||||
| varying vec3 fragNormal; | |||||
| uniform mat4 mvpMatrix; | |||||
| void main() | |||||
| { | |||||
| fragPosition = vertexPosition; | |||||
| fragTexCoord = vertexTexCoord; | |||||
| fragColor = vertexColor; | |||||
| fragNormal = vertexNormal; | |||||
| gl_Position = mvpMatrix*vec4(vertexPosition, 1.0); | |||||
| } | |||||
| @ -1,46 +0,0 @@ | |||||
| #version 100 | |||||
| precision mediump float; | |||||
| // Input vertex attributes (from vertex shader) | |||||
| varying vec2 fragTexCoord; | |||||
| varying vec4 fragColor; | |||||
| // Input uniform values | |||||
| uniform sampler2D texture0; | |||||
| uniform vec4 colDiffuse; | |||||
| // NOTE: Add here your custom variables | |||||
| // NOTE: Render size values must be passed from code | |||||
| const float renderWidth = 800; | |||||
| const float renderHeight = 450; | |||||
| float radius = 250.0; | |||||
| float angle = 0.8; | |||||
| uniform vec2 center = vec2(200.0, 200.0); | |||||
| void main() | |||||
| { | |||||
| vec2 texSize = vec2(renderWidth, renderHeight); | |||||
| vec2 tc = fragTexCoord*texSize; | |||||
| tc -= center; | |||||
| float dist = length(tc); | |||||
| if (dist < radius) | |||||
| { | |||||
| float percent = (radius - dist)/radius; | |||||
| float theta = percent*percent*angle*8.0; | |||||
| float s = sin(theta); | |||||
| float c = cos(theta); | |||||
| tc = vec2(dot(tc, vec2(c, -s)), dot(tc, vec2(s, c))); | |||||
| } | |||||
| tc += center; | |||||
| vec3 color = texture2D(texture0, tc/texSize).rgb; | |||||
| gl_FragColor = vec4(color, 1.0);; | |||||
| } | |||||
| @ -1,26 +0,0 @@ | |||||
| #version 330 | |||||
| // Input vertex attributes | |||||
| in vec3 vertexPosition; | |||||
| in vec2 vertexTexCoord; | |||||
| in vec3 vertexNormal; | |||||
| in vec4 vertexColor; | |||||
| // Input uniform values | |||||
| uniform mat4 mvpMatrix; | |||||
| // Output vertex attributes (to fragment shader) | |||||
| out vec2 fragTexCoord; | |||||
| out vec4 fragColor; | |||||
| // NOTE: Add here your custom variables | |||||
| void main() | |||||
| { | |||||
| // Send vertex attributes to fragment shader | |||||
| fragTexCoord = vertexTexCoord; | |||||
| fragColor = vertexColor; | |||||
| // Calculate final vertex position | |||||
| gl_Position = mvpMatrix*vec4(vertexPosition, 1.0); | |||||
| } | |||||
| @ -1,40 +0,0 @@ | |||||
| #version 330 | |||||
| // Input vertex attributes (from vertex shader) | |||||
| in vec2 fragTexCoord; | |||||
| in vec4 fragColor; | |||||
| // Input uniform values | |||||
| uniform sampler2D texture0; | |||||
| uniform vec4 colDiffuse; | |||||
| // Output fragment color | |||||
| out vec4 finalColor; | |||||
| // NOTE: Add here your custom variables | |||||
| const vec2 size = vec2(800, 450); // render size | |||||
| const float samples = 5.0; // pixels per axis; higher = bigger glow, worse performance | |||||
| const float quality = 2.5; // lower = smaller glow, better quality | |||||
| void main() | |||||
| { | |||||
| vec4 sum = vec4(0); | |||||
| vec2 sizeFactor = vec2(1)/size*quality; | |||||
| // Texel color fetching from texture sampler | |||||
| vec4 source = texture(texture0, fragTexCoord); | |||||
| const int range = 2; // should be = (samples - 1)/2; | |||||
| for (int x = -range; x <= range; x++) | |||||
| { | |||||
| for (int y = -range; y <= range; y++) | |||||
| { | |||||
| sum += texture(texture0, fragTexCoord + vec2(x, y)*sizeFactor); | |||||
| } | |||||
| } | |||||
| // Calculate final fragment color | |||||
| finalColor = ((sum/(samples*samples)) + source)*colDiffuse; | |||||
| } | |||||
| @ -1,27 +0,0 @@ | |||||
| #version 330 | |||||
| // Input vertex attributes (from vertex shader) | |||||
| in vec2 fragTexCoord; | |||||
| in vec4 fragColor; | |||||
| // Input uniform values | |||||
| uniform sampler2D texture0; // Depth texture | |||||
| uniform vec4 colDiffuse; | |||||
| // Output fragment color | |||||
| out vec4 finalColor; | |||||
| // NOTE: Add here your custom variables | |||||
| void main() | |||||
| { | |||||
| float zNear = 0.01; // camera z near | |||||
| float zFar = 10.0; // camera z far | |||||
| float z = texture(texture0, fragTexCoord).x; | |||||
| // Linearize depth value | |||||
| float depth = (2.0*zNear)/(zFar + zNear - z*(zFar - zNear)); | |||||
| // Calculate final fragment color | |||||
| finalColor = vec4(depth, depth, depth, 1.0f); | |||||
| } | |||||
| @ -1,26 +0,0 @@ | |||||
| #version 330 | |||||
| // Input vertex attributes (from vertex shader) | |||||
| in vec2 fragTexCoord; | |||||
| in vec4 fragColor; | |||||
| // Input uniform values | |||||
| uniform sampler2D texture0; | |||||
| uniform vec4 colDiffuse; | |||||
| // Output fragment color | |||||
| out vec4 finalColor; | |||||
| // NOTE: Add here your custom variables | |||||
| void main() | |||||
| { | |||||
| // Texel color fetching from texture sampler | |||||
| vec4 texelColor = texture(texture0, fragTexCoord)*colDiffuse*fragColor; | |||||
| // Convert texel color to grayscale using NTSC conversion weights | |||||
| float gray = dot(texelColor.rgb, vec3(0.299, 0.587, 0.114)); | |||||
| // Calculate final fragment color | |||||
| finalColor = vec4(gray, gray, gray, texelColor.a); | |||||
| } | |||||
| @ -1,150 +0,0 @@ | |||||
| #version 330 | |||||
| in vec3 fragPosition; | |||||
| in vec2 fragTexCoord; | |||||
| in vec4 fragColor; | |||||
| in vec3 fragNormal; | |||||
| out vec4 finalColor; | |||||
| uniform sampler2D texture0; | |||||
| uniform sampler2D texture1; | |||||
| uniform sampler2D texture2; | |||||
| uniform vec4 colAmbient; | |||||
| uniform vec4 colDiffuse; | |||||
| uniform vec4 colSpecular; | |||||
| uniform float glossiness; | |||||
| uniform int useNormal; | |||||
| uniform int useSpecular; | |||||
| uniform mat4 modelMatrix; | |||||
| uniform vec3 viewDir; | |||||
| struct Light { | |||||
| int enabled; | |||||
| int type; | |||||
| vec3 position; | |||||
| vec3 direction; | |||||
| vec4 diffuse; | |||||
| float intensity; | |||||
| float radius; | |||||
| float coneAngle; | |||||
| }; | |||||
| const int maxLights = 8; | |||||
| uniform Light lights[maxLights]; | |||||
| vec3 CalcPointLight(Light l, vec3 n, vec3 v, float s) | |||||
| { | |||||
| vec3 surfacePos = vec3(modelMatrix*vec4(fragPosition, 1)); | |||||
| vec3 surfaceToLight = l.position - surfacePos; | |||||
| // Diffuse shading | |||||
| float brightness = clamp(dot(n, surfaceToLight)/(length(surfaceToLight)*length(n)), 0, 1); | |||||
| float diff = 1.0/dot(surfaceToLight/l.radius, surfaceToLight/l.radius)*brightness*l.intensity; | |||||
| // Specular shading | |||||
| float spec = 0.0; | |||||
| if (diff > 0.0) | |||||
| { | |||||
| vec3 h = normalize(-l.direction + v); | |||||
| spec = pow(dot(n, h), 3 + glossiness)*s; | |||||
| } | |||||
| return (diff*l.diffuse.rgb + spec*colSpecular.rgb); | |||||
| } | |||||
| vec3 CalcDirectionalLight(Light l, vec3 n, vec3 v, float s) | |||||
| { | |||||
| vec3 lightDir = normalize(-l.direction); | |||||
| // Diffuse shading | |||||
| float diff = clamp(dot(n, lightDir), 0.0, 1.0)*l.intensity; | |||||
| // Specular shading | |||||
| float spec = 0.0; | |||||
| if (diff > 0.0) | |||||
| { | |||||
| vec3 h = normalize(lightDir + v); | |||||
| spec = pow(dot(n, h), 3 + glossiness)*s; | |||||
| } | |||||
| // Combine results | |||||
| return (diff*l.intensity*l.diffuse.rgb + spec*colSpecular.rgb); | |||||
| } | |||||
| vec3 CalcSpotLight(Light l, vec3 n, vec3 v, float s) | |||||
| { | |||||
| vec3 surfacePos = vec3(modelMatrix*vec4(fragPosition, 1)); | |||||
| vec3 lightToSurface = normalize(surfacePos - l.position); | |||||
| vec3 lightDir = normalize(-l.direction); | |||||
| // Diffuse shading | |||||
| float diff = clamp(dot(n, lightDir), 0.0, 1.0)*l.intensity; | |||||
| // Spot attenuation | |||||
| float attenuation = clamp(dot(n, lightToSurface), 0.0, 1.0); | |||||
| attenuation = dot(lightToSurface, -lightDir); | |||||
| float lightToSurfaceAngle = degrees(acos(attenuation)); | |||||
| if (lightToSurfaceAngle > l.coneAngle) attenuation = 0.0; | |||||
| float falloff = (l.coneAngle - lightToSurfaceAngle)/l.coneAngle; | |||||
| // Combine diffuse and attenuation | |||||
| float diffAttenuation = diff*attenuation; | |||||
| // Specular shading | |||||
| float spec = 0.0; | |||||
| if (diffAttenuation > 0.0) | |||||
| { | |||||
| vec3 h = normalize(lightDir + v); | |||||
| spec = pow(dot(n, h), 3 + glossiness)*s; | |||||
| } | |||||
| return (falloff*(diffAttenuation*l.diffuse.rgb + spec*colSpecular.rgb)); | |||||
| } | |||||
| void main() | |||||
| { | |||||
| // Calculate fragment normal in screen space | |||||
| // NOTE: important to multiply model matrix by fragment normal to apply model transformation (rotation and scale) | |||||
| mat3 normalMatrix = transpose(inverse(mat3(modelMatrix))); | |||||
| vec3 normal = normalize(normalMatrix*fragNormal); | |||||
| // Normalize normal and view direction vectors | |||||
| vec3 n = normalize(normal); | |||||
| vec3 v = normalize(viewDir); | |||||
| // Calculate diffuse texture color fetching | |||||
| vec4 texelColor = texture(texture0, fragTexCoord); | |||||
| vec3 lighting = colAmbient.rgb; | |||||
| // Calculate normal texture color fetching or set to maximum normal value by default | |||||
| if (useNormal == 1) | |||||
| { | |||||
| n *= texture(texture1, fragTexCoord).rgb; | |||||
| n = normalize(n); | |||||
| } | |||||
| // Calculate specular texture color fetching or set to maximum specular value by default | |||||
| float spec = 1.0; | |||||
| if (useSpecular == 1) spec *= normalize(texture(texture2, fragTexCoord).r); | |||||
| for (int i = 0; i < maxLights; i++) | |||||
| { | |||||
| // Check if light is enabled | |||||
| if (lights[i].enabled == 1) | |||||
| { | |||||
| // Calculate lighting based on light type | |||||
| if(lights[i].type == 0) lighting += CalcPointLight(lights[i], n, v, spec); | |||||
| else if(lights[i].type == 1) lighting += CalcDirectionalLight(lights[i], n, v, spec); | |||||
| else if(lights[i].type == 2) lighting += CalcSpotLight(lights[i], n, v, spec); | |||||
| } | |||||
| } | |||||
| // Calculate final fragment color | |||||
| finalColor = vec4(texelColor.rgb*lighting*colDiffuse.rgb, texelColor.a*colDiffuse.a); | |||||
| } | |||||
| @ -1,23 +0,0 @@ | |||||
| #version 330 | |||||
| in vec3 vertexPosition; | |||||
| in vec3 vertexNormal; | |||||
| in vec2 vertexTexCoord; | |||||
| in vec4 vertexColor; | |||||
| out vec3 fragPosition; | |||||
| out vec2 fragTexCoord; | |||||
| out vec4 fragColor; | |||||
| out vec3 fragNormal; | |||||
| uniform mat4 mvpMatrix; | |||||
| void main() | |||||
| { | |||||
| fragPosition = vertexPosition; | |||||
| fragTexCoord = vertexTexCoord; | |||||
| fragColor = vertexColor; | |||||
| fragNormal = vertexNormal; | |||||
| gl_Position = mvpMatrix*vec4(vertexPosition, 1.0); | |||||
| } | |||||
| @ -1,47 +0,0 @@ | |||||
| #version 330 | |||||
| // Input vertex attributes (from vertex shader) | |||||
| in vec2 fragTexCoord; | |||||
| in vec4 fragColor; | |||||
| // Input uniform values | |||||
| uniform sampler2D texture0; | |||||
| uniform vec4 colDiffuse; | |||||
| // Output fragment color | |||||
| out vec4 finalColor; | |||||
| // NOTE: Add here your custom variables | |||||
| // NOTE: Render size values must be passed from code | |||||
| const float renderWidth = 800; | |||||
| const float renderHeight = 450; | |||||
| float radius = 250.0; | |||||
| float angle = 0.8; | |||||
| uniform vec2 center = vec2(200.0, 200.0); | |||||
| void main() | |||||
| { | |||||
| vec2 texSize = vec2(renderWidth, renderHeight); | |||||
| vec2 tc = fragTexCoord*texSize; | |||||
| tc -= center; | |||||
| float dist = length(tc); | |||||
| if (dist < radius) | |||||
| { | |||||
| float percent = (radius - dist)/radius; | |||||
| float theta = percent*percent*angle*8.0; | |||||
| float s = sin(theta); | |||||
| float c = cos(theta); | |||||
| tc = vec2(dot(tc, vec2(c, -s)), dot(tc, vec2(s, c))); | |||||
| } | |||||
| tc += center; | |||||
| vec3 color = texture(texture0, tc/texSize).rgb; | |||||
| finalColor = vec4(color, 1.0);; | |||||
| } | |||||