diff options
Diffstat (limited to 'graphics/asymptote/webgl/vertex.glsl')
-rw-r--r-- | graphics/asymptote/webgl/vertex.glsl | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/graphics/asymptote/webgl/vertex.glsl b/graphics/asymptote/webgl/vertex.glsl new file mode 100644 index 0000000000..250c0b7b4a --- /dev/null +++ b/graphics/asymptote/webgl/vertex.glsl @@ -0,0 +1,84 @@ +attribute vec3 position; +#ifdef WIDTH +attribute float width; +#endif +#ifdef NORMAL +attribute vec3 normal; +#endif +attribute float materialIndex; +#ifdef COLOR +attribute vec4 color; +#endif + +uniform mat3 normMat; +uniform mat4 viewMat; +uniform mat4 projViewMat; + +#ifdef NORMAL +#ifndef ORTHOGRAPHIC +varying vec3 ViewPosition; +#endif +varying vec3 Normal; +#endif +varying vec4 diffuse; +varying vec3 specular; +varying float roughness,metallic,fresnel0; +varying vec4 emissive; + +struct Material { + vec4 diffuse,emissive,specular; + vec4 parameters; +}; + +uniform Material Materials[Nmaterials]; + +void main(void) +{ + vec4 v=vec4(position,1.0); + gl_Position=projViewMat*v; +#ifdef NORMAL +#ifndef ORTHOGRAPHIC + ViewPosition=(viewMat*v).xyz; +#endif + Normal=normal*normMat; + + Material m; +#ifdef TRANSPARENT + m=Materials[int(abs(materialIndex))-1]; + if(materialIndex >= 0.0) { + diffuse=m.diffuse; + emissive=m.emissive; + } else { + diffuse=color; +#if nlights > 0 + emissive=vec4(0.0); +#else + emissive=color; +#endif + } +#else + m=Materials[int(materialIndex)]; +#ifdef COLOR + diffuse=color; +#if nlights > 0 + emissive=vec4(0.0); +#else + emissive=color; +#endif +#else + diffuse=m.diffuse; + emissive=m.emissive; +#endif +#endif + specular=m.specular.rgb; + vec4 parameters=m.parameters; + roughness=1.0-parameters[0]; + metallic=parameters[1]; + fresnel0=parameters[2]; +#else + emissive=Materials[int(materialIndex)].emissive; +#endif +#ifdef WIDTH + gl_PointSize=width; +#endif +} |