aboutsummaryrefslogtreecommitdiff
path: root/src/client/shader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/shader.cpp')
-rw-r--r--src/client/shader.cpp93
1 files changed, 57 insertions, 36 deletions
diff --git a/src/client/shader.cpp b/src/client/shader.cpp
index dc9e9ae6d..bbb872761 100644
--- a/src/client/shader.cpp
+++ b/src/client/shader.cpp
@@ -40,20 +40,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "client/tile.h"
#include "config.h"
-#if ENABLE_GLES
-#ifdef _IRR_COMPILE_WITH_OGLES1_
-#include <GLES/gl.h>
-#else
-#include <GLES2/gl2.h>
-#endif
-#else
-#ifndef __APPLE__
-#include <GL/gl.h>
-#else
-#define GL_SILENCE_DEPRECATION
-#include <OpenGL/gl.h>
-#endif
-#endif
+#include <mt_opengl.h>
/*
A cache from shader name to shader path
@@ -223,17 +210,24 @@ public:
class MainShaderConstantSetter : public IShaderConstantSetter
{
- CachedVertexShaderSetting<float, 16> m_world_view_proj;
- CachedVertexShaderSetting<float, 16> m_world;
+ CachedVertexShaderSetting<f32, 16> m_world_view_proj;
+ CachedVertexShaderSetting<f32, 16> m_world;
// Shadow-related
- CachedPixelShaderSetting<float, 16> m_shadow_view_proj;
- CachedPixelShaderSetting<float, 3> m_light_direction;
- CachedPixelShaderSetting<float> m_texture_res;
- CachedPixelShaderSetting<float> m_shadow_strength;
- CachedPixelShaderSetting<float> m_time_of_day;
- CachedPixelShaderSetting<float> m_shadowfar;
+ CachedPixelShaderSetting<f32, 16> m_shadow_view_proj;
+ CachedPixelShaderSetting<f32, 3> m_light_direction;
+ CachedPixelShaderSetting<f32> m_texture_res;
+ CachedPixelShaderSetting<f32> m_shadow_strength;
+ CachedPixelShaderSetting<f32> m_time_of_day;
+ CachedPixelShaderSetting<f32> m_shadowfar;
+ CachedPixelShaderSetting<f32, 4> m_camera_pos;
CachedPixelShaderSetting<s32> m_shadow_texture;
+ CachedVertexShaderSetting<f32> m_perspective_bias0_vertex;
+ CachedPixelShaderSetting<f32> m_perspective_bias0_pixel;
+ CachedVertexShaderSetting<f32> m_perspective_bias1_vertex;
+ CachedPixelShaderSetting<f32> m_perspective_bias1_pixel;
+ CachedVertexShaderSetting<f32> m_perspective_zbias_vertex;
+ CachedPixelShaderSetting<f32> m_perspective_zbias_pixel;
#if ENABLE_GLES
// Modelview matrix
@@ -248,18 +242,25 @@ public:
MainShaderConstantSetter() :
m_world_view_proj("mWorldViewProj")
, m_world("mWorld")
-#if ENABLE_GLES
- , m_world_view("mWorldView")
- , m_texture("mTexture")
- , m_normal("mNormal")
-#endif
, m_shadow_view_proj("m_ShadowViewProj")
, m_light_direction("v_LightDirection")
, m_texture_res("f_textureresolution")
, m_shadow_strength("f_shadow_strength")
, m_time_of_day("f_timeofday")
, m_shadowfar("f_shadowfar")
+ , m_camera_pos("CameraPos")
, m_shadow_texture("ShadowMapSampler")
+ , m_perspective_bias0_vertex("xyPerspectiveBias0")
+ , m_perspective_bias0_pixel("xyPerspectiveBias0")
+ , m_perspective_bias1_vertex("xyPerspectiveBias1")
+ , m_perspective_bias1_pixel("xyPerspectiveBias1")
+ , m_perspective_zbias_vertex("zPerspectiveBias")
+ , m_perspective_zbias_pixel("zPerspectiveBias")
+#if ENABLE_GLES
+ , m_world_view("mWorldView")
+ , m_texture("mTexture")
+ , m_normal("mNormal")
+#endif
{}
~MainShaderConstantSetter() = default;
@@ -306,26 +307,40 @@ public:
shadowViewProj *= light.getViewMatrix();
m_shadow_view_proj.set(shadowViewProj.pointer(), services);
- float v_LightDirection[3];
+ f32 v_LightDirection[3];
light.getDirection().getAs3Values(v_LightDirection);
m_light_direction.set(v_LightDirection, services);
- float TextureResolution = light.getMapResolution();
+ f32 TextureResolution = light.getMapResolution();
m_texture_res.set(&TextureResolution, services);
- float ShadowStrength = shadow->getShadowStrength();
+ f32 ShadowStrength = shadow->getShadowStrength();
m_shadow_strength.set(&ShadowStrength, services);
- float timeOfDay = shadow->getTimeOfDay();
+ f32 timeOfDay = shadow->getTimeOfDay();
m_time_of_day.set(&timeOfDay, services);
- float shadowFar = shadow->getMaxShadowFar();
+ f32 shadowFar = shadow->getMaxShadowFar();
m_shadowfar.set(&shadowFar, services);
+ f32 cam_pos[4];
+ shadowViewProj.transformVect(cam_pos, light.getPlayerPos());
+ m_camera_pos.set(cam_pos, services);
+
// I dont like using this hardcoded value. maybe something like
// MAX_TEXTURE - 1 or somthing like that??
s32 TextureLayerID = 3;
m_shadow_texture.set(&TextureLayerID, services);
+
+ f32 bias0 = shadow->getPerspectiveBiasXY();
+ m_perspective_bias0_vertex.set(&bias0, services);
+ m_perspective_bias0_pixel.set(&bias0, services);
+ f32 bias1 = 1.0f - bias0 + 1e-5f;
+ m_perspective_bias1_vertex.set(&bias1, services);
+ m_perspective_bias1_pixel.set(&bias1, services);
+ f32 zbias = shadow->getPerspectiveBiasZ();
+ m_perspective_zbias_vertex.set(&zbias, services);
+ m_perspective_zbias_pixel.set(&zbias, services);
}
}
};
@@ -667,13 +682,19 @@ ShaderInfo ShaderSource::generateShader(const std::string &name,
)";
}
+ // Since this is the first time we're using the GL bindings be extra careful.
+ // This should be removed before 5.6.0 or similar.
+ if (!GL.GetString) {
+ errorstream << "OpenGL procedures were not loaded correctly, "
+ "please open a bug report with details about your platform/OS." << std::endl;
+ abort();
+ }
+
bool use_discard = use_gles;
-#ifdef __unix__
// For renderers that should use discard instead of GL_ALPHA_TEST
- const char* gl_renderer = (const char*)glGetString(GL_RENDERER);
- if (strstr(gl_renderer, "GC7000"))
+ const char *renderer = reinterpret_cast<const char*>(GL.GetString(GL.RENDERER));
+ if (strstr(renderer, "GC7000"))
use_discard = true;
-#endif
if (use_discard) {
if (shaderinfo.base_material == video::EMT_TRANSPARENT_ALPHA_CHANNEL)
shaders_header << "#define USE_DISCARD 1\n";