diff --git a/src/mol-geo/geometry/lines/lines.ts b/src/mol-geo/geometry/lines/lines.ts
index 3648e8490fd18845bc3a46ab0e348b1e8955e250..2ba76bd83541ebd8bf1bbc7fba472ecf179070d4 100644
--- a/src/mol-geo/geometry/lines/lines.ts
+++ b/src/mol-geo/geometry/lines/lines.ts
@@ -94,6 +94,7 @@ export namespace Lines {
 
     export const Params = {
         ...Geometry.Params,
+        sizeFactor: PD.Numeric(1, { min: 0, max: 10, step: 0.1 }),
         lineSizeAttenuation: PD.Boolean(false),
     }
     export type Params = typeof Params
@@ -123,6 +124,7 @@ export namespace Lines {
             ...transform,
 
             ...Geometry.createValues(props, counts),
+            uSizeFactor: ValueCell.create(props.sizeFactor),
             dLineSizeAttenuation: ValueCell.create(props.lineSizeAttenuation),
             dDoubleSided: ValueCell.create(true),
             dFlipSided: ValueCell.create(false),
@@ -131,6 +133,7 @@ export namespace Lines {
 
     export function updateValues(values: LinesValues, props: PD.Values<Params>) {
         Geometry.updateValues(values, props)
+        ValueCell.updateIfChanged(values.uSizeFactor, props.sizeFactor)
         ValueCell.updateIfChanged(values.dLineSizeAttenuation, props.lineSizeAttenuation)
     }
 
diff --git a/src/mol-geo/geometry/points/points.ts b/src/mol-geo/geometry/points/points.ts
index c25d51fbad76f4ddf5fae03bfff67e8a8a40c7ec..d4cdc622604f3b8c6e6657f22d09ca758468bd9e 100644
--- a/src/mol-geo/geometry/points/points.ts
+++ b/src/mol-geo/geometry/points/points.ts
@@ -57,6 +57,7 @@ export namespace Points {
 
     export const Params = {
         ...Geometry.Params,
+        sizeFactor: PD.Numeric(1, { min: 0, max: 10, step: 0.1 }),
         pointSizeAttenuation: PD.Boolean(false),
         pointFilledCircle: PD.Boolean(false),
         pointEdgeBleach: PD.Numeric(0.2, { min: 0, max: 1, step: 0.05 }),
@@ -87,6 +88,7 @@ export namespace Points {
             ...transform,
 
             ...Geometry.createValues(props, counts),
+            uSizeFactor: ValueCell.create(props.sizeFactor),
             dPointSizeAttenuation: ValueCell.create(props.pointSizeAttenuation),
             dPointFilledCircle: ValueCell.create(props.pointFilledCircle),
             uPointEdgeBleach: ValueCell.create(props.pointEdgeBleach),
@@ -95,6 +97,7 @@ export namespace Points {
 
     export function updateValues(values: PointsValues, props: PD.Values<Params>) {
         Geometry.updateValues(values, props)
+        ValueCell.updateIfChanged(values.uSizeFactor, props.sizeFactor)
         ValueCell.updateIfChanged(values.dPointSizeAttenuation, props.pointSizeAttenuation)
         ValueCell.updateIfChanged(values.dPointFilledCircle, props.pointFilledCircle)
         ValueCell.updateIfChanged(values.uPointEdgeBleach, props.pointEdgeBleach)
diff --git a/src/mol-geo/geometry/spheres/spheres.ts b/src/mol-geo/geometry/spheres/spheres.ts
index 270409f226b0676642731cf0031fffb23650abd5..a460d763912dd2cf521ce1f12ddbd2132c9062e6 100644
--- a/src/mol-geo/geometry/spheres/spheres.ts
+++ b/src/mol-geo/geometry/spheres/spheres.ts
@@ -53,6 +53,7 @@ export namespace Spheres {
 
     export const Params = {
         ...Geometry.Params,
+        sizeFactor: PD.Numeric(1, { min: 0, max: 10, step: 0.1 }),
         doubleSided: PD.Boolean(false),
     }
     export type Params = typeof Params
@@ -90,6 +91,7 @@ export namespace Spheres {
             padding: ValueCell.create(padding),
 
             ...Geometry.createValues(props, counts),
+            uSizeFactor: ValueCell.create(props.sizeFactor),
             dDoubleSided: ValueCell.create(props.doubleSided),
         }
     }
@@ -125,12 +127,15 @@ export namespace Spheres {
             padding: ValueCell.create(sizeValue),
 
             ...Geometry.createValues(p, counts),
+            uSizeFactor: ValueCell.create(p.sizeFactor),
             dDoubleSided: ValueCell.create(p.doubleSided),
         }
     }
 
     export function updateValues(values: SpheresValues, props: PD.Values<Params>) {
         Geometry.updateValues(values, props)
+        ValueCell.updateIfChanged(values.uSizeFactor, props.sizeFactor)
+        ValueCell.updateIfChanged(values.dDoubleSided, props.doubleSided)
     }
 
     export function updateBoundingSphere(values: SpheresValues, spheres: Spheres) {
diff --git a/src/mol-gl/_spec/renderer.spec.ts b/src/mol-gl/_spec/renderer.spec.ts
index 1f580b19975f0be7d9698ea336814bbfe0b9ed38..0b74164e775b9fe394d5a3a67658d7bb76aec85a 100644
--- a/src/mol-gl/_spec/renderer.spec.ts
+++ b/src/mol-gl/_spec/renderer.spec.ts
@@ -82,6 +82,7 @@ function createPoints() {
         boundingSphere,
         invariantBoundingSphere,
 
+        uSizeFactor: ValueCell.create(1),
         dPointSizeAttenuation: ValueCell.create(true),
         dPointFilledCircle: ValueCell.create(false),
         uPointEdgeBleach: ValueCell.create(0.5),
diff --git a/src/mol-gl/renderable/schema.ts b/src/mol-gl/renderable/schema.ts
index 195aad5a62060003b56ace7aa09943816a93f5a8..bf9533943517af14b91f3c3e4bbd3f4c8a8124b7 100644
--- a/src/mol-gl/renderable/schema.ts
+++ b/src/mol-gl/renderable/schema.ts
@@ -180,6 +180,7 @@ export const SizeSchema = {
     uSizeTexDim: UniformSpec('v2'),
     tSize: TextureSpec('image-uint8', 'alpha', 'ubyte', 'nearest'),
     dSizeType: DefineSpec('string', ['uniform', 'attribute', 'instance', 'group', 'group_instance']),
+    uSizeFactor: UniformSpec('f'),
 }
 export type SizeSchema = typeof SizeSchema
 export type SizeValues = Values<SizeSchema>
diff --git a/src/mol-gl/shader/chunks/assign-size.glsl b/src/mol-gl/shader/chunks/assign-size.glsl
index 20a66c9fdf88a9265c6b8dbc8bf9640983b23c8c..be66b9bfff1c10383baaf03dd571066a66772364 100644
--- a/src/mol-gl/shader/chunks/assign-size.glsl
+++ b/src/mol-gl/shader/chunks/assign-size.glsl
@@ -12,4 +12,6 @@
 
 #if defined(dSizeType_instance) || defined(dSizeType_group) || defined(dSizeType_groupInstance)
     size = decodeFloatLog(size);
-#endif
\ No newline at end of file
+#endif
+
+size *= uSizeFactor;
\ No newline at end of file
diff --git a/src/mol-gl/shader/chunks/size-vert-params.glsl b/src/mol-gl/shader/chunks/size-vert-params.glsl
index 8ccf85e6945b4abd0829d4ca6f65b0445d276569..ed65c46c30a50a29b2b32ba63787187b92e6e039 100644
--- a/src/mol-gl/shader/chunks/size-vert-params.glsl
+++ b/src/mol-gl/shader/chunks/size-vert-params.glsl
@@ -6,4 +6,6 @@
     uniform vec2 uSizeTexDim;
     uniform sampler2D tSize;
     #pragma glslify: decodeFloatLog = require(../utils/decode-float-log.glsl)
-#endif
\ No newline at end of file
+#endif
+
+uniform float uSizeFactor;
\ No newline at end of file
diff --git a/src/mol-gl/shader/lines.vert b/src/mol-gl/shader/lines.vert
index 854f103160515b2cbe1d3ea37c98bb5d674f0742..91f0ca8d676f43a197f7acd087a88026a5fb46e3 100644
--- a/src/mol-gl/shader/lines.vert
+++ b/src/mol-gl/shader/lines.vert
@@ -11,20 +11,11 @@ precision highp int;
 
 #pragma glslify: import('./chunks/common-vert-params.glsl')
 #pragma glslify: import('./chunks/color-vert-params.glsl')
+#pragma glslify: import('./chunks/size-vert-params.glsl')
 
 uniform float uPixelRatio;
 uniform float uViewportHeight;
 
-#if defined(dSizeType_uniform)
-    uniform float uSize;
-#elif defined(dSizeType_attribute)
-    attribute float aSize;
-#elif defined(dSizeType_instance) || defined(dSizeType_group) || defined(dSizeType_groupInstance)
-    varying vec4 vSize;
-    uniform vec2 uSizeTexDim;
-    uniform sampler2D tSize;
-#endif
-
 attribute vec3 aPosition;
 attribute mat4 aTransform;
 attribute float aInstance;
@@ -46,19 +37,8 @@ void trimSegment(const in vec4 start, inout vec4 end) {
 
 void main(){
     #pragma glslify: import('./chunks/assign-color-varying.glsl')
-
-    // TODO move to chunk (also in point.vert)
-    #if defined(dSizeType_uniform)
-        float size = uSize;
-    #elif defined(dSizeType_attribute)
-        float size = aSize;
-    #elif defined(dSizeType_instance)
-        float size = readFromTexture(tSize, aInstance, uSizeTexDim).r;
-    #elif defined(dSizeType_group)
-        float size = readFromTexture(tSize, aGroup, uSizeTexDim).r;
-    #elif defined(dSizeType_groupInstance)
-        float size = readFromTexture(tSize, aInstance * float(uGroupCount) + aGroup, uSizeTexDim).r;
-    #endif
+    #pragma glslify: import('./chunks/assign-marker-varying.glsl')
+    #pragma glslify: import('./chunks/assign-size.glsl')
 
     mat4 modelView = uView * uModel * aTransform;