1
0
mirror of https://github.com/luanti-org/luanti.git synced 2025-11-08 11:05:28 +01:00

Port most shaders to GLSL ES 3.0 (#16639)

This commit is contained in:
sfan5
2025-11-06 19:31:35 +01:00
committed by GitHub
parent 98fb381910
commit 298a27c743
37 changed files with 239 additions and 263 deletions

View File

@@ -6,7 +6,7 @@ uniform sampler2D textureFlags;
#define rightImage normalTexture #define rightImage normalTexture
#define maskImage textureFlags #define maskImage textureFlags
varying mediump vec4 varTexCoord; VARYING_ mediump vec4 varTexCoord;
void main(void) void main(void)
{ {

View File

@@ -1,4 +1,4 @@
varying mediump vec4 varTexCoord; VARYING_ mediump vec4 varTexCoord;
void main(void) void main(void)
{ {

View File

@@ -5,11 +5,7 @@
uniform sampler2D rendered; uniform sampler2D rendered;
uniform vec2 texelSize0; uniform vec2 texelSize0;
#ifdef GL_ES CENTROID_ VARYING_ mediump vec2 varTexCoord;
varying mediump vec2 varTexCoord;
#else
centroid varying vec2 varTexCoord;
#endif
void main(void) void main(void)
{ {

View File

@@ -1,8 +1,4 @@
#ifdef GL_ES CENTROID_ VARYING_ mediump vec2 varTexCoord;
varying mediump vec2 varTexCoord;
#else
centroid varying vec2 varTexCoord;
#endif
void main(void) void main(void)
{ {

View File

@@ -6,11 +6,7 @@ uniform sampler2D previous;
uniform vec2 texelSize0; uniform vec2 texelSize0;
uniform mediump float bloomRadius; uniform mediump float bloomRadius;
#ifdef GL_ES CENTROID_ VARYING_ mediump vec2 varTexCoord;
varying mediump vec2 varTexCoord;
#else
centroid varying vec2 varTexCoord;
#endif
void main(void) void main(void)
{ {

View File

@@ -1,8 +1,4 @@
#ifdef GL_ES CENTROID_ VARYING_ mediump vec2 varTexCoord;
varying mediump vec2 varTexCoord;
#else
centroid varying vec2 varTexCoord;
#endif
void main(void) void main(void)
{ {

View File

@@ -5,11 +5,7 @@ uniform vec2 texelSize0;
uniform mediump float bloomRadius; uniform mediump float bloomRadius;
uniform mat3 bloomBlurWeights; uniform mat3 bloomBlurWeights;
#ifdef GL_ES CENTROID_ VARYING_ mediump vec2 varTexCoord;
varying mediump vec2 varTexCoord;
#else
centroid varying vec2 varTexCoord;
#endif
// smoothstep - squared // smoothstep - squared
float smstsq(float f) float smstsq(float f)

View File

@@ -1,8 +1,4 @@
#ifdef GL_ES CENTROID_ VARYING_ mediump vec2 varTexCoord;
varying mediump vec2 varTexCoord;
#else
centroid varying vec2 varTexCoord;
#endif
void main(void) void main(void)
{ {

View File

@@ -5,11 +5,7 @@ uniform vec2 texelSize0;
uniform mediump float bloomRadius; uniform mediump float bloomRadius;
uniform mat3 bloomBlurWeights; uniform mat3 bloomBlurWeights;
#ifdef GL_ES CENTROID_ VARYING_ mediump vec2 varTexCoord;
varying mediump vec2 varTexCoord;
#else
centroid varying vec2 varTexCoord;
#endif
// smoothstep - squared // smoothstep - squared
float smstsq(float f) float smstsq(float f)

View File

@@ -1,8 +1,4 @@
#ifdef GL_ES CENTROID_ VARYING_ mediump vec2 varTexCoord;
varying mediump vec2 varTexCoord;
#else
centroid varying vec2 varTexCoord;
#endif
void main(void) void main(void)
{ {

View File

@@ -1,9 +1,9 @@
uniform lowp vec4 fogColor; uniform lowp vec4 fogColor;
uniform float fogDistance; uniform float fogDistance;
uniform float fogShadingParameter; uniform float fogShadingParameter;
varying highp vec3 eyeVec; VARYING_ highp vec3 eyeVec;
varying lowp vec4 varColor; VARYING_ lowp vec4 varColor;
void main(void) void main(void)
{ {

View File

@@ -1,8 +1,8 @@
uniform lowp vec4 materialColor; uniform lowp vec4 materialColor;
varying lowp vec4 varColor; VARYING_ lowp vec4 varColor;
varying highp vec3 eyeVec; VARYING_ highp vec3 eyeVec;
void main(void) void main(void)
{ {

View File

@@ -8,14 +8,10 @@ uniform sampler2D rendered;
uniform mediump float bloomStrength; uniform mediump float bloomStrength;
uniform ExposureParams exposureParams; uniform ExposureParams exposureParams;
#ifdef GL_ES CENTROID_ VARYING_ mediump vec2 varTexCoord;
varying mediump vec2 varTexCoord;
#else
centroid varying vec2 varTexCoord;
#endif
#ifdef ENABLE_AUTO_EXPOSURE #ifdef ENABLE_AUTO_EXPOSURE
varying float exposure; // linear exposure factor, see vertex shader VARYING_ float exposure; // linear exposure factor, see vertex shader
#endif #endif
void main(void) void main(void)

View File

@@ -3,14 +3,10 @@
uniform sampler2D exposureMap; uniform sampler2D exposureMap;
varying float exposure; VARYING_ float exposure;
#endif #endif
#ifdef GL_ES CENTROID_ VARYING_ mediump vec2 varTexCoord;
varying mediump vec2 varTexCoord;
#else
centroid varying vec2 varTexCoord;
#endif
void main(void) void main(void)

View File

@@ -3,16 +3,12 @@
uniform sampler2D rendered; uniform sampler2D rendered;
uniform vec2 texelSize0; uniform vec2 texelSize0;
varying vec2 sampleNW; VARYING_ vec2 sampleNW;
varying vec2 sampleNE; VARYING_ vec2 sampleNE;
varying vec2 sampleSW; VARYING_ vec2 sampleSW;
varying vec2 sampleSE; VARYING_ vec2 sampleSE;
#ifdef GL_ES CENTROID_ VARYING_ mediump vec2 varTexCoord;
varying mediump vec2 varTexCoord;
#else
centroid varying vec2 varTexCoord;
#endif
/** /**
Basic FXAA implementation based on the code on geeks3d.com with the Basic FXAA implementation based on the code on geeks3d.com with the
@@ -63,7 +59,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
vec4 fxaa(sampler2D tex, vec2 fragCoord, vec2 inverseVP, vec4 fxaa(sampler2D tex, vec2 fragCoord, vec2 inverseVP,
vec2 v_rgbNW, vec2 v_rgbNE, vec2 v_rgbNW, vec2 v_rgbNE,
vec2 v_rgbSW, vec2 v_rgbSE, vec2 v_rgbSW, vec2 v_rgbSE,
vec2 v_rgbM) { vec2 v_rgbM)
{
vec4 color; vec4 color;
vec3 rgbNW = texture2D(tex, v_rgbNW).xyz; vec3 rgbNW = texture2D(tex, v_rgbNW).xyz;
vec3 rgbNE = texture2D(tex, v_rgbNE).xyz; vec3 rgbNE = texture2D(tex, v_rgbNE).xyz;

View File

@@ -1,15 +1,11 @@
uniform vec2 texelSize0; uniform vec2 texelSize0;
#ifdef GL_ES CENTROID_ VARYING_ mediump vec2 varTexCoord;
varying mediump vec2 varTexCoord;
#else
centroid varying vec2 varTexCoord;
#endif
varying vec2 sampleNW; VARYING_ vec2 sampleNW;
varying vec2 sampleNE; VARYING_ vec2 sampleNE;
varying vec2 sampleSW; VARYING_ vec2 sampleSW;
varying vec2 sampleSE; VARYING_ vec2 sampleSE;
/* /*
Based on Based on

View File

@@ -1,20 +1,14 @@
#ifdef USE_ARRAY_TEXTURE #ifdef USE_ARRAY_TEXTURE
uniform sampler2DArray baseTexture; uniform mediump sampler2DArray baseTexture;
#else #else
uniform sampler2D baseTexture; uniform sampler2D baseTexture;
#endif #endif
varying vec3 vNormal; VARYING_ vec3 vNormal;
varying vec3 vPosition; VARYING_ vec3 vPosition;
#ifdef GL_ES CENTROID_ VARYING_ lowp vec4 varColor;
varying lowp vec4 varColor; CENTROID_ VARYING_ mediump vec2 varTexCoord;
varying mediump vec2 varTexCoord; CENTROID_ VARYING_ float varTexLayer; // actually int
varying float varTexLayer;
#else
centroid varying vec4 varColor;
centroid varying vec2 varTexCoord;
centroid varying float varTexLayer; // actually int
#endif
void main(void) void main(void)

View File

@@ -1,14 +1,8 @@
varying vec3 vNormal; VARYING_ vec3 vNormal;
varying vec3 vPosition; VARYING_ vec3 vPosition;
#ifdef GL_ES CENTROID_ VARYING_ lowp vec4 varColor;
varying lowp vec4 varColor; CENTROID_ VARYING_ mediump vec2 varTexCoord;
varying mediump vec2 varTexCoord; CENTROID_ VARYING_ float varTexLayer; // actually int
varying float varTexLayer;
#else
centroid varying vec4 varColor;
centroid varying vec2 varTexCoord;
centroid varying float varTexLayer; // actually int
#endif
void main(void) void main(void)
{ {

View File

@@ -2,8 +2,8 @@ uniform sampler2D baseTexture;
uniform sampler2D normalTexture; uniform sampler2D normalTexture;
uniform vec3 yawVec; uniform vec3 yawVec;
varying lowp vec4 varColor; VARYING_ lowp vec4 varColor;
varying mediump vec2 varTexCoord; VARYING_ mediump vec2 varTexCoord;
void main (void) void main (void)
{ {

View File

@@ -1,7 +1,7 @@
uniform mat4 mWorld; uniform mat4 mWorld;
varying lowp vec4 varColor; VARYING_ lowp vec4 varColor;
varying mediump vec2 varTexCoord; VARYING_ mediump vec2 varTexCoord;
void main(void) void main(void)
{ {

View File

@@ -1,5 +1,5 @@
#ifdef USE_ARRAY_TEXTURE #ifdef USE_ARRAY_TEXTURE
uniform sampler2DArray baseTexture; uniform mediump sampler2DArray baseTexture;
#else #else
uniform sampler2D baseTexture; uniform sampler2D baseTexture;
#endif #endif
@@ -33,34 +33,27 @@ uniform float crackTextureScale;
uniform float xyPerspectiveBias1; uniform float xyPerspectiveBias1;
uniform vec3 shadow_tint; uniform vec3 shadow_tint;
varying float adj_shadow_strength; VARYING_ float adj_shadow_strength;
varying float cosLight; VARYING_ float cosLight;
varying float f_normal_length; VARYING_ float f_normal_length;
varying vec3 shadow_position; VARYING_ vec3 shadow_position;
varying float perspective_factor; VARYING_ float perspective_factor;
#endif #endif
varying vec3 vNormal; VARYING_ vec3 vNormal;
varying vec3 vPosition; VARYING_ vec3 vPosition;
// World position in the visible world (i.e. relative to the cameraOffset.) // World position in the visible world (i.e. relative to the cameraOffset.)
// This can be used for many shader effects without loss of precision. // This can be used for many shader effects without loss of precision.
// If the absolute position is required it can be calculated with // If the absolute position is required it can be calculated with
// cameraOffset + worldPosition (for large coordinates the limits of float // cameraOffset + worldPosition (for large coordinates the limits of float
// precision must be considered). // precision must be considered).
varying vec3 worldPosition; VARYING_ vec3 worldPosition;
#ifdef GL_ES CENTROID_ VARYING_ lowp vec4 varColor;
varying lowp vec4 varColor; CENTROID_ VARYING_ mediump vec2 varTexCoord;
varying mediump vec2 varTexCoord; CENTROID_ VARYING_ float varTexLayer; // actually int
varying float varTexLayer; CENTROID_ VARYING_ float nightRatio;
varying float nightRatio; VARYING_ highp vec3 eyeVec;
#else
centroid varying lowp vec4 varColor;
centroid varying vec2 varTexCoord;
centroid varying float varTexLayer; // actually int
centroid varying float nightRatio;
#endif
varying highp vec3 eyeVec;
#ifdef ENABLE_DYNAMIC_SHADOWS #ifdef ENABLE_DYNAMIC_SHADOWS
#if (defined(ENABLE_WATER_REFLECTIONS) && MATERIAL_WATER_REFLECTIONS && ENABLE_WAVING_WATER) #if (defined(ENABLE_WATER_REFLECTIONS) && MATERIAL_WATER_REFLECTIONS && ENABLE_WAVING_WATER)

View File

@@ -6,28 +6,22 @@ uniform vec3 dayLight;
uniform highp vec3 cameraOffset; uniform highp vec3 cameraOffset;
uniform float animationTimer; uniform float animationTimer;
varying vec3 vNormal; VARYING_ vec3 vNormal;
varying vec3 vPosition; VARYING_ vec3 vPosition;
// World position in the visible world (i.e. relative to the cameraOffset.) // World position in the visible world (i.e. relative to the cameraOffset.)
// This can be used for many shader effects without loss of precision. // This can be used for many shader effects without loss of precision.
// If the absolute position is required it can be calculated with // If the absolute position is required it can be calculated with
// cameraOffset + worldPosition (for large coordinates the limits of float // cameraOffset + worldPosition (for large coordinates the limits of float
// precision must be considered). // precision must be considered).
varying vec3 worldPosition; VARYING_ vec3 worldPosition;
// The centroid keyword ensures that after interpolation the texture coordinates // The centroid keyword ensures that after interpolation the texture coordinates
// lie within the same bounds when MSAA is en- and disabled. // lie within the same bounds when MSAA is en- or disabled.
// This fixes the stripes problem with nearest-neighbor textures and MSAA. // This fixes the stripes problem with nearest-neighbor textures and MSAA.
#ifdef GL_ES CENTROID_ VARYING_ lowp vec4 varColor;
varying lowp vec4 varColor; CENTROID_ VARYING_ mediump vec2 varTexCoord;
varying mediump vec2 varTexCoord; CENTROID_ VARYING_ float varTexLayer; // actually int
varying float varTexLayer; CENTROID_ VARYING_ float nightRatio;
varying float nightRatio;
#else
centroid varying vec4 varColor;
centroid varying vec2 varTexCoord;
centroid varying float varTexLayer; // actually int
centroid varying float nightRatio;
#endif
#ifdef ENABLE_DYNAMIC_SHADOWS #ifdef ENABLE_DYNAMIC_SHADOWS
// shadow uniforms // shadow uniforms
uniform vec3 v_LightDirection; uniform vec3 v_LightDirection;
@@ -38,15 +32,15 @@ centroid varying float nightRatio;
uniform float f_timeofday; uniform float f_timeofday;
uniform vec4 CameraPos; uniform vec4 CameraPos;
varying float cosLight; VARYING_ float cosLight;
varying float normalOffsetScale; VARYING_ float normalOffsetScale;
varying float adj_shadow_strength; VARYING_ float adj_shadow_strength;
varying float f_normal_length; VARYING_ float f_normal_length;
varying vec3 shadow_position; VARYING_ vec3 shadow_position;
varying float perspective_factor; VARYING_ float perspective_factor;
#endif #endif
varying highp vec3 eyeVec; VARYING_ highp vec3 eyeVec;
// Color of the light emitted by the light sources. // Color of the light emitted by the light sources.
const vec3 artificialLight = vec3(1.04, 1.04, 1.04); const vec3 artificialLight = vec3(1.04, 1.04, 1.04);
const float e = 2.718281828459; const float e = 2.718281828459;

View File

@@ -1,5 +1,5 @@
#ifdef USE_ARRAY_TEXTURE #ifdef USE_ARRAY_TEXTURE
uniform sampler2DArray baseTexture; uniform mediump sampler2DArray baseTexture;
#else #else
uniform sampler2D baseTexture; uniform sampler2D baseTexture;
#endif #endif
@@ -26,34 +26,29 @@ uniform float animationTimer;
uniform float xyPerspectiveBias1; uniform float xyPerspectiveBias1;
uniform vec3 shadow_tint; uniform vec3 shadow_tint;
varying float adj_shadow_strength; VARYING_ float adj_shadow_strength;
varying float cosLight; VARYING_ float cosLight;
varying float f_normal_length; VARYING_ float f_normal_length;
varying vec3 shadow_position; VARYING_ vec3 shadow_position;
varying float perspective_factor; VARYING_ float perspective_factor;
#endif #endif
varying vec3 vNormal; VARYING_ vec3 vNormal;
varying vec3 vPosition; VARYING_ vec3 vPosition;
// World position in the visible world (i.e. relative to the cameraOffset.) // World position in the visible world (i.e. relative to the cameraOffset.)
// This can be used for many shader effects without loss of precision. // This can be used for many shader effects without loss of precision.
// If the absolute position is required it can be calculated with // If the absolute position is required it can be calculated with
// cameraOffset + worldPosition (for large coordinates the limits of float // cameraOffset + worldPosition (for large coordinates the limits of float
// precision must be considered). // precision must be considered).
varying vec3 worldPosition; VARYING_ vec3 worldPosition;
varying lowp vec4 varColor; VARYING_ lowp vec4 varColor;
#ifdef GL_ES CENTROID_ VARYING_ mediump vec2 varTexCoord;
varying mediump vec2 varTexCoord; CENTROID_ VARYING_ float varTexLayer; // actually int
varying float varTexLayer; VARYING_ highp vec3 eyeVec;
#else VARYING_ float nightRatio;
centroid varying vec2 varTexCoord;
centroid varying float varTexLayer; // actually int
#endif
varying highp vec3 eyeVec;
varying float nightRatio;
varying float vIDiff; VARYING_ float vIDiff;
#ifdef ENABLE_DYNAMIC_SHADOWS #ifdef ENABLE_DYNAMIC_SHADOWS
@@ -467,5 +462,5 @@ void main(void)
col = mix(fogColor * pow(fogColor / fogColorMax, vec4(2.0 * clarity)), col, clarity); col = mix(fogColor * pow(fogColor / fogColorMax, vec4(2.0 * clarity)), col, clarity);
col = vec4(col.rgb, base.a); col = vec4(col.rgb, base.a);
gl_FragData[0] = col; gl_FragColor = col;
} }

View File

@@ -3,17 +3,12 @@ uniform vec3 dayLight;
uniform float animationTimer; uniform float animationTimer;
uniform lowp vec4 materialColor; uniform lowp vec4 materialColor;
varying vec3 vNormal; VARYING_ vec3 vNormal;
varying vec3 vPosition; VARYING_ vec3 vPosition;
varying vec3 worldPosition; VARYING_ vec3 worldPosition;
varying lowp vec4 varColor; VARYING_ lowp vec4 varColor;
#ifdef GL_ES CENTROID_ VARYING_ mediump vec2 varTexCoord;
varying mediump vec2 varTexCoord; CENTROID_ VARYING_ float varTexLayer; // actually int
varying float varTexLayer;
#else
centroid varying vec2 varTexCoord;
centroid varying float varTexLayer; // actually int
#endif
#ifdef ENABLE_DYNAMIC_SHADOWS #ifdef ENABLE_DYNAMIC_SHADOWS
// shadow uniforms // shadow uniforms
@@ -25,18 +20,18 @@ centroid varying float varTexLayer; // actually int
uniform float f_timeofday; uniform float f_timeofday;
uniform vec4 CameraPos; uniform vec4 CameraPos;
varying float cosLight; VARYING_ float cosLight;
varying float adj_shadow_strength; VARYING_ float adj_shadow_strength;
varying float f_normal_length; VARYING_ float f_normal_length;
varying vec3 shadow_position; VARYING_ vec3 shadow_position;
varying float perspective_factor; VARYING_ float perspective_factor;
#endif #endif
varying highp vec3 eyeVec; VARYING_ highp vec3 eyeVec;
varying float nightRatio; VARYING_ float nightRatio;
// Color of the light emitted by the light sources. // Color of the light emitted by the light sources.
const vec3 artificialLight = vec3(1.04, 1.04, 1.04); const vec3 artificialLight = vec3(1.04, 1.04, 1.04);
varying float vIDiff; VARYING_ float vIDiff;
const float e = 2.718281828459; const float e = 2.718281828459;
const float BS = 10.0; const float BS = 10.0;
uniform float xyPerspectiveBias0; uniform float xyPerspectiveBias0;

View File

@@ -21,14 +21,10 @@ uniform ExposureParams exposureParams;
uniform lowp float bloomIntensity; uniform lowp float bloomIntensity;
uniform lowp float saturation; uniform lowp float saturation;
#ifdef GL_ES CENTROID_ VARYING_ mediump vec2 varTexCoord;
varying mediump vec2 varTexCoord;
#else
centroid varying vec2 varTexCoord;
#endif
#ifdef ENABLE_AUTO_EXPOSURE #ifdef ENABLE_AUTO_EXPOSURE
varying float exposure; // linear exposure factor, see vertex shader VARYING_ float exposure; // linear exposure factor, see vertex shader
#endif #endif
#ifdef ENABLE_BLOOM #ifdef ENABLE_BLOOM

View File

@@ -3,14 +3,10 @@
uniform sampler2D exposureMap; uniform sampler2D exposureMap;
varying float exposure; VARYING_ float exposure;
#endif #endif
#ifdef GL_ES CENTROID_ VARYING_ mediump vec2 varTexCoord;
varying mediump vec2 varTexCoord;
#else
centroid varying vec2 varTexCoord;
#endif
void main(void) void main(void)
{ {

View File

@@ -1,12 +1,12 @@
uniform sampler2D baseTexture; uniform sampler2D baseTexture;
varying lowp vec4 varColor; VARYING_ lowp vec4 varColor;
varying mediump vec2 varTexCoord; VARYING_ mediump vec2 varTexCoord;
void main(void) void main(void)
{ {
vec2 uv = varTexCoord.st; vec2 uv = varTexCoord.st;
vec4 color = texture2D(baseTexture, uv); vec4 color = texture2D(baseTexture, uv);
color.rgb *= varColor.rgb; color.rgb *= varColor.rgb;
gl_FragData[0] = color; fragColor = color;
} }

View File

@@ -1,5 +1,5 @@
varying lowp vec4 varColor; VARYING_ lowp vec4 varColor;
varying mediump vec2 varTexCoord; VARYING_ mediump vec2 varTexCoord;
void main(void) void main(void)
{ {

View File

@@ -1,11 +1,4 @@
#ifdef GL_ES
varying mediump vec2 varTexCoord;
#else
centroid varying vec2 varTexCoord;
#endif
void main(void) void main(void)
{ {
varTexCoord.st = inTexCoord0.st;
gl_Position = inVertexPosition; gl_Position = inVertexPosition;
} }

View File

@@ -18,11 +18,7 @@ uniform vec3 v_LightDirection;
const vec3 v_LightDirection = vec3(0.0, -1.0, 0.0); const vec3 v_LightDirection = vec3(0.0, -1.0, 0.0);
#endif #endif
#ifdef GL_ES CENTROID_ VARYING_ mediump vec2 varTexCoord;
varying mediump vec2 varTexCoord;
#else
centroid varying vec2 varTexCoord;
#endif
const float far = 1000.; const float far = 1000.;
float mapDepth(float depth) float mapDepth(float depth)

View File

@@ -1,9 +1,4 @@
#ifdef GL_ES CENTROID_ VARYING_ mediump vec2 varTexCoord;
varying mediump vec2 varTexCoord;
#else
centroid varying vec2 varTexCoord;
#endif
void main(void) void main(void)
{ {

View File

@@ -63,6 +63,8 @@ struct SFrameStats {
}; };
struct SDriverLimits { struct SDriverLimits {
//! Major and minor GL version
core::vector2di GLVersion;
//! Maximum amount of primitives that can be rendered in a single call //! Maximum amount of primitives that can be rendered in a single call
u32 MaxPrimitiveCount = 0; u32 MaxPrimitiveCount = 0;
//! Maximum width/height for a texture //! Maximum width/height for a texture

View File

@@ -2649,6 +2649,7 @@ ITexture *COpenGLDriver::addRenderTargetTextureCubemap(const u32 sideLen, const
SDriverLimits COpenGLDriver::getLimits() const SDriverLimits COpenGLDriver::getLimits() const
{ {
SDriverLimits ret; SDriverLimits ret;
ret.GLVersion = core::vector2di(Version / 100, Version % 100);
ret.MaxPrimitiveCount = 0x7fffffff; ret.MaxPrimitiveCount = 0x7fffffff;
ret.MaxTextureSize = MaxTextureSize; ret.MaxTextureSize = MaxTextureSize;
return ret; return ret;

View File

@@ -1687,6 +1687,7 @@ ITexture *COpenGL3DriverBase::addRenderTargetTextureCubemap(const u32 sideLen, c
SDriverLimits COpenGL3DriverBase::getLimits() const SDriverLimits COpenGL3DriverBase::getLimits() const
{ {
SDriverLimits ret; SDriverLimits ret;
ret.GLVersion = core::vector2di(Version.Major, Version.Minor);
ret.MaxPrimitiveCount = Version.Spec == OpenGLSpec::ES ? UINT16_MAX : INT32_MAX; ret.MaxPrimitiveCount = Version.Spec == OpenGLSpec::ES ? UINT16_MAX : INT32_MAX;
ret.MaxTextureSize = MaxTextureSize; ret.MaxTextureSize = MaxTextureSize;
ret.MaxArrayTextureImages = MaxArrayTextureLayers; ret.MaxArrayTextureImages = MaxArrayTextureLayers;

View File

@@ -255,7 +255,7 @@ public:
if (g_settings->get("antialiasing") == "ssaa") { if (g_settings->get("antialiasing") == "ssaa") {
constants["ENABLE_SSAA"] = 1; constants["ENABLE_SSAA"] = 1;
u16 ssaa_scale = std::max<u16>(2, g_settings->getU16("fsaa")); u16 ssaa_scale = std::max<u16>(2, g_settings->getU16("fsaa"));
constants["SSAA_SCALE"] = ssaa_scale; constants["SSAA_SCALE"] = (float)ssaa_scale;
} }
if (g_settings->getBool("debanding")) if (g_settings->getBool("debanding"))
@@ -405,11 +405,27 @@ public:
m_uniform_factories.emplace_back(std::move(setter)); m_uniform_factories.emplace_back(std::move(setter));
} }
bool supportsSampler2DArray() const override
{
auto *driver = RenderingEngine::get_video_driver();
if (driver->getDriverType() == video::EDT_OGLES2) {
// Funnily OpenGL ES 2.0 may support creating array textures
// with an extension, but to practically use them you need 3.0.
return m_have_glsl3;
}
return m_fully_programmable;
}
private: private:
// The id of the thread that is allowed to use irrlicht directly // The id of the thread that is allowed to use irrlicht directly
std::thread::id m_main_thread; std::thread::id m_main_thread;
// Driver has fully programmable pipeline?
bool m_fully_programmable = false;
// Driver supports GLSL (ES) 3.x?
bool m_have_glsl3 = false;
// Cache of source shaders // Cache of source shaders
// This should be only accessed from the main thread // This should be only accessed from the main thread
SourceShaderCache m_sourcecache; SourceShaderCache m_sourcecache;
@@ -459,6 +475,25 @@ ShaderSource::ShaderSource()
// Add global stuff // Add global stuff
addShaderConstantSetter(std::make_unique<MainShaderConstantSetter>()); addShaderConstantSetter(std::make_unique<MainShaderConstantSetter>());
addShaderUniformSetterFactory(std::make_unique<MainShaderUniformSetterFactory>()); addShaderUniformSetterFactory(std::make_unique<MainShaderUniformSetterFactory>());
auto *driver = RenderingEngine::get_video_driver();
const auto driver_type = driver->getDriverType();
if (driver_type != video::EDT_NULL) {
auto *gpu = driver->getGPUProgrammingServices();
if (!driver->queryFeature(video::EVDF_ARB_GLSL) || !gpu)
throw ShaderException(gettext("GLSL is not supported by the driver"));
v2s32 glver = driver->getLimits().GLVersion;
infostream << "ShaderSource: driver reports GL version " << glver.X << "."
<< glver.Y << std::endl;
assert(glver.X >= 2);
m_fully_programmable = driver_type != video::EDT_OPENGL;
if (driver_type == video::EDT_OGLES2) {
m_have_glsl3 = glver.X >= 3;
} else if (driver_type == video::EDT_OPENGL3) {
// future TODO
}
}
} }
ShaderSource::~ShaderSource() ShaderSource::~ShaderSource()
@@ -467,7 +502,6 @@ ShaderSource::~ShaderSource()
// Delete materials // Delete materials
auto *gpu = RenderingEngine::get_video_driver()->getGPUProgrammingServices(); auto *gpu = RenderingEngine::get_video_driver()->getGPUProgrammingServices();
assert(gpu);
u32 n = 0; u32 n = 0;
for (ShaderInfo &i : m_shaderinfo_cache) { for (ShaderInfo &i : m_shaderinfo_cache) {
if (!i.name.empty()) { if (!i.name.empty()) {
@@ -639,24 +673,39 @@ void ShaderSource::generateShader(ShaderInfo &shaderinfo)
} }
auto *gpu = driver->getGPUProgrammingServices(); auto *gpu = driver->getGPUProgrammingServices();
if (!driver->queryFeature(video::EVDF_ARB_GLSL) || !gpu) { assert(gpu);
throw ShaderException(gettext("GLSL is not supported by the driver"));
}
// Create shaders header // Create shaders header
bool fully_programmable = driver->getDriverType() == video::EDT_OGLES2 || driver->getDriverType() == video::EDT_OPENGL3;
std::ostringstream shaders_header; std::ostringstream shaders_header;
shaders_header shaders_header
<< std::noboolalpha << std::noboolalpha
<< std::showpoint // for GLSL ES << std::showpoint // for GLSL ES
; ;
std::string vertex_header, fragment_header, geometry_header; std::string vertex_header, fragment_header, geometry_header;
if (fully_programmable) { if (m_fully_programmable) {
const bool use_glsl3 = m_have_glsl3;
if (driver->getDriverType() == video::EDT_OPENGL3) { if (driver->getDriverType() == video::EDT_OPENGL3) {
shaders_header << "#version 150\n"; assert(!use_glsl3);
shaders_header << "#version 150\n"
<< "#define CENTROID_ centroid\n";
} else if (driver->getDriverType() == video::EDT_OGLES2) {
if (use_glsl3) {
shaders_header << "#version 300 es\n"
<< "#define CENTROID_ centroid\n";
} else { } else {
shaders_header << "#version 100\n"; shaders_header << "#version 100\n"
<< "#define CENTROID_\n";
} }
} else {
assert(false);
}
if (use_glsl3) {
shaders_header << "#define ATTRIBUTE_(n) layout(location = n) in\n"
"#define texture2D texture\n";
} else {
shaders_header << "#define ATTRIBUTE_(n) attribute\n";
}
// cf. EVertexAttributes.h for the predefined ones // cf. EVertexAttributes.h for the predefined ones
vertex_header = R"( vertex_header = R"(
precision mediump float; precision mediump float;
@@ -665,21 +714,34 @@ void ShaderSource::generateShader(ShaderInfo &shaderinfo)
uniform highp mat4 mWorldViewProj; uniform highp mat4 mWorldViewProj;
uniform mediump mat4 mTexture; uniform mediump mat4 mTexture;
attribute highp vec4 inVertexPosition; ATTRIBUTE_(0) highp vec4 inVertexPosition;
attribute mediump vec3 inVertexNormal; ATTRIBUTE_(1) mediump vec3 inVertexNormal;
attribute lowp vec4 inVertexColor; ATTRIBUTE_(2) lowp vec4 inVertexColor;
attribute mediump float inVertexAux; ATTRIBUTE_(3) mediump float inVertexAux;
attribute mediump vec2 inTexCoord0; ATTRIBUTE_(4) mediump vec2 inTexCoord0;
attribute mediump vec2 inTexCoord1; ATTRIBUTE_(5) mediump vec2 inTexCoord1;
attribute mediump vec4 inVertexTangent; ATTRIBUTE_(6) mediump vec4 inVertexTangent;
attribute mediump vec4 inVertexBinormal; ATTRIBUTE_(7) mediump vec4 inVertexBinormal;
)"; )";
if (use_glsl3) {
vertex_header += "#define VARYING_ out\n";
} else {
vertex_header += "#define VARYING_ varying\n";
}
// Our vertex color has components reversed compared to what OpenGL // Our vertex color has components reversed compared to what OpenGL
// normally expects, so we need to take that into account. // normally expects, so we need to take that into account.
vertex_header += "#define inVertexColor (inVertexColor.bgra)\n"; vertex_header += "#define inVertexColor (inVertexColor.bgra)\n";
fragment_header = R"( fragment_header = R"(
precision mediump float; precision mediump float;
)"; )";
if (use_glsl3) {
fragment_header += "#define VARYING_ in\n"
"#define gl_FragColor outFragColor\n"
"layout(location = 0) out vec4 outFragColor;\n";
} else {
fragment_header += "#define VARYING_ varying\n";
}
} else { } else {
/* legacy OpenGL driver */ /* legacy OpenGL driver */
shaders_header << R"( shaders_header << R"(
@@ -699,6 +761,13 @@ void ShaderSource::generateShader(ShaderInfo &shaderinfo)
#define inVertexNormal gl_Normal #define inVertexNormal gl_Normal
#define inVertexTangent gl_MultiTexCoord1 #define inVertexTangent gl_MultiTexCoord1
#define inVertexBinormal gl_MultiTexCoord2 #define inVertexBinormal gl_MultiTexCoord2
#define VARYING_ varying
#define CENTROID_ centroid
)";
fragment_header = R"(
#define VARYING_ varying
#define CENTROID_ centroid
)"; )";
} }
@@ -719,7 +788,7 @@ void ShaderSource::generateShader(ShaderInfo &shaderinfo)
ShaderConstants constants = input_const; ShaderConstants constants = input_const;
bool use_discard = fully_programmable; bool use_discard = m_fully_programmable;
if (!use_discard) { if (!use_discard) {
// workaround for a certain OpenGL implementation lacking GL_ALPHA_TEST // workaround for a certain OpenGL implementation lacking GL_ALPHA_TEST
const char *renderer = reinterpret_cast<const char*>(GL.GetString(GL.RENDERER)); const char *renderer = reinterpret_cast<const char*>(GL.GetString(GL.RENDERER));
@@ -753,6 +822,10 @@ void ShaderSource::generateShader(ShaderInfo &shaderinfo)
std::string fragment_shader = m_sourcecache.getOrLoad(name, "opengl_fragment.glsl"); std::string fragment_shader = m_sourcecache.getOrLoad(name, "opengl_fragment.glsl");
std::string geometry_shader = m_sourcecache.getOrLoad(name, "opengl_geometry.glsl"); std::string geometry_shader = m_sourcecache.getOrLoad(name, "opengl_geometry.glsl");
if (vertex_shader.empty() || fragment_shader.empty()) {
throw ShaderException(fmtgettext("Failed to find \"%s\" shader files.", name.c_str()));
}
vertex_shader = common_header + vertex_header + final_header + vertex_shader; vertex_shader = common_header + vertex_header + final_header + vertex_shader;
fragment_shader = common_header + fragment_header + final_header + fragment_shader; fragment_shader = common_header + fragment_header + final_header + fragment_shader;
const char *geometry_shader_ptr = nullptr; // optional const char *geometry_shader_ptr = nullptr; // optional
@@ -772,9 +845,10 @@ void ShaderSource::generateShader(ShaderInfo &shaderinfo)
if (shadermat == -1) { if (shadermat == -1) {
errorstream << "generateShader(): failed to generate shaders for " errorstream << "generateShader(): failed to generate shaders for "
<< log_name << ", addHighLevelShaderMaterial failed." << std::endl; << log_name << ", addHighLevelShaderMaterial failed." << std::endl;
dumpShaderProgram(warningstream, "Vertex", vertex_shader); dumpShaderProgram(warningstream, "vertex", vertex_shader);
dumpShaderProgram(warningstream, "Fragment", fragment_shader); dumpShaderProgram(warningstream, "fragment", fragment_shader);
dumpShaderProgram(warningstream, "Geometry", geometry_shader); if (geometry_shader_ptr)
dumpShaderProgram(warningstream, "geometry", geometry_shader);
throw ShaderException( throw ShaderException(
fmtgettext("Failed to compile the \"%s\" shader.", log_name.c_str()) + fmtgettext("Failed to compile the \"%s\" shader.", log_name.c_str()) +
strgettext("\nCheck debug.txt for details.")); strgettext("\nCheck debug.txt for details."));
@@ -819,20 +893,21 @@ u32 IShaderSource::getShader(const std::string &name,
return getShader(name, input_const, base_mat); return getShader(name, input_const, base_mat);
} }
void dumpShaderProgram(std::ostream &output_stream, void dumpShaderProgram(std::ostream &os,
const std::string &program_type, std::string_view program) const std::string &program_type, std::string_view program)
{ {
output_stream << program_type << " shader program:" << std::endl << os << program_type << " shader program:\n"
"----------------------------------" << std::endl; "----------------------------------" << '\n';
size_t pos = 0; size_t pos = 0, prev = 0;
size_t prev = 0; int nline = 1;
s16 line = 1;
while ((pos = program.find('\n', prev)) != std::string::npos) { while ((pos = program.find('\n', prev)) != std::string::npos) {
output_stream << line++ << ": "<< program.substr(prev, pos - prev) << auto line = program.substr(prev, pos - prev);
std::endl; // Be smart about line number reset
if (trim(line) == "#line 0")
nline = 0;
os << (nline++) << ": " << line << '\n';
prev = pos + 1; prev = pos + 1;
} }
output_stream << line << ": " << program.substr(prev) << std::endl << os << nline << ": " << program.substr(prev) << '\n' <<
"End of " << program_type << " shader program." << std::endl << "End of " << program_type << " shader program.\n \n" << std::flush;
" " << std::endl;
} }

View File

@@ -282,6 +282,11 @@ public:
video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF; video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF;
return getShader(name, ShaderConstants(), base_mat); return getShader(name, ShaderConstants(), base_mat);
} }
/**
* @brief Returns true if 'sampler2DArray' is supported in GLSL
*/
virtual bool supportsSampler2DArray() const = 0;
}; };
class IWritableShaderSource : public IShaderSource { class IWritableShaderSource : public IShaderSource {

View File

@@ -892,16 +892,14 @@ static bool isWorldAligned(AlignStyle style, WorldAlignMode mode, NodeDrawType d
} }
/// @return maximum number of layers in array textures we can use (0 if unsupported) /// @return maximum number of layers in array textures we can use (0 if unsupported)
static size_t getArrayTextureMax(video::IVideoDriver *driver) static size_t getArrayTextureMax(IShaderSource *shdsrc)
{ {
// needs to actually support array textures auto *driver = RenderingEngine::get_video_driver();
// needs to support creating array textures
if (!driver->queryFeature(video::EVDF_TEXTURE_2D_ARRAY)) if (!driver->queryFeature(video::EVDF_TEXTURE_2D_ARRAY))
return 0; return 0;
// must not be the legacy driver, due to custom vertex format // must support sampling from them
if (driver->getDriverType() == video::EDT_OPENGL) if (!shdsrc->supportsSampler2DArray())
return 0;
// doesn't work on GLES yet (TODO)
if (driver->getDriverType() == video::EDT_OGLES2)
return 0; return 0;
// shadow shaders can't handle array textures yet (TODO) // shadow shaders can't handle array textures yet (TODO)
if (g_settings->getBool("enable_dynamic_shadows")) if (g_settings->getBool("enable_dynamic_shadows"))
@@ -1050,7 +1048,7 @@ void ContentFeatures::updateTextures(ITextureSource *tsrc, IShaderSource *shdsrc
} }
} }
const bool texture_2d_array = getArrayTextureMax(RenderingEngine::get_video_driver()) > 1; const bool texture_2d_array = getArrayTextureMax(shdsrc) > 1;
const auto &getNodeShader = [&] (MaterialType my_material, NodeDrawType my_drawtype) { const auto &getNodeShader = [&] (MaterialType my_material, NodeDrawType my_drawtype) {
ShaderIds ret; ShaderIds ret;
ret.normal = shdsrc->getShader("nodes_shader", my_material, my_drawtype); ret.normal = shdsrc->getShader("nodes_shader", my_material, my_drawtype);
@@ -1673,7 +1671,7 @@ void NodeDefManager::updateTextures(IGameDef *gamedef, void *progress_callback_a
} }
/* texture pre-loading stage */ /* texture pre-loading stage */
const size_t arraymax = getArrayTextureMax(RenderingEngine::get_video_driver()); const size_t arraymax = getArrayTextureMax(shdsrc);
// Group by size // Group by size
std::unordered_map<v2u32, std::vector<std::string_view>> sizes; std::unordered_map<v2u32, std::vector<std::string_view>> sizes;
if (arraymax > 1) { if (arraymax > 1) {