1bcb5ddd50
- New lighting engine module which contains new data types Light and Material. These data types and functions facilitates making a basic 3D iluminated program with a light and a model. - Added lighting engine module example (currently included in raylib.h; it might be compiled by separate and include lighting.h in game source C file). - Corrected some opengl defines control structures and added some TODO to fix raylib-opengl 1.1 source build (note: now source can be compiled without errors, but rlglReadPixels() won't work properly). Note: most of functions of phong version 330 shader are not in v100 shaders, so I couldn't write a version 100 phong shader. These functions are included from version 150.
76 lines
1.9 KiB
GLSL
76 lines
1.9 KiB
GLSL
#version 330
|
|
|
|
// Vertex shader input data
|
|
in vec2 fragTexCoord;
|
|
in vec3 fragNormal;
|
|
|
|
// Diffuse data
|
|
uniform sampler2D texture0;
|
|
uniform vec4 tintColor;
|
|
|
|
// Light attributes
|
|
uniform vec3 light_ambientColor = vec3(0.6, 0.3, 0);
|
|
uniform vec3 light_diffuseColor = vec3(1, 0.5, 0);
|
|
uniform vec3 light_specularColor = vec3(0, 1, 0);
|
|
uniform float light_intensity = 1;
|
|
uniform float light_specIntensity = 1;
|
|
|
|
// Material attributes
|
|
uniform vec3 mat_ambientColor = vec3(1, 1, 1);
|
|
uniform vec3 mat_specularColor = vec3(1, 1, 1);
|
|
uniform float mat_glossiness = 50;
|
|
|
|
// World attributes
|
|
uniform vec3 lightPos;
|
|
uniform vec3 cameraPos;
|
|
|
|
// Fragment shader output data
|
|
out vec4 fragColor;
|
|
|
|
vec3 AmbientLighting()
|
|
{
|
|
return mat_ambientColor * light_ambientColor;
|
|
}
|
|
|
|
vec3 DiffuseLighting(in vec3 N, in vec3 L)
|
|
{
|
|
// Lambertian reflection calculation
|
|
float diffuse = clamp(dot(N, L), 0, 1);
|
|
|
|
return tintColor.xyz * light_diffuseColor * light_intensity * diffuse;
|
|
}
|
|
|
|
vec3 SpecularLighting(in vec3 N, in vec3 L, in vec3 V)
|
|
{
|
|
float specular = 0;
|
|
|
|
// Calculate specular reflection only if the surface is oriented to the light source
|
|
if(dot(N, L) > 0)
|
|
{
|
|
// Calculate half vector
|
|
vec3 H = normalize(L + V);
|
|
|
|
// Calculate specular intensity
|
|
specular = pow(dot(N, H), 3 + mat_glossiness);
|
|
}
|
|
|
|
return mat_specularColor * light_specularColor * light_specIntensity * specular;
|
|
}
|
|
|
|
void main()
|
|
{
|
|
// Normalize input vectors
|
|
vec3 L = normalize(lightPos);
|
|
vec3 V = normalize(cameraPos);
|
|
vec3 N = normalize(fragNormal);
|
|
|
|
vec3 ambient = AmbientLighting();
|
|
vec3 diffuse = DiffuseLighting(N, L);
|
|
vec3 specular = SpecularLighting(N, L, V);
|
|
|
|
// Get base color from texture
|
|
vec4 textureColor = texture(texture0, fragTexCoord);
|
|
vec3 finalColor = textureColor.rgb;
|
|
|
|
fragColor = vec4(finalColor * (ambient + diffuse + specular), textureColor.a);
|
|
} |