尝试在片段着色器中反转镜面光贴图的颜色值,让木头显示镜面高光而钢制边缘不反光(由于钢制边缘中有一些裂缝,边缘仍会显示一些镜面高光,虽然强度会小很多)

1 #version 330 core
2 out vec4 FragColor;
3
4 struct Material {
5 sampler2D diffuse;
6 sampler2D specular;
7 float shininess;
8 };
9
10 struct Light {
11 vec3 position;
12
13 vec3 ambient;
14 vec3 diffuse;
15 vec3 specular;
16 };
17
18 in vec3 FragPos;
19 in vec3 Normal;
20 in vec2 TexCoords;
21
22 uniform vec3 viewPos;
23 uniform Material material;
24 uniform Light light;
25
26 void main()
27 {
28 // ambient
29 vec3 ambient = light.ambient * vec3(texture(material.diffuse, TexCoords));
30
31 // diffuse
32 vec3 norm = normalize(Normal);
33 vec3 lightDir = normalize(light.position - FragPos);
34 float diff = max(dot(norm, lightDir), 0.0);
35 vec3 diffuse = light.diffuse * diff * vec3(texture(material.diffuse, TexCoords));
36
37 // specular
38 vec3 viewDir = normalize(viewPos - FragPos);
39 vec3 reflectDir = reflect(-lightDir, norm);
40 float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess);
41 vec3 specular = light.specular * spec * (vec3(1.0) - vec3(texture(material.specular, TexCoords))); // here we inverse the sampled specular color. Black becomes white and white becomes black.
42
43 FragColor = vec4(ambient + diffuse + specular, 1.0);
44 }
将片段着色器中vec3 specular = light.specular * spec * vec3(texture(material.specular, TexCoords));改为vec3 specular = light.specular * spec * (vec3(1.0) - vec3(texture(material.specular, TexCoords)));
本来中间的为黑色(0.0, 0.0, 0.0)所以不反光,改完之后中间黑色部分变为(1.0, 1.0, 1.0)强反光,旁边部分虽然不会被减为0但是强度也会变小。
2019/11/30
