Cleaned up shader code and removed now incompatible models.
|
Before Width: | Height: | Size: 181 KiB |
|
Before Width: | Height: | Size: 1.8 MiB |
|
|
@ -1,16 +0,0 @@
|
||||||
# Blender MTL File: 'None'
|
|
||||||
# Material Count: 1
|
|
||||||
|
|
||||||
newmtl Scene_-_Root
|
|
||||||
Ns 225.000000
|
|
||||||
Ka 1.000000 1.000000 1.000000
|
|
||||||
Kd 0.800000 0.800000 0.800000
|
|
||||||
Ks 0.500000 0.500000 0.500000
|
|
||||||
Ke 0.0 0.0 0.0
|
|
||||||
Ni 1.450000
|
|
||||||
d 1.000000
|
|
||||||
illum 2
|
|
||||||
map_Kd diffuse.jpg
|
|
||||||
map_Bump normal.png
|
|
||||||
map_Ks specular.jpg
|
|
||||||
|
|
||||||
|
Before Width: | Height: | Size: 6.5 MiB |
|
Before Width: | Height: | Size: 14 MiB |
|
Before Width: | Height: | Size: 4.1 MiB |
|
|
@ -1,3 +0,0 @@
|
||||||
Model by Berk Gedik, from: https://sketchfab.com/3d-models/survival-guitar-backpack-low-poly-799f8c4511f84fab8c3f12887f7e6b36
|
|
||||||
|
|
||||||
Modified material assignment (Joey de Vries) for easier load in OpenGL model loading chapter, and renamed albedo to diffuse and metallic to specular to match non-PBR lighting setup.
|
|
||||||
|
Before Width: | Height: | Size: 6.6 MiB |
|
Before Width: | Height: | Size: 389 KiB |
|
|
@ -1,13 +0,0 @@
|
||||||
# Blender MTL File: 'cube.blend'
|
|
||||||
# Material Count: 1
|
|
||||||
|
|
||||||
newmtl Material
|
|
||||||
Ns 225.000000
|
|
||||||
Ka 1.000000 1.000000 1.000000
|
|
||||||
Kd 0.800000 0.800000 0.800000
|
|
||||||
Ks 0.500000 0.500000 0.500000
|
|
||||||
Ke 0.000000 0.000000 0.000000
|
|
||||||
Ni 1.450000
|
|
||||||
d 1.000000
|
|
||||||
illum 2
|
|
||||||
map_Kd Bake.jpg
|
|
||||||
|
|
@ -1,50 +0,0 @@
|
||||||
# Blender v2.83.5 OBJ File: 'cube.blend'
|
|
||||||
# www.blender.org
|
|
||||||
mtllib cube.mtl
|
|
||||||
o Cube
|
|
||||||
v 1.000000 1.000000 -1.000000
|
|
||||||
v 1.000000 -1.000000 -1.000000
|
|
||||||
v 1.000000 1.000000 1.000000
|
|
||||||
v 1.000000 -1.000000 1.000000
|
|
||||||
v -1.000000 1.000000 -1.000000
|
|
||||||
v -1.000000 -1.000000 -1.000000
|
|
||||||
v -1.000000 1.000000 1.000000
|
|
||||||
v -1.000000 -1.000000 1.000000
|
|
||||||
vt 0.331683 0.668317
|
|
||||||
vt 0.331683 0.998350
|
|
||||||
vt 0.001650 0.998350
|
|
||||||
vt 0.001650 0.668317
|
|
||||||
vt 0.334984 0.331683
|
|
||||||
vt 0.334984 0.001650
|
|
||||||
vt 0.665017 0.001650
|
|
||||||
vt 0.665017 0.331683
|
|
||||||
vt 0.665017 0.665017
|
|
||||||
vt 0.334984 0.665017
|
|
||||||
vt 0.334984 0.334984
|
|
||||||
vt 0.665017 0.334984
|
|
||||||
vt 0.998350 0.331683
|
|
||||||
vt 0.668317 0.331683
|
|
||||||
vt 0.668317 0.001650
|
|
||||||
vt 0.998350 0.001650
|
|
||||||
vt 0.331683 0.331683
|
|
||||||
vt 0.001650 0.331683
|
|
||||||
vt 0.001650 0.001650
|
|
||||||
vt 0.331683 0.001650
|
|
||||||
vt 0.331683 0.665017
|
|
||||||
vt 0.001650 0.665017
|
|
||||||
vt 0.001650 0.334984
|
|
||||||
vt 0.331683 0.334984
|
|
||||||
vn 0.0000 1.0000 0.0000
|
|
||||||
vn 0.0000 0.0000 1.0000
|
|
||||||
vn -1.0000 0.0000 0.0000
|
|
||||||
vn 0.0000 -1.0000 0.0000
|
|
||||||
vn 1.0000 0.0000 0.0000
|
|
||||||
vn 0.0000 0.0000 -1.0000
|
|
||||||
usemtl Material
|
|
||||||
s off
|
|
||||||
f 1/1/1 5/2/1 7/3/1 3/4/1
|
|
||||||
f 4/5/2 3/6/2 7/7/2 8/8/2
|
|
||||||
f 8/9/3 7/10/3 5/11/3 6/12/3
|
|
||||||
f 6/13/4 2/14/4 4/15/4 8/16/4
|
|
||||||
f 2/17/5 1/18/5 3/19/5 4/20/5
|
|
||||||
f 6/21/6 5/22/6 1/23/6 2/24/6
|
|
||||||
|
|
@ -1,28 +0,0 @@
|
||||||
This asset is provided as is, for purely non-commercial, educational purposes. If this can help anyone make kickass(-er) art I couldn't be happier.
|
|
||||||
Please note that this is predominantly an example of PBR material work, thus such things as functionality, topology and mesh optimization might be
|
|
||||||
|
|
||||||
somewhat overlooked.
|
|
||||||
|
|
||||||
Now go make something pretty! :D->-<
|
|
||||||
|
|
||||||
Cheers,
|
|
||||||
Andrew Maximov
|
|
||||||
|
|
||||||
More PBR Tutorials:
|
|
||||||
http://www.ArtIsAVerb.info/PBR.html
|
|
||||||
http://www.ArtIsAVerb.info/PBT.html
|
|
||||||
|
|
||||||
Cerberus Videos:
|
|
||||||
https://www.youtube.com/watch?v=xIHiXnMltDg
|
|
||||||
https://www.youtube.com/watch?v=cCYVLkG3hjI
|
|
||||||
|
|
||||||
Other art, info and tutorials here:
|
|
||||||
https://www.facebook.com/ArtIsAVerb
|
|
||||||
http://www.youtube.com/user/d1v3rsion
|
|
||||||
http://d1ver.cghub.com/
|
|
||||||
http://d1ver.cgsociety.org/
|
|
||||||
http://www.ArtIsAVerb.info/
|
|
||||||
Make sure to subscribe for all the upcoming stuff! :)
|
|
||||||
|
|
||||||
|
|
||||||
2014, All Rights Reserved.
|
|
||||||
|
Before Width: | Height: | Size: 48 MiB |
|
|
@ -1,34 +1,126 @@
|
||||||
#version 330 core
|
#version 330 core
|
||||||
|
uniform mat4 MVP;
|
||||||
out vec4 FragColor;
|
out vec4 FragColor;
|
||||||
|
|
||||||
in vec2 ourTexCoord;
|
in vec2 texCoord;
|
||||||
in vec3 ourNormCoord;
|
|
||||||
in vec3 FragPos;
|
in GS_OUT {
|
||||||
|
vec3 tangentLightPos;
|
||||||
|
vec3 tangentViewPos;
|
||||||
|
vec3 tangentFragPos;
|
||||||
|
} from_gs;
|
||||||
|
|
||||||
|
|
||||||
|
// TODO: make temporary hard coded world/camera pos dynamic
|
||||||
|
uniform vec3 CameraPos;
|
||||||
|
|
||||||
// Handle multiple textures from the Mesh Object (Might not even be used)
|
// Handle multiple textures from the Mesh Object (Might not even be used)
|
||||||
uniform sampler2D texture_diffuse1;
|
uniform sampler2D texture_diffuse1;
|
||||||
uniform sampler2D texture_diffuse2;
|
uniform sampler2D texture_diffuse2;
|
||||||
uniform sampler2D texture_diffuse3;
|
uniform sampler2D texture_rma1;
|
||||||
uniform sampler2D texture_specular1;
|
uniform sampler2D texture_normal1;
|
||||||
uniform sampler2D texture_specular2;
|
|
||||||
|
|
||||||
uniform sampler2D ourTexture;
|
// PBR functions from learnOpenGL.com
|
||||||
|
const float PI = 3.14159265359;
|
||||||
|
|
||||||
|
vec3 fresnelSchlick(float cosTheta, vec3 F0)
|
||||||
|
{
|
||||||
|
return F0 + (1.0 - F0) * pow(clamp(1.0 - cosTheta, 0.0, 1.0), 5.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
float DistributionGGX(vec3 N, vec3 H, float roughness)
|
||||||
|
{
|
||||||
|
float a = roughness*roughness;
|
||||||
|
float a2 = a*a;
|
||||||
|
float NdotH = max(dot(N, H), 0.0);
|
||||||
|
float NdotH2 = NdotH*NdotH;
|
||||||
|
|
||||||
|
float num = a2;
|
||||||
|
float denom = (NdotH2 * (a2 - 1.0) + 1.0);
|
||||||
|
denom = PI * denom * denom;
|
||||||
|
|
||||||
|
return num / denom;
|
||||||
|
}
|
||||||
|
|
||||||
|
float GeometrySchlickGGX(float NdotV, float roughness)
|
||||||
|
{
|
||||||
|
float r = (roughness + 1.0);
|
||||||
|
float k = (r*r) / 8.0;
|
||||||
|
|
||||||
|
float num = NdotV;
|
||||||
|
float denom = NdotV * (1.0 - k) + k;
|
||||||
|
|
||||||
|
return num / denom;
|
||||||
|
}
|
||||||
|
float GeometrySmith(vec3 N, vec3 V, vec3 L, float roughness)
|
||||||
|
{
|
||||||
|
float NdotV = max(dot(N, V), 0.0);
|
||||||
|
float NdotL = max(dot(N, L), 0.0);
|
||||||
|
float ggx2 = GeometrySchlickGGX(NdotV, roughness);
|
||||||
|
float ggx1 = GeometrySchlickGGX(NdotL, roughness);
|
||||||
|
|
||||||
|
return ggx1 * ggx2;
|
||||||
|
}
|
||||||
|
|
||||||
|
vec3 PBR(vec3 albedo, float roughness, float metallic, float ao)
|
||||||
|
{
|
||||||
|
vec3 lightPosition = from_gs.tangentLightPos;
|
||||||
|
vec3 lightColor = vec3(13.47, 11.31, 10.79);
|
||||||
|
|
||||||
|
vec3 camPos = from_gs.tangentViewPos;
|
||||||
|
vec3 fragPos = from_gs.tangentFragPos;
|
||||||
|
|
||||||
|
// Thanks to us calculating the tangent space to the triangle and using
|
||||||
|
// these values instead of normal space we can just use the plain corrected
|
||||||
|
// UV values here.
|
||||||
|
vec3 N = normalize((texture(texture_normal1, texCoord).xyz * 2.0 - 1.0)/2);
|
||||||
|
vec3 V = normalize(camPos - fragPos);
|
||||||
|
|
||||||
|
vec3 F0 = vec3(0.04);
|
||||||
|
F0 = mix(F0, albedo, metallic);
|
||||||
|
|
||||||
|
// reflectance equation
|
||||||
|
vec3 Lo = vec3(0.0);
|
||||||
|
// calculate per-light radiance
|
||||||
|
vec3 L = normalize(lightPosition - fragPos);
|
||||||
|
vec3 H = normalize(V + L);
|
||||||
|
float distance = length(lightPosition - fragPos);
|
||||||
|
float attenuation = 1.0 / (distance * distance);
|
||||||
|
vec3 radiance = lightColor * attenuation;
|
||||||
|
|
||||||
|
// cook-torrance brdf
|
||||||
|
float NDF = DistributionGGX(N, H, roughness);
|
||||||
|
float G = GeometrySmith(N, V, L, roughness);
|
||||||
|
vec3 F = fresnelSchlick(max(dot(H, V), 0.0), F0);
|
||||||
|
|
||||||
|
vec3 kS = F;
|
||||||
|
vec3 kD = vec3(1.0) - kS;
|
||||||
|
kD *= 1.0 - metallic;
|
||||||
|
|
||||||
|
vec3 numerator = NDF * G * F;
|
||||||
|
float denominator = 4.0 * max(dot(N, V), 0.0) * max(dot(N, L), 0.0) + 0.0001;
|
||||||
|
vec3 specular = numerator / denominator;
|
||||||
|
|
||||||
|
// add to outgoing radiance Lo
|
||||||
|
float NdotL = max(dot(N, L), 0.0);
|
||||||
|
Lo += (kD * albedo / PI + specular) * radiance * NdotL;
|
||||||
|
|
||||||
|
vec3 ambient = vec3(0.03) * albedo * ao;
|
||||||
|
vec3 color = ambient + Lo;
|
||||||
|
|
||||||
|
color = color / (color + vec3(1.0));
|
||||||
|
return pow(color, vec3(1.0/2.2));
|
||||||
|
}
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
// Establish ambient lighting
|
vec3 albedo;
|
||||||
float ambientStrength = 0.1;
|
albedo.r = pow(texture(texture_diffuse1, texCoord).r, 2.2);
|
||||||
|
albedo.g = pow(texture(texture_diffuse1, texCoord).g, 2.2);
|
||||||
|
albedo.b = pow(texture(texture_diffuse1, texCoord).b, 2.2);
|
||||||
|
float roughness = texture(texture_rma1, texCoord).r;
|
||||||
|
float metallic = texture(texture_rma1, texCoord).g;
|
||||||
|
float ao = texture(texture_rma1, texCoord).b;
|
||||||
|
|
||||||
// Establish a temporary hard coded light position
|
FragColor = vec4(PBR(albedo, roughness, metallic, ao), 1.0);
|
||||||
vec3 lightPosition = vec3(1.0, 1.0, 1.0);
|
|
||||||
|
|
||||||
// Normal light maths
|
|
||||||
vec3 norm = normalize(ourNormCoord);
|
|
||||||
vec3 lightDir = normalize(lightPosition - FragPos);
|
|
||||||
// Calculate diffuse
|
|
||||||
float diff = max(dot(norm, lightDir), 0.0);
|
|
||||||
|
|
||||||
FragColor = texture(texture_diffuse1, ourTexCoord) * (ambientStrength + diff);
|
|
||||||
//FragColor = texture(ourTexture, ourTexCoord);
|
|
||||||
//FragColor = vec4(ourTexCoord.y,ourTexCoord.x,0,0);
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,27 +2,16 @@
|
||||||
layout (triangles) in;
|
layout (triangles) in;
|
||||||
layout (triangle_strip, max_vertices = 3) out;
|
layout (triangle_strip, max_vertices = 3) out;
|
||||||
|
|
||||||
uniform mat4 Model;
|
|
||||||
|
|
||||||
in vec2 gtexCoord[];
|
|
||||||
in vec3 gnormCoord[];
|
|
||||||
in vec3 gWorldPos[];
|
|
||||||
uniform mat4 MVP;
|
|
||||||
|
|
||||||
out vec2 texCoord;
|
out vec2 texCoord;
|
||||||
out vec3 normCoord;
|
|
||||||
out vec3 WorldPos;
|
|
||||||
|
|
||||||
vec3 lightPosition = vec3(1, 1, 2);
|
vec3 lightPosition = vec3(1, 1, 2);
|
||||||
|
|
||||||
uniform vec3 CameraPos;
|
uniform vec3 CameraPos;
|
||||||
|
|
||||||
out GS_OUT {
|
out GS_OUT {
|
||||||
mat3 TBN;
|
|
||||||
vec3 tangentLightPos;
|
vec3 tangentLightPos;
|
||||||
vec3 tangentViewPos;
|
vec3 tangentViewPos;
|
||||||
vec3 tangentFragPos;
|
vec3 tangentFragPos;
|
||||||
vec3 tangentNormPos;
|
|
||||||
} gs_out;
|
} gs_out;
|
||||||
|
|
||||||
in DATA {
|
in DATA {
|
||||||
|
|
@ -57,11 +46,9 @@ void main(void)
|
||||||
mat3 TBN = mat3(T, B, N);
|
mat3 TBN = mat3(T, B, N);
|
||||||
// TBN is an orthogonal matrix and so its inverse is equal to its transpose
|
// TBN is an orthogonal matrix and so its inverse is equal to its transpose
|
||||||
TBN = transpose(TBN);
|
TBN = transpose(TBN);
|
||||||
gs_out.TBN = TBN;
|
|
||||||
|
|
||||||
// send data to Fragment Shader
|
// send data to Fragment Shader
|
||||||
gl_Position = data_in[0].camProj * gl_in[0].gl_Position;
|
gl_Position = data_in[0].camProj * gl_in[0].gl_Position;
|
||||||
gs_out.tangentNormPos = data_in[0].normal;
|
|
||||||
texCoord = data_in[0].texCoord;
|
texCoord = data_in[0].texCoord;
|
||||||
gs_out.tangentFragPos = TBN * gl_in[0].gl_Position.xyz;
|
gs_out.tangentFragPos = TBN * gl_in[0].gl_Position.xyz;
|
||||||
gs_out.tangentViewPos = TBN * data_in[0].camPos;
|
gs_out.tangentViewPos = TBN * data_in[0].camPos;
|
||||||
|
|
@ -69,7 +56,6 @@ void main(void)
|
||||||
EmitVertex();
|
EmitVertex();
|
||||||
|
|
||||||
gl_Position = data_in[1].camProj * gl_in[1].gl_Position;
|
gl_Position = data_in[1].camProj * gl_in[1].gl_Position;
|
||||||
gs_out.tangentNormPos = data_in[1].normal;
|
|
||||||
texCoord = data_in[1].texCoord;
|
texCoord = data_in[1].texCoord;
|
||||||
gs_out.tangentFragPos = TBN * gl_in[1].gl_Position.xyz;
|
gs_out.tangentFragPos = TBN * gl_in[1].gl_Position.xyz;
|
||||||
gs_out.tangentViewPos = TBN * data_in[1].camPos;
|
gs_out.tangentViewPos = TBN * data_in[1].camPos;
|
||||||
|
|
@ -77,7 +63,6 @@ void main(void)
|
||||||
EmitVertex();
|
EmitVertex();
|
||||||
|
|
||||||
gl_Position = data_in[2].camProj * gl_in[2].gl_Position;
|
gl_Position = data_in[2].camProj * gl_in[2].gl_Position;
|
||||||
gs_out.tangentNormPos = data_in[2].normal;
|
|
||||||
texCoord = data_in[2].texCoord;
|
texCoord = data_in[2].texCoord;
|
||||||
gs_out.tangentFragPos = TBN * gl_in[2].gl_Position.xyz;
|
gs_out.tangentFragPos = TBN * gl_in[2].gl_Position.xyz;
|
||||||
gs_out.tangentViewPos = TBN * data_in[2].camPos;
|
gs_out.tangentViewPos = TBN * data_in[2].camPos;
|
||||||
|
|
|
||||||
|
|
@ -1,175 +0,0 @@
|
||||||
#version 330 core
|
|
||||||
uniform mat4 MVP;
|
|
||||||
out vec4 FragColor;
|
|
||||||
|
|
||||||
in vec2 texCoord;
|
|
||||||
in vec3 normCoord;
|
|
||||||
in vec3 WorldPos;
|
|
||||||
|
|
||||||
in GS_OUT {
|
|
||||||
mat3 TBN;
|
|
||||||
vec3 tangentLightPos;
|
|
||||||
vec3 tangentViewPos;
|
|
||||||
vec3 tangentFragPos;
|
|
||||||
vec3 tangentNormPos;
|
|
||||||
} from_gs;
|
|
||||||
|
|
||||||
in mat3 TBN;
|
|
||||||
|
|
||||||
// TODO: make temporary hard coded world/camera pos dynamic
|
|
||||||
//uniform vec3 WorldPos ;
|
|
||||||
uniform vec3 CameraPos;
|
|
||||||
//uniform int tick;
|
|
||||||
//vec3 WorldPos = vec3(0.0f, 0.0f, 0.0f);
|
|
||||||
//vec3 CameraPos = vec3(0.0f, 0.0f, -1.0f);
|
|
||||||
//TODO: make these values rely on associated textures.
|
|
||||||
//vec3 albedo = vec3(0.8f, 0.8f, 0.8f);
|
|
||||||
|
|
||||||
//float metallic = sin(tick / 60 * 0.3f);
|
|
||||||
//float roughness = sin(tick / 60 * 0.3f);
|
|
||||||
//float ao = sin(tick / 60 * 0.8f);
|
|
||||||
|
|
||||||
//float metallic = 0.3f;
|
|
||||||
//float roughness = 0.3f;
|
|
||||||
//float ao = 0.8f;
|
|
||||||
|
|
||||||
// Handle multiple textures from the Mesh Object (Might not even be used)
|
|
||||||
uniform sampler2D texture_diffuse1;
|
|
||||||
uniform sampler2D texture_diffuse2;
|
|
||||||
uniform sampler2D texture_rma1;
|
|
||||||
uniform sampler2D texture_normal1;
|
|
||||||
|
|
||||||
// PBR functions from learnOpenGL.com
|
|
||||||
const float PI = 3.14159265359;
|
|
||||||
|
|
||||||
vec3 fresnelSchlick(float cosTheta, vec3 F0)
|
|
||||||
{
|
|
||||||
return F0 + (1.0 - F0) * pow(clamp(1.0 - cosTheta, 0.0, 1.0), 5.0);
|
|
||||||
}
|
|
||||||
|
|
||||||
float DistributionGGX(vec3 N, vec3 H, float roughness)
|
|
||||||
{
|
|
||||||
float a = roughness*roughness;
|
|
||||||
float a2 = a*a;
|
|
||||||
float NdotH = max(dot(N, H), 0.0);
|
|
||||||
float NdotH2 = NdotH*NdotH;
|
|
||||||
|
|
||||||
float num = a2;
|
|
||||||
float denom = (NdotH2 * (a2 - 1.0) + 1.0);
|
|
||||||
denom = PI * denom * denom;
|
|
||||||
|
|
||||||
return num / denom;
|
|
||||||
}
|
|
||||||
|
|
||||||
float GeometrySchlickGGX(float NdotV, float roughness)
|
|
||||||
{
|
|
||||||
float r = (roughness + 1.0);
|
|
||||||
float k = (r*r) / 8.0;
|
|
||||||
|
|
||||||
float num = NdotV;
|
|
||||||
float denom = NdotV * (1.0 - k) + k;
|
|
||||||
|
|
||||||
return num / denom;
|
|
||||||
}
|
|
||||||
float GeometrySmith(vec3 N, vec3 V, vec3 L, float roughness)
|
|
||||||
{
|
|
||||||
float NdotV = max(dot(N, V), 0.0);
|
|
||||||
float NdotL = max(dot(N, L), 0.0);
|
|
||||||
float ggx2 = GeometrySchlickGGX(NdotV, roughness);
|
|
||||||
float ggx1 = GeometrySchlickGGX(NdotL, roughness);
|
|
||||||
|
|
||||||
return ggx1 * ggx2;
|
|
||||||
}
|
|
||||||
|
|
||||||
vec3 normalMapNormal(){
|
|
||||||
// load and invert normal
|
|
||||||
vec3 normal = normalize(texture(texture_normal1, texCoord).rgb * 2.0 - 1.0);
|
|
||||||
|
|
||||||
vec3 lightDir = normalize(from_gs.tangentLightPos - from_gs.tangentFragPos);
|
|
||||||
vec3 viewDir = normalize(from_gs.tangentViewPos - from_gs.tangentFragPos);
|
|
||||||
vec3 reflectDir = reflect(-lightDir, normal);
|
|
||||||
vec3 halfwayDir = normalize(lightDir + viewDir);
|
|
||||||
float spec = pow(max(dot(normal, halfwayDir), 0.0),32.0);
|
|
||||||
|
|
||||||
vec3 normMapSpecular = vec3(1.0) * spec;
|
|
||||||
|
|
||||||
return normMapSpecular;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
vec3 PBR(vec3 albedo, float roughness, float metallic, float ao)
|
|
||||||
{
|
|
||||||
// Establish a temporary hard coded light position
|
|
||||||
//vec3 lightPosition = vec3(1, 1, 2);
|
|
||||||
//vec3 lightPosition = vec3(1, 1, 2);
|
|
||||||
vec3 lightPosition = from_gs.tangentLightPos;
|
|
||||||
//vec3 lightPosition = vec3( (sin(tick / 1000.0)*2), 1 + sin(tick / 600.0)*2, 2.0);
|
|
||||||
//vec3 lightColor = vec3(1.0, 1.0, 1.0) - sin(tick / 90);
|
|
||||||
vec3 lightColor = vec3(13.47, 11.31, 10.79);
|
|
||||||
|
|
||||||
//vec3 camPos = CameraPos;
|
|
||||||
vec3 camPos = from_gs.tangentViewPos;
|
|
||||||
//vec3 fragPos = WorldPos;
|
|
||||||
vec3 fragPos = from_gs.tangentFragPos;
|
|
||||||
|
|
||||||
//vec3 N = normalize(normCoord);
|
|
||||||
//vec3 N = normalize(from_gs.tangentNormPos);
|
|
||||||
vec3 N = normalize(texture(texture_normal1, texCoord).xyz * 2.0 - 1.0);
|
|
||||||
vec3 V = normalize(camPos - fragPos);
|
|
||||||
//N = (N + normalize(texture(texture_normal1, texCoord).xyz * 2.0 - 1.0))/2;
|
|
||||||
//N = (N + normalize(texture(texture_normal1, texCoord).zyx * 2.0 - 1.0))/2;
|
|
||||||
//N = (N + normalMapNormal()) / 2;
|
|
||||||
//N = normalMapNormal(); //For seeing if normal map tracks with light.
|
|
||||||
|
|
||||||
vec3 F0 = vec3(0.04);
|
|
||||||
F0 = mix(F0, albedo, metallic);
|
|
||||||
|
|
||||||
// reflectance equation
|
|
||||||
vec3 Lo = vec3(0.0);
|
|
||||||
// calculate per-light radiance
|
|
||||||
vec3 L = normalize(lightPosition - fragPos);
|
|
||||||
vec3 H = normalize(V + L);
|
|
||||||
float distance = length(lightPosition - fragPos);
|
|
||||||
float attenuation = 1.0 / (distance * distance);
|
|
||||||
vec3 radiance = lightColor * attenuation;
|
|
||||||
|
|
||||||
// cook-torrance brdf
|
|
||||||
float NDF = DistributionGGX(N, H, roughness);
|
|
||||||
float G = GeometrySmith(N, V, L, roughness);
|
|
||||||
vec3 F = fresnelSchlick(max(dot(H, V), 0.0), F0);
|
|
||||||
|
|
||||||
vec3 kS = F;
|
|
||||||
vec3 kD = vec3(1.0) - kS;
|
|
||||||
kD *= 1.0 - metallic;
|
|
||||||
|
|
||||||
vec3 numerator = NDF * G * F;
|
|
||||||
float denominator = 4.0 * max(dot(N, V), 0.0) * max(dot(N, L), 0.0) + 0.0001;
|
|
||||||
vec3 specular = numerator / denominator;
|
|
||||||
|
|
||||||
// add to outgoing radiance Lo
|
|
||||||
float NdotL = max(dot(N, L), 0.0);
|
|
||||||
Lo += (kD * albedo / PI + specular) * radiance * NdotL;
|
|
||||||
|
|
||||||
vec3 ambient = vec3(0.03) * albedo * ao;
|
|
||||||
vec3 color = ambient + Lo;
|
|
||||||
|
|
||||||
color = color / (color + vec3(1.0));
|
|
||||||
return pow(color, vec3(1.0/2.2));
|
|
||||||
}
|
|
||||||
|
|
||||||
void main()
|
|
||||||
{
|
|
||||||
vec3 albedo;
|
|
||||||
albedo.r = pow(texture(texture_diffuse1, texCoord).r, 2.2);
|
|
||||||
albedo.g = pow(texture(texture_diffuse1, texCoord).g, 2.2);
|
|
||||||
albedo.b = pow(texture(texture_diffuse1, texCoord).b, 2.2);
|
|
||||||
float roughness = texture(texture_rma1, texCoord).r;
|
|
||||||
float metallic = texture(texture_rma1, texCoord).g;
|
|
||||||
float ao = texture(texture_rma1, texCoord).b;
|
|
||||||
|
|
||||||
FragColor = vec4(PBR(albedo, roughness, metallic, ao), 1.0);
|
|
||||||
//FragColor = vec4(PBR(albedo, roughness, metallic, ao) + normalMapNormal(), 1.0);
|
|
||||||
//FragColor = vec4(normalMapNormal(), 1.0);
|
|
||||||
//FragColor = vec4(vec3(0.1) + normalMapNormal()*5, 1.0);
|
|
||||||
//FragColor = vec4(vec3(0.5), 1.0);
|
|
||||||
}
|
|
||||||
|
|
@ -1,44 +0,0 @@
|
||||||
#version 330 core
|
|
||||||
layout (location = 0) in vec3 aPos;
|
|
||||||
layout (location = 1) in vec3 aNormal;
|
|
||||||
layout (location = 2) in vec2 aTexCoord;
|
|
||||||
|
|
||||||
uniform mat4 MVP;
|
|
||||||
uniform mat4 Model;
|
|
||||||
uniform vec3 CameraPos;
|
|
||||||
uniform int tick;
|
|
||||||
|
|
||||||
out vec2 gtexCoord;
|
|
||||||
out vec3 gnormCoord;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//Pbr
|
|
||||||
out vec3 gWorldPos;
|
|
||||||
|
|
||||||
out DATA {
|
|
||||||
vec3 normal;
|
|
||||||
vec2 texCoord;
|
|
||||||
mat4 camProj;
|
|
||||||
mat4 modelProj;
|
|
||||||
vec3 lightPos;
|
|
||||||
vec3 camPos;
|
|
||||||
} data_out;
|
|
||||||
|
|
||||||
void main()
|
|
||||||
{
|
|
||||||
// Saving camera projection until geometry shader.
|
|
||||||
gl_Position = Model * vec4(aPos, 1.0);
|
|
||||||
gnormCoord = aNormal;
|
|
||||||
gtexCoord = aTexCoord;
|
|
||||||
|
|
||||||
data_out.normal = aNormal;
|
|
||||||
data_out.texCoord = aTexCoord;
|
|
||||||
data_out.camProj = MVP;
|
|
||||||
data_out.modelProj = Model;
|
|
||||||
data_out.lightPos = vec3( (sin(tick / 1000.0)*2), 1 + sin(tick / 600.0)*2, 2.0);
|
|
||||||
data_out.camPos = CameraPos;
|
|
||||||
|
|
||||||
// Calculate position of fragment
|
|
||||||
gWorldPos = vec3(Model * vec4(aPos, 1.0));
|
|
||||||
};
|
|
||||||
|
|
@ -5,17 +5,27 @@ layout (location = 2) in vec2 aTexCoord;
|
||||||
|
|
||||||
uniform mat4 MVP;
|
uniform mat4 MVP;
|
||||||
uniform mat4 Model;
|
uniform mat4 Model;
|
||||||
|
uniform vec3 CameraPos;
|
||||||
|
uniform int tick;
|
||||||
|
|
||||||
out vec2 ourTexCoord;
|
out DATA {
|
||||||
out vec3 ourNormCoord;
|
vec3 normal;
|
||||||
out vec3 FragPos;
|
vec2 texCoord;
|
||||||
|
mat4 camProj;
|
||||||
|
mat4 modelProj;
|
||||||
|
vec3 lightPos;
|
||||||
|
vec3 camPos;
|
||||||
|
} data_out;
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
gl_Position = MVP * Model * vec4(aPos, 1.0);
|
// Saving camera projection until geometry shader.
|
||||||
ourNormCoord = aNormal;
|
gl_Position = Model * vec4(aPos, 1.0);
|
||||||
ourTexCoord = aTexCoord;
|
|
||||||
|
|
||||||
// Calculate position of fragment
|
data_out.normal = aNormal;
|
||||||
FragPos = vec3(Model * vec4(aPos, 1.0));
|
data_out.texCoord = aTexCoord;
|
||||||
|
data_out.camProj = MVP;
|
||||||
|
data_out.modelProj = Model;
|
||||||
|
data_out.lightPos = vec3( (sin(tick / 1000.0)*2), 1 + sin(tick / 600.0)*2, 2.0);
|
||||||
|
data_out.camPos = CameraPos;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -70,8 +70,8 @@ int main(int argc, char **argv) {
|
||||||
// Create event handling struct
|
// Create event handling struct
|
||||||
SDL_Event input;
|
SDL_Event input;
|
||||||
|
|
||||||
ShaderLoader shader(ROOT_DIR "data/shaders/pbrVertex.glsl",
|
ShaderLoader shader(ROOT_DIR "data/shaders/vertex.glsl",
|
||||||
ROOT_DIR "data/shaders/pbrFragment.glsl",
|
ROOT_DIR "data/shaders/fragment.glsl",
|
||||||
ROOT_DIR "data/shaders/geometry.glsl");
|
ROOT_DIR "data/shaders/geometry.glsl");
|
||||||
|
|
||||||
// Model backpack(std::string(ROOT_DIR) +
|
// Model backpack(std::string(ROOT_DIR) +
|
||||||
|
|
@ -125,9 +125,6 @@ int main(int argc, char **argv) {
|
||||||
|
|
||||||
// Send our glsl shader our camera information
|
// Send our glsl shader our camera information
|
||||||
shader.setMat4("MVP", camera.getMVP());
|
shader.setMat4("MVP", camera.getMVP());
|
||||||
// shader.setMat4("Model", camera.getModel());
|
|
||||||
// shader.setMat4("View", camera.getView());
|
|
||||||
// shader.setMat4("Projection", camera.getProjection());
|
|
||||||
|
|
||||||
shader.setVec3("CameraPos", camera.getCameraPosition());
|
shader.setVec3("CameraPos", camera.getCameraPosition());
|
||||||
shader.setInt("tick", SDL_GetTicks());
|
shader.setInt("tick", SDL_GetTicks());
|
||||||
|
|
|
||||||