diff --git a/applications/gui/src/camera.cpp b/applications/gui/src/camera.cpp
index ab94a7848ae05b7c1715530a9909bbf158975110..db1ee404deba24d35168e828aca96ebe34190394 100644
--- a/applications/gui/src/camera.cpp
+++ b/applications/gui/src/camera.cpp
@@ -333,14 +333,14 @@ void ftl::gui::Camera::_draw(std::vector<ftl::rgbd::FrameSet*> &fss) {
 			}
 
 			if (channel_ != Channel::Left && channel_ != Channel::Right && channel_ != Channel::None) {
-				renderer_->blend(0.5f, channel_);
+				renderer_->blend(channel_);
 				if (isStereo()) {
-					renderer2_->blend(0.5f, mapToSecondChannel(channel_));
+					renderer2_->blend(mapToSecondChannel(channel_));
 				}
 			}
 
 			if (enable_overlay) {
-				renderer_->blend(overlayer_->value("alpha", 0.8f), Channel::Overlay);
+				renderer_->blend(Channel::Overlay);
 			}
 
 			renderer_->end();
diff --git a/components/renderers/cpp/include/ftl/render/CUDARender.hpp b/components/renderers/cpp/include/ftl/render/CUDARender.hpp
index 7a9d46e5b32befa9a1f3338ecf4212ed80562cac..25f0ffaa608354e4af63c9de128f5a38621d74f4 100644
--- a/components/renderers/cpp/include/ftl/render/CUDARender.hpp
+++ b/components/renderers/cpp/include/ftl/render/CUDARender.hpp
@@ -28,7 +28,7 @@ class CUDARender : public ftl::render::Renderer {
 	bool submit(ftl::rgbd::FrameSet *in, ftl::codecs::Channels<0>, const Eigen::Matrix4d &t) override;
 	//void setOutputDevice(int);
 
-	void blend(float alpha, ftl::codecs::Channel) override;
+	void blend(ftl::codecs::Channel) override;
 
 	void setViewPort(ftl::render::ViewPortMode mode, const ftl::render::ViewPort &vp) {
 		params_.viewport = vp;
diff --git a/components/renderers/cpp/include/ftl/render/renderer.hpp b/components/renderers/cpp/include/ftl/render/renderer.hpp
index 5d9d55f13fc3447e2ec6112694056474bc837a8b..2273220cfcf198067c25d1a3d329a2cb4558b8d1 100644
--- a/components/renderers/cpp/include/ftl/render/renderer.hpp
+++ b/components/renderers/cpp/include/ftl/render/renderer.hpp
@@ -56,7 +56,7 @@ class Renderer : public ftl::Configurable {
      */
     virtual bool submit(ftl::rgbd::FrameSet *, ftl::codecs::Channels<0>, const Eigen::Matrix4d &)=0;
 
-	virtual void blend(float, ftl::codecs::Channel)=0;
+	virtual void blend(ftl::codecs::Channel)=0;
 
 	protected:
 	Stage stage_;
diff --git a/components/renderers/cpp/src/CUDARender.cpp b/components/renderers/cpp/src/CUDARender.cpp
index 557392d1ced004f232f7bcf5fef3dd6262468766..9a62807cca29a5e296628138cbb63d88a398ca12 100644
--- a/components/renderers/cpp/src/CUDARender.cpp
+++ b/components/renderers/cpp/src/CUDARender.cpp
@@ -490,7 +490,7 @@ void CUDARender::begin(ftl::rgbd::Frame &out, ftl::codecs::Channel chan) {
 	stage_ = Stage::ReadySubmit;
 }
 
-void CUDARender::blend(float alpha, Channel c) {
+void CUDARender::blend(Channel c) {
 	if (stage_ == Stage::Finished) {
 		throw FTL_Error("Cannot call blend at this time");
 	} else if (stage_ == Stage::ReadySubmit) {
@@ -504,11 +504,11 @@ void CUDARender::blend(float alpha, Channel c) {
 	//cv::cuda::addWeighted(buf.to_gpumat(), alpha, out_->get<GpuMat>(out_chan_), 1.0f-alpha, 0.0f,
 	//	out_->get<GpuMat>(out_chan_), -1, cvstream);
 
-	if (alpha < 0.0f) {
+	//if (alpha < 0.0f) {
 		ftl::cuda::composite(buf, out_->getTexture<uchar4>(out_chan_), stream_);
-	} else {
-		ftl::cuda::blend_alpha(buf, out_->getTexture<uchar4>(out_chan_), alpha, 1.0f-alpha, stream_);
-	}
+	//} else {
+	//	ftl::cuda::blend_alpha(buf, out_->getTexture<uchar4>(out_chan_), alpha, 1.0f-alpha, stream_);
+	//}
 }
 
 void CUDARender::end() {
diff --git a/components/renderers/cpp/src/colour_cuda.hpp b/components/renderers/cpp/src/colour_cuda.hpp
index bad912c96f99e1d36091076f23da436dde3f8c26..1e44bdc934190759b0ee108000b1137c2dd64083 100644
--- a/components/renderers/cpp/src/colour_cuda.hpp
+++ b/components/renderers/cpp/src/colour_cuda.hpp
@@ -9,7 +9,7 @@ namespace cuda {
 template <typename T>
 void lut(ftl::cuda::TextureObject<T> &in, ftl::cuda::TextureObject<uchar4> &out,
 		const cv::cuda::PtrStepSz<uchar3> &lut, float minval, float maxval,
-		bool invert, cudaStream_t stream);
+		float alpha, bool invert, cudaStream_t stream);
 
 void blend_alpha(
 		ftl::cuda::TextureObject<uchar4> &in,
diff --git a/components/renderers/cpp/src/colour_util.cu b/components/renderers/cpp/src/colour_util.cu
index 01939ebd37609c690ab4ec8f4cf873a357be3192..bc8c1603398da9e3f94bad6e55b7d0dc3e3a09a0 100644
--- a/components/renderers/cpp/src/colour_util.cu
+++ b/components/renderers/cpp/src/colour_util.cu
@@ -14,12 +14,12 @@ template <typename T, bool INVERT>
 		int out_pitch,
 		int width, int height,
 		const uchar3* __restrict__ lut,
-		float minval, float maxval) {
+		float minval, float maxval, float alpha) {
 
 	__shared__ uchar4 table[256];
 
 	int id = threadIdx.x + blockDim.x*threadIdx.y;
-	table[id] = make_uchar4(lut[id], (id == 0 || id == 255) ? 0 : 255);
+	table[id] = make_uchar4(lut[id], (id == 0 || id == 255) ? 0 : alpha);
 
 	__syncthreads();
 
@@ -36,7 +36,7 @@ template <typename T, bool INVERT>
 template <typename T>
 void ftl::cuda::lut(TextureObject<T> &in, TextureObject<uchar4> &out,
 		const cv::cuda::PtrStepSz<uchar3> &lut, float minval, float maxval,
-		bool invert,
+		float alpha, bool invert,
 		cudaStream_t stream) {
 
 	static constexpr int THREADS_X = 64;  // Must total 256
@@ -46,19 +46,19 @@ void ftl::cuda::lut(TextureObject<T> &in, TextureObject<uchar4> &out,
     const dim3 blockSize(THREADS_X, THREADS_Y);
 
 	if (invert) {
-		lut_kernel<T,true><<<gridSize, blockSize, 0, stream>>>(in.devicePtr(), in.pixelPitch(), out.devicePtr(), out.pixelPitch(), out.width(), out.height(), lut.data, minval, maxval);
+		lut_kernel<T,true><<<gridSize, blockSize, 0, stream>>>(in.devicePtr(), in.pixelPitch(), out.devicePtr(), out.pixelPitch(), out.width(), out.height(), lut.data, minval, maxval, alpha);
 	} else {
-		lut_kernel<T,false><<<gridSize, blockSize, 0, stream>>>(in.devicePtr(), in.pixelPitch(), out.devicePtr(), out.pixelPitch(), out.width(), out.height(), lut.data, minval, maxval);
+		lut_kernel<T,false><<<gridSize, blockSize, 0, stream>>>(in.devicePtr(), in.pixelPitch(), out.devicePtr(), out.pixelPitch(), out.width(), out.height(), lut.data, minval, maxval, alpha);
 	}
 	cudaSafeCall( cudaGetLastError() );
 }
 
 template void ftl::cuda::lut<float>(TextureObject<float> &in, TextureObject<uchar4> &out,
-	const cv::cuda::PtrStepSz<uchar3> &lut, float minval, float maxval, bool invert,
+	const cv::cuda::PtrStepSz<uchar3> &lut, float minval, float maxval, float, bool invert,
 	cudaStream_t stream);
 
 template void ftl::cuda::lut<short>(TextureObject<short> &in, TextureObject<uchar4> &out,
-	const cv::cuda::PtrStepSz<uchar3> &lut, float minval, float maxval, bool invert,
+	const cv::cuda::PtrStepSz<uchar3> &lut, float minval, float maxval, float, bool invert,
 	cudaStream_t stream);
 
 // ==== Blending ===============================================================
diff --git a/components/renderers/cpp/src/colouriser.cpp b/components/renderers/cpp/src/colouriser.cpp
index 95e85c47116857799276e52c18b8812033b735c6..bcaaf28d9e0bc21d51947e6e1f6317d4865bb598 100644
--- a/components/renderers/cpp/src/colouriser.cpp
+++ b/components/renderers/cpp/src/colouriser.cpp
@@ -133,6 +133,10 @@ TextureObject<uchar4> &Colouriser::_processNormals(ftl::rgbd::Frame &f, Channel
 
 	auto light_diffuse = parseCUDAColour(value("diffuse", std::string("#e0e0e0")));
 	auto light_ambient = parseCUDAColour(value("ambient", std::string("#0e0e0e")));
+
+	light_diffuse.w = value("alpha", 0.5f)*255.0f;
+	light_ambient.w = light_diffuse.w;
+
 	auto light_pos = make_float3(value("light_x", 0.3f), value("light_y", 0.2f), value("light_z", 1.0f));
 
 	ftl::cuda::normal_visualise(f.createTexture<half4>(c), buf,
@@ -152,7 +156,9 @@ TextureObject<uchar4> &Colouriser::_processSingle(ftl::rgbd::Frame &f, Channel c
 		depth_lut.upload(lut);
 	}
 
-	ftl::cuda::lut(f.createTexture<T>(c), buf, depth_lut, 0, std::numeric_limits<T>::max(), true, stream);
+	float alpha = value("alpha",0.5f)*255.0f;
+
+	ftl::cuda::lut(f.createTexture<T>(c), buf, depth_lut, 0, std::numeric_limits<T>::max(), alpha, true, stream);
 	return buf;
 }
 
@@ -165,7 +171,9 @@ TextureObject<uchar4> &Colouriser::_processFloat(ftl::rgbd::Frame &f, Channel c,
 		depth_lut.upload(lut);
 	}
 
-	ftl::cuda::lut(f.createTexture<float>(c), buf, depth_lut, minval, maxval, false, stream);
+	float alpha = value("alpha",0.5f)*255.0f;
+
+	ftl::cuda::lut(f.createTexture<float>(c), buf, depth_lut, minval, maxval, alpha, false, stream);
 	return buf;
 }
 
diff --git a/components/renderers/cpp/src/normals.cu b/components/renderers/cpp/src/normals.cu
index 1375dc0356fb682c7e0990a90b21255fa83c2f3a..ddeb6294e20aa681302932a44ade664f512272f4 100644
--- a/components/renderers/cpp/src/normals.cu
+++ b/components/renderers/cpp/src/normals.cu
@@ -430,7 +430,7 @@ __global__ void vis_normals_kernel(ftl::cuda::TextureObject<half4> norm,
 			output(x,y) = make_uchar4(
 				min(255.0f, diffuse.x*d + ambient.x),
 				min(255.0f, diffuse.y*d + ambient.y),
-				min(255.0f, diffuse.z*d + ambient.z), 255);
+				min(255.0f, diffuse.z*d + ambient.z), ambient.w);
 		}
 	}
 }