Materials és Lighting maps
#version 400 core
struct Material {
vec3 ambient;
vec3 diffuse;
vec3 specular;
float shininess;
};
uniform Material material;
Anyag tulajdonság alkalmazása a shaderben
void main() {
// ambient
vec3 ambient = lightColor * material.ambient;
// diffuse
vec3 norm = normalize(Normal);
vec3 lightDir = normalize(lightPos - FragPos);
float diff = max(dot(norm, lightDir), 0.0);
vec3 diffuse = lightColor * (diff * material.diffuse);
// specular
vec3 viewDir = normalize(viewPos - FragPos);
vec3 reflectDir = reflect(-lightDir, norm);
float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess);
vec3 specular = lightColor * (spec * material.specular);
vec3 result = ambient + diffuse + specular;
FragColor = vec4(result, 1.0);
}
lightingShader.setVec3("material.ambient", 1.0f, 0.5f, 0.31f);
lightingShader.setVec3("material.diffuse", 1.0f, 0.5f, 0.31f);
lightingShader.setVec3("material.specular", 0.5f, 0.5f, 0.5f);
lightingShader.setFloat("material.shininess", 32.0f);
Megvilágítás tulajdonságai
vec3 ambient = vec3(1.0) * material.ambient;
vec3 diffuse = vec3(1.0) * (diff * material.diffuse);
vec3 specular = vec3(1.0) * (spec * material.specular);
vec3 ambient = vec3(0.1) * material.ambient;
struct Light {
vec3 position;
vec3 ambient;
vec3 diffuse;
vec3 specular;
};
uniform Light light;
vec3 ambient = light.ambient * material.ambient;
vec3 diffuse = light.diffuse * (diff * material.diffuse);
vec3 specular = light.specular * (spec * material.specular);
A uniform változókon keresztül tudjuk beállítani a Light struktúra adattagjait:
lightingShader.setVec3("light.ambient", 0.2f, 0.2f, 0.2f);
lightingShader.setVec3("light.diffuse", 0.5f, 0.5f, 0.5f); // darken the light a bit to fit the scene
lightingShader.setVec3("light.specular", 1.0f, 1.0f, 1.0f);
Most, hogy irányítani tudjuk, hogy a fény hogyan befolyásolja az objektumok anyagi megjelenését, valami hasonlót kell kapnunk:
Különböző színű fények hatása
glm::vec3 lightColor;
lightColor.x = sin(glfwGetTime() * 2.0f);
lightColor.y = sin(glfwGetTime() * 0.7f);
lightColor.z = sin(glfwGetTime() * 1.3f);
glm::vec3 diffuseColor = lightColor * glm::vec3(0.5f); // decrease the influence
glm::vec3 ambientColor = diffuseColor * glm::vec3(0.2f); // low influence
lightingShader.setVec3("light.ambient", ambientColor);
lightingShader.setVec3("light.diffuse", diffuseColor);
Lighting maps
Diffuse maps
Az ambient material színt eltávolítjuk a Material struktúrával, mivel az szinte az összes esetben megegyezik a diffuse színnel, így felesleges külön tárolni:
struct Material {
sampler2D diffuse;
vec3 specular;
float shininess;
};
...
in vec2 TexCoords;
Mivel most szükségünk lesz textúra koordinátákra a diffuse map mintavételezéséhezm ezért ne felejtsük el azokat definiálni a shaderben és az atrribútum pointereket is frissíteni kell.
vec3 diffuse = light.diffuse * diff * vec3(texture(material.diffuse, TexCoords));
Most az ambient material szín meg fog egyezni a diffuse színnel:
vec3 ambient = light.ambient * vec3(texture(material.diffuse, TexCoords));
#version 400 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aNormal;
layout (location = 2) in vec2 aTexCoords;
...
out vec2 TexCoords;
void main() {
...
TexCoords = aTexCoords;
}
lightingShader.setInt("material.diffuse", 0);
...
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, diffuseMap);
A diffuse map használatával mostmár sokkal részletesebb megvilágítást kapunk, mintha csak egy egyszerű anyagi tulajdonságot definiálnánk az objektumhoz:
Specular maps
lightingShader.setInt("material.specular", 1);
...
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, specularMap);
Majd frissítsük a Material struktúrát, hogy egy sampler2D obhjektumon keresztül kezelje a specular hatást:
struct Material {
sampler2D diffuse;
sampler2D specular;
float shininess;
};
Mintavételezzük a specular mapet, hogy kiszámoljuk a megfelelő specular hatást:
vec3 ambient = light.ambient * vec3(texture(material.diffuse, TexCoords));
vec3 diffuse = light.diffuse * diff * vec3(texture(material.diffuse, TexCoords));
vec3 specular = light.specular * spec * vec3(texture(material.specular, TexCoords));
FragColor = vec4(ambient + diffuse + specular, 1.0);