[colobot] 258/377: Rewritten OpenGL 2.1 engine's two-sided lighting
Didier Raboud
odyx at moszumanska.debian.org
Wed Mar 30 13:34:24 UTC 2016
This is an automated email from the git hooks/post-receive script.
odyx pushed a commit to branch debian/master
in repository colobot.
commit b6faadca0333ae3f2a16f41978fbae803026e267
Author: Tomasz Kapuściński <tomaszkax86 at gmail.com>
Date: Thu Feb 11 15:04:07 2016 +0100
Rewritten OpenGL 2.1 engine's two-sided lighting
---
src/graphics/opengl/gl21device.cpp | 2 ++
.../shaders/fragment_shader_21_pervertex.glsl | 21 ++++++++++-----
.../opengl/shaders/vertex_shader_21_pervertex.glsl | 30 +++++++++++++++-------
3 files changed, 38 insertions(+), 15 deletions(-)
diff --git a/src/graphics/opengl/gl21device.cpp b/src/graphics/opengl/gl21device.cpp
index 8a4fcd9..7c1c9cb 100644
--- a/src/graphics/opengl/gl21device.cpp
+++ b/src/graphics/opengl/gl21device.cpp
@@ -388,6 +388,8 @@ bool CGL21Device::Create()
for (int i = 0; i < 8; i++)
glUniform1i(uni_Light[i].Enabled, 0);
+ glEnable(GL_VERTEX_PROGRAM_TWO_SIDE);
+
// create default framebuffer object
FramebufferParams framebufferParams;
diff --git a/src/graphics/opengl/shaders/fragment_shader_21_pervertex.glsl b/src/graphics/opengl/shaders/fragment_shader_21_pervertex.glsl
index 7d96555..5e4ba05 100644
--- a/src/graphics/opengl/shaders/fragment_shader_21_pervertex.glsl
+++ b/src/graphics/opengl/shaders/fragment_shader_21_pervertex.glsl
@@ -35,27 +35,36 @@ uniform vec4 uni_FogColor;
uniform float uni_ShadowColor;
varying float pass_Distance;
+varying vec4 pass_Color;
+varying vec3 pass_Normal;
+varying vec2 pass_TexCoord0;
+varying vec2 pass_TexCoord1;
+varying vec3 pass_TexCoord2;
+
+const vec3 const_LightDirection = vec3(1.0f, 2.0f, -1.0f);
void main()
{
- vec4 color = gl_Color;
+ vec4 color = pass_Color;
if (uni_TextureEnabled[0])
{
- color = color * texture2D(uni_PrimaryTexture, gl_TexCoord[0].st);
+ color = color * texture2D(uni_PrimaryTexture, pass_TexCoord0);
}
if (uni_TextureEnabled[1])
{
- color = color * texture2D(uni_SecondaryTexture, gl_TexCoord[1].st);
+ color = color * texture2D(uni_SecondaryTexture, pass_TexCoord1);
}
if (uni_TextureEnabled[2])
{
- if (gl_FrontFacing)
- color.rgb *= mix(uni_ShadowColor, 1.0f, shadow2D(uni_ShadowTexture, gl_TexCoord[2].xyz).x);
- else
+ vec3 normal = pass_Normal * (2.0f * gl_Color.x - 1.0f);
+
+ if (dot(normal, const_LightDirection) < 0.0f)
color.rgb *= uni_ShadowColor;
+ else
+ color.rgb *= mix(uni_ShadowColor, 1.0f, shadow2D(uni_ShadowTexture, pass_TexCoord2).x);
}
if (uni_FogEnabled)
diff --git a/src/graphics/opengl/shaders/vertex_shader_21_pervertex.glsl b/src/graphics/opengl/shaders/vertex_shader_21_pervertex.glsl
index e2b9315..b0bf8e6 100644
--- a/src/graphics/opengl/shaders/vertex_shader_21_pervertex.glsl
+++ b/src/graphics/opengl/shaders/vertex_shader_21_pervertex.glsl
@@ -44,18 +44,21 @@ uniform bool uni_LightingEnabled;
uniform LightParams uni_Light[8];
varying float pass_Distance;
+varying vec4 pass_Color;
+varying vec3 pass_Normal;
+varying vec2 pass_TexCoord0;
+varying vec2 pass_TexCoord1;
+varying vec3 pass_TexCoord2;
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_Distance = abs(eyeSpace.z / eyeSpace.w);
+
+ vec4 color = gl_Color;
+
+ vec3 normal = normalize((uni_NormalMatrix * vec4(gl_Normal, 0.0f)).xyz);
if (uni_LightingEnabled)
{
@@ -63,8 +66,6 @@ void main()
vec4 diffuse = vec4(0.0f);
vec4 specular = vec4(0.0f);
- vec3 normal = normalize((uni_NormalMatrix * vec4(gl_Normal, 0.0f)).xyz);
-
for (int i = 0; i < 8; i++)
{
if (uni_Light[i].Enabled)
@@ -97,6 +98,17 @@ void main()
+ uni_DiffuseColor * diffuse
+ uni_SpecularColor * specular;
- gl_FrontColor = vec4(min(vec3(1.0f), result.rgb), 1.0f);
+ color = vec4(min(vec3(1.0f), result.rgb), 1.0f);
}
+
+ gl_Position = uni_ProjectionMatrix * eyeSpace;
+ gl_FrontColor = vec4(1.0f);
+ gl_BackColor = vec4(0.0f);
+
+ pass_Distance = abs(eyeSpace.z / eyeSpace.w);
+ pass_Color = color;
+ pass_Normal = normal;
+ pass_TexCoord0 = gl_MultiTexCoord0.st;
+ pass_TexCoord1 = gl_MultiTexCoord1.st;
+ pass_TexCoord2 = shadowCoord.xyz / shadowCoord.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