Physically based rendering with textures
This commit is contained in:
@ -7,10 +7,11 @@ in vec3 Normal;
|
||||
|
||||
uniform vec3 camPos;
|
||||
|
||||
uniform vec3 albedo;
|
||||
uniform float metallic;
|
||||
uniform float roughness;
|
||||
uniform float ao;
|
||||
uniform sampler2D albedoMap;
|
||||
uniform sampler2D metallicMap;
|
||||
uniform sampler2D normalMap;
|
||||
uniform sampler2D roughnessMap;
|
||||
uniform sampler2D aoMap;
|
||||
|
||||
uniform vec3 lightPositions[4];
|
||||
uniform vec3 lightColors[4];
|
||||
@ -59,8 +60,31 @@ float GeometrySmith(vec3 N, vec3 V, vec3 L, float roughness)
|
||||
return ggx1 * ggx2;
|
||||
}
|
||||
|
||||
void main(){
|
||||
vec3 getNormalFromNormalMap(){
|
||||
vec3 tangentNormal = texture(normalMap, TexCoords).xyz * 2.0 - 1.0;
|
||||
|
||||
vec3 Q1 = dFdx(WorldPos);
|
||||
vec3 Q2 = dFdy(WorldPos);
|
||||
vec2 st1 = dFdx(TexCoords);
|
||||
vec2 st2 = dFdy(TexCoords);
|
||||
|
||||
vec3 N = normalize(Normal);
|
||||
vec3 T = normalize(Q1 *st2.t - Q2*st1.t);
|
||||
vec3 B = -normalize(cross(N, T));
|
||||
mat3 TBN = mat3(T, B, N);
|
||||
|
||||
return normalize(TBN * tangentNormal);
|
||||
}
|
||||
|
||||
void main(){
|
||||
|
||||
vec3 albedo = pow(texture(albedoMap, TexCoords).rgb, vec3(2.2));
|
||||
float metallic = texture(metallicMap, TexCoords).r;
|
||||
float roughness = texture(roughnessMap, TexCoords).r;
|
||||
float ao = texture(aoMap, TexCoords).r;
|
||||
|
||||
|
||||
vec3 N = getNormalFromNormalMap();
|
||||
vec3 V = normalize(camPos - WorldPos);
|
||||
|
||||
vec3 F0 = vec3(0.04);
|
||||
@ -98,8 +122,9 @@ void main(){
|
||||
vec3 ambient = vec3(0.03) * albedo * ao;
|
||||
vec3 color = ambient + Lo;
|
||||
|
||||
// Gamma correct the result
|
||||
// HDR tonemapping
|
||||
color = color / (color + vec3(1.0));
|
||||
// gamma correct
|
||||
color = pow(color, vec3(1.0/2.2));
|
||||
|
||||
FragColor = vec4(color, 1.0);
|
||||
|
Reference in New Issue
Block a user