diff --git a/src/mol-canvas3d/canvas3d.ts b/src/mol-canvas3d/canvas3d.ts
index faa487b8063cc6f0cec9875d9b2f540846d05786..2a9f5896f12bf3d25aa77133e24288af3718eeb0 100644
--- a/src/mol-canvas3d/canvas3d.ts
+++ b/src/mol-canvas3d/canvas3d.ts
@@ -257,17 +257,21 @@ namespace Canvas3D {
             const yp = Math.round(y * pickScale)
 
             objectPickTarget.bind()
-            await webgl.readPixelsAsync(xp, yp, 1, 1, buffer)
+            // TODO slow in Chrome, ok in FF; doesn't play well with gpu surface calc
+            // await webgl.readPixelsAsync(xp, yp, 1, 1, buffer)
+            webgl.readPixels(xp, yp, 1, 1, buffer)
             const objectId = decodeIdRGB(buffer[0], buffer[1], buffer[2])
             if (objectId === -1) return
 
             instancePickTarget.bind()
-            await webgl.readPixelsAsync(xp, yp, 1, 1, buffer)
+            // await webgl.readPixelsAsync(xp, yp, 1, 1, buffer)
+            webgl.readPixels(xp, yp, 1, 1, buffer)
             const instanceId = decodeIdRGB(buffer[0], buffer[1], buffer[2])
             if (instanceId === -1) return
 
             groupPickTarget.bind()
-            await webgl.readPixelsAsync(xp, yp, 1, 1, buffer)
+            // await webgl.readPixelsAsync(xp, yp, 1, 1, buffer)
+            webgl.readPixels(xp, yp, 1, 1, buffer)
             const groupId = decodeIdRGB(buffer[0], buffer[1], buffer[2])
             if (groupId === -1) return
 
diff --git a/src/mol-gl/renderable/direct-volume.ts b/src/mol-gl/renderable/direct-volume.ts
index 27ce4e40668fb0b78c587187fbb6564d0fb006f3..46837f43c40bd91cc4a91c54bdae8918815011cd 100644
--- a/src/mol-gl/renderable/direct-volume.ts
+++ b/src/mol-gl/renderable/direct-volume.ts
@@ -35,6 +35,8 @@ export const DirectVolumeSchema = {
     elements: ElementsSpec('uint32'),
 
     uAlpha: UniformSpec('f'),
+    uHighlightColor: UniformSpec('v3'),
+    uSelectColor: UniformSpec('v3'),
     dUseFog: DefineSpec('boolean'),
 
     uIsoValue: UniformSpec('f'),
diff --git a/src/mol-gl/shader/direct-volume.frag b/src/mol-gl/shader/direct-volume.frag
index 7baa242c02aae1f90c6b47ebf9678152ff1f3cef..d94f580286440e3c29ef0aaf57e391d8a289b5a7 100644
--- a/src/mol-gl/shader/direct-volume.frag
+++ b/src/mol-gl/shader/direct-volume.frag
@@ -11,7 +11,6 @@ varying vec3 unitCoord;
 varying vec3 origPos;
 varying float instance;
 
-uniform float uAlpha;
 uniform mat4 uInvView;
 uniform float uIsoValue;
 uniform vec3 uGridDim;
@@ -26,6 +25,10 @@ uniform vec3 uSelectColor;
 uniform vec2 uMarkerTexDim;
 uniform sampler2D tMarker;
 
+uniform float uAlpha;
+uniform float uPickingAlphaThreshold;
+uniform int uPickable;
+
 #if defined(dGridTexType_2d)
     precision mediump sampler2D;
     uniform sampler2D tGridTex;
@@ -126,7 +129,9 @@ vec4 raymarch(vec3 startLoc, vec3 step, vec3 viewDir) {
                 #if defined(dColorType_objectPicking) || defined(dColorType_instancePicking) || defined(dColorType_groupPicking)
                     if (uAlpha < uPickingAlphaThreshold)
                         discard; // ignore so the element below can be picked
-                #else
+                    if (uPickable == 0)
+                        return vec4(0.0, 0.0, 0.0, 1.0); // set to empty picking id
+                #endif
 
                 #if defined(dColorType_objectPicking)
                     return vec4(encodeIdRGB(float(uObjectId)), 1.0);
diff --git a/src/mol-gl/webgl/program.ts b/src/mol-gl/webgl/program.ts
index b7eb34b2664aa1c3a795e2517badffcc959ddbca..6825b47bba9b1c4dafd4e8d5aa5da7585cbeec24 100644
--- a/src/mol-gl/webgl/program.ts
+++ b/src/mol-gl/webgl/program.ts
@@ -68,6 +68,9 @@ export function createProgram(ctx: WebGLContext, props: ProgramProps): Program {
     vertShaderRef.value.attach(program)
     fragShaderRef.value.attach(program)
     gl.linkProgram(program)
+    if (!gl.getProgramParameter(program, gl.LINK_STATUS)){
+        throw new Error(`Could not compile WebGL program. \n\n${gl.getProgramInfoLog(program)}`);
+    }
 
     const uniformUpdaters = getUniformUpdaters(ctx, program, schema)
     const attributeLocations = getAttributeLocations(ctx, program, schema)