This is an automated email from the git hooks/post-receive script. odyx pushed a commit to branch upstream/latest in repository colobot.
commit 66d865942c74f5475eb02a9a4203e4d4e532f266 Author: Tomasz Kapuściński <tomaszka...@gmail.com> Date: Tue Jun 2 16:55:03 2015 +0200 Added OpenGL 2.1 shaders for per-pixel lighting --- .../shaders/fragment_shader_21_perpixel.glsl | 125 +++++++++++++++++++++ .../opengl/shaders/vertex_shader_21_perpixel.glsl | 46 ++++++++ 2 files changed, 171 insertions(+) diff --git a/src/graphics/opengl/shaders/fragment_shader_21_perpixel.glsl b/src/graphics/opengl/shaders/fragment_shader_21_perpixel.glsl new file mode 100644 index 0000000..8f1213a --- /dev/null +++ b/src/graphics/opengl/shaders/fragment_shader_21_perpixel.glsl @@ -0,0 +1,125 @@ +/* + * This file is part of the Colobot: Gold Edition source code + * Copyright (C) 2001-2014, Daniel Roux, EPSITEC SA & TerranovaTeam + * http://epsitec.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 + */ + +#version 120 + +uniform sampler2D uni_PrimaryTexture; +uniform sampler2D uni_SecondaryTexture; +uniform sampler2DShadow uni_ShadowTexture; + +uniform bool uni_TextureEnabled[3]; + +uniform bool uni_AlphaTestEnabled; +uniform float uni_AlphaReference; + +uniform bool uni_FogEnabled; +uniform vec2 uni_FogRange; +uniform vec4 uni_FogColor; + +uniform float uni_ShadowColor; + +uniform bool uni_LightingEnabled; +uniform bool uni_LightEnabled[8]; + +varying vec3 pass_Normal; +varying vec3 pass_Position; +varying float pass_Distance; + +void main() +{ + vec4 color = gl_Color; + + if (uni_LightingEnabled) + { + vec4 ambient = vec4(0.0f); + vec4 diffuse = vec4(0.0f); + vec4 specular = vec4(0.0f); + + vec3 normal = pass_Normal; + + for(int i=0; i<8; i++) + { + if(uni_LightEnabled[i]) + { + vec3 lightDirection = vec3(0.0f); + float atten; + + // Directional light + if(gl_LightSource[i].position.w == 0.0f) + { + lightDirection = gl_LightSource[i].position.xyz; + atten = 1.0f; + } + // Point light + else + { + vec3 lightDirection = normalize(gl_LightSource[i].position.xyz - pass_Position); + float dist = distance(gl_LightSource[i].position.xyz, pass_Position); + + atten = 1.0f / (gl_LightSource[i].constantAttenuation + + gl_LightSource[i].linearAttenuation * dist + + gl_LightSource[i].quadraticAttenuation * dist * dist); + } + + vec3 reflectDirection = -reflect(lightDirection, normal); + + ambient += gl_LightSource[i].ambient; + diffuse += atten * clamp(dot(normal, lightDirection), 0.0f, 1.0f) * gl_LightSource[i].diffuse; + specular += atten * clamp(pow(dot(normal, lightDirection + reflectDirection), 10.0f), 0.0f, 1.0f) * gl_LightSource[i].specular; + } + } + + vec4 result = gl_FrontMaterial.ambient * ambient + + gl_FrontMaterial.diffuse * diffuse + + gl_FrontMaterial.specular * specular; + + color.rgb = min(vec3(1.0f), result.rgb); + color.a = 1.0f; //min(1.0f, 1.0f); + } + + if (uni_TextureEnabled[0]) + { + color = color * texture2D(uni_PrimaryTexture, gl_TexCoord[0].st); + } + + if (uni_TextureEnabled[1]) + { + color = color * texture2D(uni_SecondaryTexture, gl_TexCoord[1].st); + } + + if (uni_TextureEnabled[2]) + { + color = color * mix(uni_ShadowColor, 1.0f, shadow2D(uni_ShadowTexture, gl_TexCoord[2].xyz).x); + } + + if (uni_FogEnabled) + { + float interpolate = (pass_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; + } + + gl_FragColor = color; +} diff --git a/src/graphics/opengl/shaders/vertex_shader_21_perpixel.glsl b/src/graphics/opengl/shaders/vertex_shader_21_perpixel.glsl new file mode 100644 index 0000000..83c7e8c --- /dev/null +++ b/src/graphics/opengl/shaders/vertex_shader_21_perpixel.glsl @@ -0,0 +1,46 @@ +/* + * This file is part of the Colobot: Gold Edition source code + * Copyright (C) 2001-2014, Daniel Roux, EPSITEC SA & TerranovaTeam + * http://epsitec.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 + */ + +#version 120 + +uniform mat4 uni_ProjectionMatrix; +uniform mat4 uni_ViewMatrix; +uniform mat4 uni_ModelMatrix; +uniform mat4 uni_ShadowMatrix; +uniform mat4 uni_NormalMatrix; + +varying vec3 pass_Normal; +varying vec3 pass_Position; +varying float pass_Distance; + +void main() +{ + vec4 position = uni_ModelMatrix * gl_Vertex; + vec4 eyeSpace = uni_ViewMatrix * position; + vec4 shadowCoord = uni_ShadowMatrix * position; + gl_Position = uni_ProjectionMatrix * eyeSpace; + gl_FrontColor = gl_Color; + gl_TexCoord[0] = gl_MultiTexCoord0; + gl_TexCoord[1] = gl_MultiTexCoord1; + gl_TexCoord[2] = vec4(shadowCoord.xyz / shadowCoord.w, 1.0f); + + pass_Normal = normalize((uni_NormalMatrix * vec4(gl_Normal, 0.0f)).xyz); + pass_Position = position.xyz; + pass_Distance = abs(eyeSpace.z / eyeSpace.w); +} -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/colobot.git _______________________________________________ Pkg-games-commits mailing list Pkg-games-commits@lists.alioth.debian.org http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-games-commits