From 4a44d3b87517b52cc115b5a2066c5577a51df027 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 29 Jun 2014 10:10:08 +0200 Subject: [PATCH] Shaders: fix compilation of MeshVisualizer on WebGL and ANGLE. WebGL mandates that array subscription is done with constant expression, ANGLE too (but I think that has also something to do with D3D9 limitations). This is however allowed by OpenGL ES 2.0 specification, so enabling the workaround only for WebGL and ANGLE (i.e., this won't apply to Native Client using native GL drivers). --- src/Magnum/Shaders/MeshVisualizer.cpp | 6 ++++++ src/Magnum/Shaders/MeshVisualizer.vert | 9 ++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/Magnum/Shaders/MeshVisualizer.cpp b/src/Magnum/Shaders/MeshVisualizer.cpp index c0d50e681..f0d3a900f 100644 --- a/src/Magnum/Shaders/MeshVisualizer.cpp +++ b/src/Magnum/Shaders/MeshVisualizer.cpp @@ -61,6 +61,12 @@ MeshVisualizer::MeshVisualizer(const Flags flags): flags(flags), transformationP vert.addSource(flags & Flag::Wireframe ? "#define WIREFRAME_RENDERING\n" : "") .addSource(flags & Flag::NoGeometryShader ? "#define NO_GEOMETRY_SHADER\n" : "") + #ifdef MAGNUM_TARGET_WEBGL + .addSource("#define SUBSCRIPTING_WORKAROUND\n") + #elif defined(MAGNUM_TARGET_GLES) + .addSource(Context::current()->detectedDriver() & Context::DetectedDriver::ProbablyAngle ? + "#define SUBSCRIPTING_WORKAROUND\n" : "") + #endif .addSource(rs.get("generic.glsl")) .addSource(rs.get("MeshVisualizer.vert")); frag.addSource(flags & Flag::Wireframe ? "#define WIREFRAME_RENDERING\n" : "") diff --git a/src/Magnum/Shaders/MeshVisualizer.vert b/src/Magnum/Shaders/MeshVisualizer.vert index 156553f49..b8adcb1ba 100644 --- a/src/Magnum/Shaders/MeshVisualizer.vert +++ b/src/Magnum/Shaders/MeshVisualizer.vert @@ -58,10 +58,17 @@ void main() { #if defined(WIREFRAME_RENDERING) && defined(NO_GEOMETRY_SHADER) barycentric = vec3(0.0); - #ifndef NEW_GLSL + + #ifdef SUBSCRIPTING_WORKAROUND + int i = int(mod(vertexIndex, 3.0)); + if(i == 0) barycentric.x = 1.0; + else if(i == 1) barycentric.y = 1.0; + else barycentric.z = 1.0; + #elif !defined(NEW_GLSL) barycentric[int(mod(vertexIndex, 3.0))] = 1.0; #else barycentric[gl_VertexID % 3] = 1.0; #endif + #endif }