77 lines
2.2 KiB
GLSL
77 lines
2.2 KiB
GLSL
#version 430
|
|
|
|
uniform mat4 model;
|
|
uniform mat4 view;
|
|
|
|
layout(binding=0) uniform sampler2D texture;
|
|
|
|
uniform vec3 lightPosition;
|
|
uniform float constantAttenuation;
|
|
uniform float linearAttenuation;
|
|
uniform float quadraticAttenuation;
|
|
|
|
in VertexData {
|
|
vec3 Position;
|
|
vec3 Normal;
|
|
vec2 TextureCoord;
|
|
} Input;
|
|
|
|
out vec4 fragmentColor;
|
|
|
|
void main() {
|
|
// Texture
|
|
vec4 texel = texture2D(texture, Input.TextureCoord);
|
|
//vec4 texel1 = texture2D(texture1, Input.TextureCoord * 32.0);
|
|
//vec4 texel2 = texture2D(texture2, Input.TextureCoord * 100.0);
|
|
//vec4 blend = texture2D(blendmap, Input.TextureCoord);
|
|
|
|
//vec4 texel = (blend.x * texel0) + (blend.y * texel1) + (blend.z * texel2);
|
|
|
|
//
|
|
// Phong shading
|
|
//
|
|
|
|
// Light
|
|
//vec3 lightPosition = vec3(0, 0, 2);
|
|
vec3 Ls = vec3(1.0, 1.0, 0.9); // Specular light
|
|
vec3 Ld = vec3(1.0, 1.0, 0.9); // Diffuse light
|
|
vec3 La = vec3(0.6, 0.6, 0.6); // Ambient light
|
|
|
|
// Object
|
|
vec3 Ks = vec3(0.3, 0.3, 0.3); // Specular reflectance
|
|
vec3 Kd = vec3(1.0, 1.0, 1.0); // Diffuse reflectance
|
|
vec3 Ka = vec3(1.0, 1.0, 1.0); // Ambient reflectance
|
|
|
|
vec3 lightPosView = vec3(view * vec4(lightPosition, 1.0));
|
|
vec3 surfacePosition = vec3(model * vec4(Input.Position, 1.0));
|
|
vec3 surfacePosView = vec3(view * vec4(surfacePosition, 1.0));
|
|
vec3 surfaceToLight = normalize(lightPosView - surfacePosView);
|
|
mat3 normalMatrix = transpose(inverse(mat3(view * model)));
|
|
vec3 surfaceNormal = normalize(normalMatrix * Input.Normal);
|
|
|
|
// Specular light
|
|
vec3 reflection = reflect(-surfaceToLight, surfaceNormal);
|
|
float dotSpecular = dot(reflection, normalize(-surfacePosView));
|
|
dotSpecular = max(dotSpecular, 0.0);
|
|
float specularFactor = pow(dotSpecular, 30.0); // Specular factor
|
|
vec3 Is = Ls * Ks * specularFactor;
|
|
|
|
// Diffuse light
|
|
float dotProd = dot(surfaceToLight, surfaceNormal);
|
|
dotProd = max(dotProd, 0.0);
|
|
vec3 Id = Ld * Kd * abs(dotProd);
|
|
|
|
// Ambient light
|
|
vec3 Ia = La * Ka;
|
|
|
|
float dist = length(lightPosition - surfacePosition);
|
|
float attenuation = 1.0 / (constantAttenuation
|
|
+ linearAttenuation * dist
|
|
+ quadraticAttenuation * pow(dist, 2.0));
|
|
|
|
fragmentColor = vec4((Is + Id) * attenuation + Ia, 1.0) * texel;
|
|
|
|
//fragmentColor = vec4(Id, 1.0) * texel;
|
|
|
|
//fragmentColor = texel;
|
|
} |