Browse Source

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).
pull/55/merge
Vladimír Vondruš 12 years ago
parent
commit
4a44d3b875
  1. 6
      src/Magnum/Shaders/MeshVisualizer.cpp
  2. 9
      src/Magnum/Shaders/MeshVisualizer.vert

6
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" : "")

9
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
}

Loading…
Cancel
Save