From b1e83414750831a8759221d075b8bc248e8dd74b Mon Sep 17 00:00:00 2001 From: Piotr Dziwinski Date: Wed, 20 May 2015 23:29:41 +0200 Subject: [PATCH] Move OpenGL 3.3 shaders to main repository --- data | 2 +- src/CMakeLists.txt | 2 + src/graphics/opengl/shaders/CMakeLists.txt | 2 + .../opengl/shaders/fragment_shader_33.glsl | 155 ++++++++++++++++++ .../opengl/shaders/vertex_shader_33.glsl | 63 +++++++ 5 files changed, 223 insertions(+), 1 deletion(-) create mode 100644 src/graphics/opengl/shaders/CMakeLists.txt create mode 100644 src/graphics/opengl/shaders/fragment_shader_33.glsl create mode 100644 src/graphics/opengl/shaders/vertex_shader_33.glsl diff --git a/data b/data index 2cbfc1ba..7696ffe2 160000 --- a/data +++ b/data @@ -1 +1 @@ -Subproject commit 2cbfc1baf2086d1a2ab28bfcfaccce73c1dbb2d4 +Subproject commit 7696ffe209feea809f10598d97b7c1a34e511875 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 12de2912..b10b63ba 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -12,6 +12,8 @@ if(TOOLS) add_subdirectory(tools) endif() +add_subdirectory(graphics/opengl/shaders) + # Optional libraries set(OPTIONAL_LIBS "") diff --git a/src/graphics/opengl/shaders/CMakeLists.txt b/src/graphics/opengl/shaders/CMakeLists.txt new file mode 100644 index 00000000..a32d6a9f --- /dev/null +++ b/src/graphics/opengl/shaders/CMakeLists.txt @@ -0,0 +1,2 @@ +file(GLOB shaders *.glsl) +install(FILES ${shaders} DESTINATION ${COLOBOT_INSTALL_DATA_DIR}/shaders) diff --git a/src/graphics/opengl/shaders/fragment_shader_33.glsl b/src/graphics/opengl/shaders/fragment_shader_33.glsl new file mode 100644 index 00000000..a2ef596e --- /dev/null +++ b/src/graphics/opengl/shaders/fragment_shader_33.glsl @@ -0,0 +1,155 @@ +/* + * This file is part of the Colobot: Gold Edition source code + * Copyright (C) 2001-2014, Daniel Roux, EPSITEC SA & TerranovaTeam + * http://epsiteс.ch; http://colobot.info; http://github.com/colobot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://gnu.org/licenses + */ + +// FRAGMENT SHADER +#version 330 + +struct LightParams +{ + bool Enabled; + vec4 Position; + vec4 Ambient; + vec4 Diffuse; + vec4 Specular; + float Shininess; + vec3 Attenuation; +}; + +uniform sampler2D uni_PrimaryTexture; +uniform sampler2D uni_SecondaryTexture; +uniform sampler2DShadow uni_ShadowTexture; + +uniform bool uni_PrimaryTextureEnabled; +uniform bool uni_SecondaryTextureEnabled; +uniform bool uni_ShadowTextureEnabled; + +uniform bool uni_FogEnabled; +uniform vec2 uni_FogRange; +uniform vec4 uni_FogColor; + +uniform bool uni_AlphaTestEnabled; +uniform float uni_AlphaReference; + +uniform vec4 uni_AmbientColor; +uniform vec4 uni_DiffuseColor; +uniform vec4 uni_SpecularColor; + +uniform bool uni_LightingEnabled; +uniform LightParams uni_Light[8]; + +uniform bool uni_SmoothShading; + +in VertexData +{ + vec3 NormalSmooth; + flat vec3 NormalFlat; + vec4 Color; + vec2 TexCoord0; + vec2 TexCoord1; + vec4 ShadowCoord; + vec4 Position; + float Distance; +} data; + +out vec4 out_FragColor; + +void main() +{ + vec4 color = data.Color; + + if (uni_LightingEnabled) + { + vec4 ambient = vec4(0.0f); + vec4 diffuse = vec4(0.0f); + vec4 specular = vec4(0.0f); + + for(int i=0; i<8; i++) + { + if(uni_Light[i].Enabled) + { + ambient += uni_Light[i].Ambient; + + vec3 normal = (uni_SmoothShading ? data.NormalSmooth : data.NormalFlat); + normal = (gl_FrontFacing ? normal : -normal); + + vec3 lightDirection = vec3(0.0f); + float atten; + + // Directional light + if(uni_Light[i].Position[3] == 0.0f) + { + lightDirection = uni_Light[i].Position.xyz; + atten = 1.0f; + } + // Point light + else + { + vec3 lightDirection = normalize(uni_Light[i].Position.xyz - data.Position.xyz); + float dist = distance(uni_Light[i].Position.xyz, data.Position.xyz); + + atten = 1.0f / (uni_Light[i].Attenuation.x + + uni_Light[i].Attenuation.y * dist + + uni_Light[i].Attenuation.z * dist * dist); + } + + vec3 reflectDirection = -reflect(lightDirection, normal); + + diffuse += atten * clamp(dot(normal, lightDirection), 0.0f, 1.0f) * uni_Light[i].Diffuse; + specular += atten * clamp(pow(dot(normal, lightDirection + reflectDirection), 10.0f), 0.0f, 1.0f) * uni_Light[i].Specular; + } + } + + vec4 result = uni_AmbientColor * ambient + + uni_DiffuseColor * diffuse + + uni_SpecularColor * specular; + + color.rgb = min(vec3(1.0f), result.rgb); + color.a = 1.0f; //min(1.0f, 1.0f); + } + + if (uni_PrimaryTextureEnabled) + { + color = color * texture(uni_PrimaryTexture, data.TexCoord0); + } + + if (uni_SecondaryTextureEnabled) + { + color = color * texture(uni_SecondaryTexture, data.TexCoord1); + } + + if (uni_ShadowTextureEnabled) + { + color = color * (0.35f + 0.65f * texture(uni_ShadowTexture, data.ShadowCoord.xyz)); + } + + if (uni_FogEnabled) + { + float interpolate = (data.Distance - uni_FogRange.x) / (uni_FogRange.y - uni_FogRange.x); + + color = mix(color, uni_FogColor, clamp(interpolate, 0.0f, 1.0f)); + } + + if (uni_AlphaTestEnabled) + { + if(color.a < uni_AlphaReference) + discard; + } + + out_FragColor = color; +} diff --git a/src/graphics/opengl/shaders/vertex_shader_33.glsl b/src/graphics/opengl/shaders/vertex_shader_33.glsl new file mode 100644 index 00000000..97dbc17e --- /dev/null +++ b/src/graphics/opengl/shaders/vertex_shader_33.glsl @@ -0,0 +1,63 @@ +/* + * This file is part of the Colobot: Gold Edition source code + * Copyright (C) 2001-2014, Daniel Roux, EPSITEC SA & TerranovaTeam + * http://epsiteс.ch; http://colobot.info; http://github.com/colobot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://gnu.org/licenses + */ + +// VERTEX SHADER +#version 330 + +uniform mat4 uni_ProjectionMatrix; +uniform mat4 uni_ViewMatrix; +uniform mat4 uni_ModelMatrix; +uniform mat4 uni_ShadowMatrix; +uniform mat4 uni_NormalMatrix; + +layout(location = 0) in vec4 in_VertexCoord; +layout(location = 1) in vec3 in_Normal; +layout(location = 2) in vec4 in_Color; +layout(location = 3) in vec2 in_TexCoord0; +layout(location = 4) in vec2 in_TexCoord1; + +out VertexData +{ + vec3 NormalSmooth; + flat vec3 NormalFlat; + vec4 Color; + vec2 TexCoord0; + vec2 TexCoord1; + vec4 ShadowCoord; + vec4 Position; + float Distance; +} data; + +void main() +{ + vec4 position = uni_ModelMatrix * in_VertexCoord; + vec4 eyeSpace = uni_ViewMatrix * position; + gl_Position = uni_ProjectionMatrix * eyeSpace; + + vec3 normal = normalize((uni_NormalMatrix * vec4(in_Normal, 0.0f)).xyz); + + data.Color = in_Color; + data.NormalSmooth = normal; + data.NormalFlat = normal; + data.TexCoord0 = in_TexCoord0; + data.TexCoord1 = in_TexCoord1; + data.ShadowCoord = uni_ShadowMatrix * position; + data.Position = position; + data.Distance = abs(eyeSpace.z); +}