[colobot] 383/390: Added OpenGL 2.1 shaders for per-pixel lighting
Didier Raboud
odyx at moszumanska.debian.org
Fri Jun 12 14:22:07 UTC 2015
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 <tomaszkax86 at 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
More information about the Pkg-games-commits
mailing list