diff --git a/shaders/shader-texture.fs b/shaders/shader-texture.fs index 6da90fc..23c74b4 100644 --- a/shaders/shader-texture.fs +++ b/shaders/shader-texture.fs @@ -2,29 +2,29 @@ out vec4 FragColor; -in vec3 vNormal; -in vec3 vTexCoord; +in vec3 TexCoord; +in vec3 Normal; in vec3 FragPos; vec3 lightColor = vec3(1.0); vec3 lightDir = -normalize(vec3(0.0, 100.0, 0.0) - vec3(32.0)); -float ambientStrength = 0.4; -float diffuseStrength = 0.45; -float specularStrength = 0.05; +float ambientStrength = 0.1; +float diffuseStrength = 0.8; +float specularStrength = 0.1; uniform vec3 viewPos; uniform float u_time; uniform sampler2DArray textureArray; void main(){ - vec3 vColor = vec3(texture(textureArray, vTexCoord)); + // Load the texture + // anti-gamma-correction of the texture. Without this it would be gamma corrected twice! + vec3 vColor = texture(textureArray, TexCoord).rgb; - // offset the normal a tiny bit, so that the color of faces opposing lightDir is not completely - // flat - vec3 normal = normalize(vNormal); + vec3 normal = normalize(Normal); - // Blinn-Phong lighting + /* Start of Blinn-Phong lighting */ // Ambient vec3 ambient = lightColor*vColor; diff --git a/shaders/shader-texture.gs b/shaders/shader-texture.gs new file mode 100644 index 0000000..fc1e602 --- /dev/null +++ b/shaders/shader-texture.gs @@ -0,0 +1,80 @@ +#version 330 core + +layout (points) in; +layout (triangle_strip, max_vertices = 4) out; + +in VS_OUT{ + vec3 Extents; + vec3 Normal; + float BlockType; +} gs_in[]; + +out vec3 TexCoord; +out vec3 Normal; +out vec3 FragPos; + +uniform mat4 view; +uniform mat4 projection; + +void main(){ + Normal = gs_in[0].Normal; + + TexCoord = vec3(0.0, 0.0, gs_in[0].BlockType); + gl_Position = gl_in[0].gl_Position; + FragPos = vec3(gl_Position); + gl_Position = projection * view * gl_Position; + EmitVertex(); + + if(gs_in[0].Extents.x == 0){ + TexCoord = vec3(0.0, gs_in[0].Extents.z, gs_in[0].BlockType); + gl_Position = gl_in[0].gl_Position + vec4(0.0, 0.0, gs_in[0].Extents.z, 0.0); + FragPos = vec3(gl_Position); + gl_Position = projection * view * gl_Position; + EmitVertex(); + + TexCoord = vec3(gs_in[0].Extents.y, 0.0, gs_in[0].BlockType); + gl_Position = gl_in[0].gl_Position + vec4(0.0, gs_in[0].Extents.y, 0.0, 0.0); + FragPos = vec3(gl_Position); + gl_Position = projection * view * gl_Position; + EmitVertex(); + + TexCoord = vec3(gs_in[0].Extents.y, gs_in[0].Extents.z, gs_in[0].BlockType); + } + else if(gs_in[0].Extents.y == 0){ + TexCoord = vec3(0.0, gs_in[0].Extents.z, gs_in[0].BlockType); + gl_Position = gl_in[0].gl_Position + vec4(0.0, 0.0, gs_in[0].Extents.z, 0.0); + FragPos = vec3(gl_Position); + gl_Position = projection * view * gl_Position; + EmitVertex(); + + TexCoord = vec3(gs_in[0].Extents.x, 0.0, gs_in[0].BlockType); + gl_Position = gl_in[0].gl_Position + vec4(gs_in[0].Extents.x, 0.0, 0.0, 0.0); + FragPos = vec3(gl_Position); + gl_Position = projection * view * gl_Position; + EmitVertex(); + + TexCoord = vec3(gs_in[0].Extents.x, gs_in[0].Extents.z, gs_in[0].BlockType); + } + else{ + TexCoord = vec3(gs_in[0].Extents.x, 0.0, gs_in[0].BlockType); + gl_Position = gl_in[0].gl_Position + vec4(gs_in[0].Extents.x, 0.0, 0.0, 0.0); + FragPos = vec3(gl_Position); + gl_Position = projection * view * gl_Position; + EmitVertex(); + + TexCoord = vec3(0.0, gs_in[0].Extents.y, gs_in[0].BlockType); + gl_Position = gl_in[0].gl_Position + vec4(0.0, gs_in[0].Extents.y, 0.0, 0.0); + FragPos = vec3(gl_Position); + gl_Position = projection * view * gl_Position; + EmitVertex(); + + TexCoord = vec3(gs_in[0].Extents.x, gs_in[0].Extents.y, gs_in[0].BlockType); + } + + gl_Position = gl_in[0].gl_Position + vec4(gs_in[0].Extents, 0.0); + FragPos = vec3(gl_Position); + gl_Position = projection * view * gl_Position; + EmitVertex(); + + EndPrimitive(); +} diff --git a/shaders/shader-texture.vs b/shaders/shader-texture.vs index 6c00ad8..9c97c8a 100644 --- a/shaders/shader-texture.vs +++ b/shaders/shader-texture.vs @@ -1,22 +1,27 @@ #version 330 core layout (location = 0) in vec3 aPos; -layout (location = 1) in vec3 aNormal; -layout (location = 2) in vec3 aTexCoord; +layout (location = 1) in vec3 aExtents; +layout (location = 2) in vec2 aInfo; uniform mat4 model; -uniform mat4 view; -uniform mat4 projection; -out vec3 vNormal; -out vec3 vTexCoord; -out vec3 FragPos; +out VS_OUT { + vec3 Extents; + vec3 Normal; + float BlockType; +} vs_out; void main() { - vTexCoord = aTexCoord; - vNormal = mat3(transpose(inverse(model))) * aNormal; + //vNormal = mat3(transpose(inverse(model))) * aNormal; + vs_out.Extents = aExtents; + vs_out.BlockType = aInfo.y; - FragPos = vec3(model*vec4(aPos, 1.0)); - gl_Position = projection * view * model * vec4(aPos, 1.0); + if(aExtents.x == 0) vs_out.Normal = vec3(1.0 - 2*aInfo.x, 0.0, 0.0); + else if(aExtents.y == 0) vs_out.Normal = vec3(0.0, 1.0 - 2*aInfo.x, 0.0); + else vs_out.Normal = vec3(0.0, 0.0, 1.0 - 2*aInfo.x); + vs_out.Normal = mat3(transpose(inverse(model))) * vs_out.Normal; + + gl_Position = model * vec4(aPos, 1.0); }