diff --git a/core/client/include/pragma/rendering/shader_graph/module.hpp b/core/client/include/pragma/rendering/shader_graph/module.hpp
index 71285d709..1af93f921 100644
--- a/core/client/include/pragma/rendering/shader_graph/module.hpp
+++ b/core/client/include/pragma/rendering/shader_graph/module.hpp
@@ -20,6 +20,7 @@ namespace prosper {
 namespace pragma {
 	class CSceneComponent;
 	class CRasterizationRendererComponent;
+	class ShaderGraph;
 };
 
 class CModelSubMesh;
@@ -27,8 +28,9 @@ namespace pragma::rendering {
 	class ShaderProcessor;
 	class DLLCLIENT ShaderGraphModule {
 	  public:
-		ShaderGraphModule(prosper::Shader &shader) : m_shader(shader) {}
+		ShaderGraphModule(ShaderGraph &shader) : m_shader(shader) {}
 		virtual ~ShaderGraphModule() {}
+		virtual void InitializeShaderResources() {}
 		virtual void InitializeGfxPipelineDescriptorSets() = 0;
 		virtual void GetShaderPreprocessorDefinitions(std::unordered_map<std::string, std::string> &outDefinitions, std::string &outPrefixCode) {}
 		virtual void UpdateRenderFlags(CModelSubMesh &mesh, ShaderGameWorld::SceneFlags &inOutFlags) {}
@@ -37,16 +39,16 @@ namespace pragma::rendering {
 		virtual void RecordBindMaterial(rendering::ShaderProcessor &shaderProcessor, CMaterial &mat) const {}
 		void SetNodes(std::vector<pragma::shadergraph::GraphNode *> &&nodes) { m_nodes = std::move(nodes); }
 	  protected:
-		prosper::Shader &m_shader;
+		ShaderGraph &m_shader;
 		std::vector<pragma::shadergraph::GraphNode *> m_nodes;
 	};
 
 	class DLLCLIENT ShaderGraphModuleManager {
 	  public:
-		using Factory = std::function<std::unique_ptr<ShaderGraphModule>(prosper::Shader &shader)>;
+		using Factory = std::function<std::unique_ptr<ShaderGraphModule>(ShaderGraph &shader)>;
 		ShaderGraphModuleManager() {}
 		void RegisterFactory(const std::string &name, const Factory &factory);
-		std::unique_ptr<ShaderGraphModule> CreateModule(const std::string &name, prosper::Shader &shader, std::vector<pragma::shadergraph::GraphNode *> &&nodes) const;
+		std::unique_ptr<ShaderGraphModule> CreateModule(const std::string &name, ShaderGraph &shader, std::vector<pragma::shadergraph::GraphNode *> &&nodes) const;
 		const std::unordered_map<std::string, Factory> &GetFactories() const { return m_factories; }
 	  private:
 		std::unordered_map<std::string, Factory> m_factories;
diff --git a/core/client/include/pragma/rendering/shader_graph/modules/image_texture.hpp b/core/client/include/pragma/rendering/shader_graph/modules/image_texture.hpp
index 75ddee3df..c1ccb200c 100644
--- a/core/client/include/pragma/rendering/shader_graph/modules/image_texture.hpp
+++ b/core/client/include/pragma/rendering/shader_graph/modules/image_texture.hpp
@@ -23,7 +23,7 @@ namespace pragma::rendering::shader_graph {
 
 			Count
 		};
-		ImageTextureModule(prosper::Shader &shader);
+		ImageTextureModule(ShaderGraph &shader);
 		virtual ~ImageTextureModule() override;
 		virtual void InitializeGfxPipelineDescriptorSets() override;
 		virtual void RecordBindScene(rendering::ShaderProcessor &shaderProcessor, const pragma::CSceneComponent &scene, const pragma::CRasterizationRendererComponent &renderer, ShaderGameWorld::SceneFlags &inOutSceneFlags) const override;
diff --git a/core/client/include/pragma/rendering/shader_graph/modules/input_data.hpp b/core/client/include/pragma/rendering/shader_graph/modules/input_data.hpp
index b93903f3e..02fc08c38 100644
--- a/core/client/include/pragma/rendering/shader_graph/modules/input_data.hpp
+++ b/core/client/include/pragma/rendering/shader_graph/modules/input_data.hpp
@@ -24,14 +24,19 @@ namespace pragma::rendering {
 namespace pragma::rendering::shader_graph {
 	class DLLCLIENT InputDataModule : public pragma::rendering::ShaderGraphModule {
 	  public:
-		InputDataModule(prosper::Shader &shader);
+		InputDataModule(ShaderGraph &shader);
 		virtual ~InputDataModule() override;
+		virtual void InitializeShaderResources() override;
 		virtual void InitializeGfxPipelineDescriptorSets() override;
 		virtual void GetShaderPreprocessorDefinitions(std::unordered_map<std::string, std::string> &outDefinitions, std::string &outPrefixCode) override;
 		virtual void RecordBindScene(rendering::ShaderProcessor &shaderProcessor, const pragma::CSceneComponent &scene, const pragma::CRasterizationRendererComponent &renderer, ShaderGameWorld::SceneFlags &inOutSceneFlags) const override;
 	  private:
 		prosper::DescriptorSetInfo m_globalInputDataDsInfo;
+
+		std::unique_ptr<pragma::shadergraph::Graph> m_resolvedGraph;
+
 		std::shared_ptr<prosper::IDescriptorSetGroup> m_globalInputDsg;
+		std::vector<const pragma::shadergraph::GraphNode *> m_imageTextureNodes;
 	};
 };
 
diff --git a/core/client/include/pragma/rendering/shader_graph/modules/pbr.hpp b/core/client/include/pragma/rendering/shader_graph/modules/pbr.hpp
index ca6abcd80..f5996cc42 100644
--- a/core/client/include/pragma/rendering/shader_graph/modules/pbr.hpp
+++ b/core/client/include/pragma/rendering/shader_graph/modules/pbr.hpp
@@ -23,7 +23,7 @@ namespace pragma::rendering::shader_graph {
 
 			Count
 		};
-		PbrModule(prosper::Shader &shader);
+		PbrModule(ShaderGraph &shader);
 		virtual ~PbrModule() override;
 		virtual void InitializeGfxPipelineDescriptorSets() override;
 		virtual void RecordBindScene(rendering::ShaderProcessor &shaderProcessor, const pragma::CSceneComponent &scene, const pragma::CRasterizationRendererComponent &renderer, ShaderGameWorld::SceneFlags &inOutSceneFlags) const override;
diff --git a/core/client/include/pragma/rendering/shader_graph/nodes/image_texture.hpp b/core/client/include/pragma/rendering/shader_graph/nodes/image_texture.hpp
index d71635c1e..ae8357343 100644
--- a/core/client/include/pragma/rendering/shader_graph/nodes/image_texture.hpp
+++ b/core/client/include/pragma/rendering/shader_graph/nodes/image_texture.hpp
@@ -22,6 +22,7 @@ namespace pragma::rendering::shader_graph {
 		static constexpr const char *OUT_ALPHA = "alpha";
 
 		ImageTextureNode(const std::string_view &type);
+		std::string GetTextureVariableName(const pragma::shadergraph::GraphNode &gn) const;
 
 		virtual std::string DoEvaluate(const pragma::shadergraph::Graph &graph, const pragma::shadergraph::GraphNode &instance) const override;
 		virtual std::string DoEvaluateResourceDeclarations(const pragma::shadergraph::Graph &graph, const pragma::shadergraph::GraphNode &instance) const override;
diff --git a/core/client/include/pragma/rendering/shader_graph/nodes/scene_output.hpp b/core/client/include/pragma/rendering/shader_graph/nodes/scene_output.hpp
index 5fa9684e4..719dd2c35 100644
--- a/core/client/include/pragma/rendering/shader_graph/nodes/scene_output.hpp
+++ b/core/client/include/pragma/rendering/shader_graph/nodes/scene_output.hpp
@@ -18,6 +18,7 @@ namespace pragma::rendering::shader_graph {
 		static constexpr const char *IN_COLOR = "color";
 		static constexpr const char *IN_ALPHA = "alpha";
 		static constexpr const char *IN_BLOOM_COLOR = "bloomColor";
+		static constexpr const char *CONST_ALPHA_MODE = "alphaMode";
 		// TODO: Only allow one of these!
 		SceneOutputNode(const std::string_view &type);
 
diff --git a/core/client/src/rendering/shader_graph/module.cpp b/core/client/src/rendering/shader_graph/module.cpp
index 45b35fcd0..adf9504a2 100644
--- a/core/client/src/rendering/shader_graph/module.cpp
+++ b/core/client/src/rendering/shader_graph/module.cpp
@@ -11,7 +11,7 @@
 using namespace pragma::rendering;
 
 void ShaderGraphModuleManager::RegisterFactory(const std::string &name, const Factory &factory) { m_factories[name] = factory; }
-std::unique_ptr<ShaderGraphModule> ShaderGraphModuleManager::CreateModule(const std::string &name, prosper::Shader &shader, std::vector<pragma::shadergraph::GraphNode *> &&nodes) const
+std::unique_ptr<ShaderGraphModule> ShaderGraphModuleManager::CreateModule(const std::string &name, ShaderGraph &shader, std::vector<pragma::shadergraph::GraphNode *> &&nodes) const
 {
 	auto it = m_factories.find(name);
 	if(it == m_factories.end())
diff --git a/core/client/src/rendering/shader_graph/modules/image_texture.cpp b/core/client/src/rendering/shader_graph/modules/image_texture.cpp
index 7439d9bea..3906e6913 100644
--- a/core/client/src/rendering/shader_graph/modules/image_texture.cpp
+++ b/core/client/src/rendering/shader_graph/modules/image_texture.cpp
@@ -22,7 +22,7 @@ using namespace pragma::rendering::shader_graph;
 extern DLLCLIENT CEngine *c_engine;
 extern DLLCLIENT ClientState *client;
 #pragma optimize("", off)
-ImageTextureModule::ImageTextureModule(prosper::Shader &shader) : pragma::rendering::ShaderGraphModule {shader}
+ImageTextureModule::ImageTextureModule(ShaderGraph &shader) : pragma::rendering::ShaderGraphModule {shader}
 {
 	//Global settings +textures?
 	/* prosper::PrDescriptorSetBindingFlags::Cubemap */
@@ -31,7 +31,7 @@ ImageTextureModule::~ImageTextureModule() {}
 void ImageTextureModule::InitializeGfxPipelineDescriptorSets()
 {
 	// TODO: Move this somewhere else
-	std::vector<prosper::DescriptorSetInfo::Binding> bindings;
+	/*std::vector<prosper::DescriptorSetInfo::Binding> bindings;
 	bindings.reserve(m_nodes.size());
 	for(auto *node : m_nodes) {
 		auto texName = node->GetBaseVarName() + "_tex";
@@ -42,13 +42,13 @@ void ImageTextureModule::InitializeGfxPipelineDescriptorSets()
 	m_descSetInfo = {
 	  "TEST",
 	  bindings,
-	};
+	};*/
 
 	//
 
-	m_shader.AddDescriptorSetGroup(m_descSetInfo);
+	//m_shader.AddDescriptorSetGroup(m_descSetInfo);
 
-	auto &context = c_engine->GetRenderContext();
+	/*auto &context = c_engine->GetRenderContext();
 	auto dsg = context.CreateDescriptorSetGroup(m_descSetInfo);
 	auto &ds = *dsg->GetDescriptorSet(0);
 	auto &texManager = static_cast<msys::CMaterialManager &>(client->GetMaterialManager()).GetTextureManager();
@@ -65,9 +65,9 @@ void ImageTextureModule::InitializeGfxPipelineDescriptorSets()
 		ds.SetBindingTexture(*prosperTex, bindingIdx++);
 	}
 
-	m_dsg = dsg;
+	m_dsg = dsg;*/
 }
 void ImageTextureModule::RecordBindScene(rendering::ShaderProcessor &shaderProcessor, const pragma::CSceneComponent &scene, const pragma::CRasterizationRendererComponent &renderer, ShaderGameWorld::SceneFlags &inOutSceneFlags) const
 {
-	shaderProcessor.GetCommandBuffer().RecordBindDescriptorSets(prosper::PipelineBindPoint::Graphics, shaderProcessor.GetCurrentPipelineLayout(), m_descSetInfo.setIndex, *m_dsg->GetDescriptorSet());
+	//shaderProcessor.GetCommandBuffer().RecordBindDescriptorSets(prosper::PipelineBindPoint::Graphics, shaderProcessor.GetCurrentPipelineLayout(), m_descSetInfo.setIndex, *m_dsg->GetDescriptorSet());
 }
diff --git a/core/client/src/rendering/shader_graph/modules/input_data.cpp b/core/client/src/rendering/shader_graph/modules/input_data.cpp
index 8045b3e47..b954937cd 100644
--- a/core/client/src/rendering/shader_graph/modules/input_data.cpp
+++ b/core/client/src/rendering/shader_graph/modules/input_data.cpp
@@ -7,10 +7,16 @@
 
 #include "stdafx_client.h"
 #include "pragma/rendering/shader_graph/modules/input_data.hpp"
+#include "pragma/rendering/shader_graph/nodes/image_texture.hpp"
 #include "pragma/rendering/render_processor.hpp"
 #include "pragma/rendering/shader_material/shader_material.hpp"
 #include "pragma/rendering/global_shader_input_manager.hpp"
 #include "pragma/rendering/shader_graph/manager.hpp"
+#include "pragma/rendering/shaders/world/c_shader_graph.hpp"
+#include <pragma/util/global_string_table.hpp>
+#include <cmaterial_manager2.hpp>
+#include <texturemanager/texture_manager2.hpp>
+#include <texturemanager/texture.h>
 #include <buffers/prosper_buffer.hpp>
 #include <buffers/prosper_buffer_create_info.hpp>
 #include <prosper_command_buffer.hpp>
@@ -18,16 +24,39 @@
 using namespace pragma::rendering::shader_graph;
 
 extern DLLCLIENT CEngine *c_engine;
+extern DLLCLIENT ClientState *client;
 extern DLLCLIENT CGame *c_game;
 
-InputDataModule::InputDataModule(prosper::Shader &shader) : pragma::rendering::ShaderGraphModule {shader}
+InputDataModule::InputDataModule(ShaderGraph &shader) : pragma::rendering::ShaderGraphModule {shader} {}
+InputDataModule::~InputDataModule() {}
+
+void InputDataModule::InitializeShaderResources()
 {
-	m_globalInputDataDsInfo = {
-	  "SHADER_GRAPH",
-	  {prosper::DescriptorSetInfo::Binding {"GLOBAL_INPUT_DATA", prosper::DescriptorType::UniformBuffer, prosper::ShaderStageFlags::FragmentBit | prosper::ShaderStageFlags::VertexBit | prosper::ShaderStageFlags::GeometryBit}},
-	};
+	std::vector<prosper::DescriptorSetInfo::Binding> bindings;
+
+	auto *graph = m_shader.GetGraph();
+	if(!graph)
+		return;
+	bindings.push_back({"GLOBAL_INPUT_DATA", prosper::DescriptorType::UniformBuffer, prosper::ShaderStageFlags::FragmentBit | prosper::ShaderStageFlags::VertexBit | prosper::ShaderStageFlags::GeometryBit});
+
+	// TODO
+	m_resolvedGraph = std::make_unique<pragma::shadergraph::Graph>(*graph);
+	m_resolvedGraph->Resolve();
+	for(auto &graphNode : m_resolvedGraph->GetNodes()) {
+		auto *node = dynamic_cast<const ImageTextureNode *>(&graphNode->node);
+		if(!node)
+			continue;
+		auto texVarName = node->GetTextureVariableName(*graphNode);
+		ustring::to_upper(texVarName);
+		bindings.push_back({pragma::register_global_string(texVarName), prosper::DescriptorType::CombinedImageSampler, prosper::ShaderStageFlags::FragmentBit});
+		if(m_imageTextureNodes.size() == m_imageTextureNodes.capacity())
+			m_imageTextureNodes.reserve(m_imageTextureNodes.size() * 2 + 10);
+		m_imageTextureNodes.push_back(graphNode.get());
+	}
+
+	m_globalInputDataDsInfo = {"SHADER_GRAPH", bindings};
+	ShaderGraphModule::InitializeShaderResources();
 }
-InputDataModule::~InputDataModule() {}
 
 void InputDataModule::GetShaderPreprocessorDefinitions(std::unordered_map<std::string, std::string> &outDefinitions, std::string &outPrefixCode)
 {
@@ -42,6 +71,15 @@ void InputDataModule::GetShaderPreprocessorDefinitions(std::unordered_map<std::s
 		code << "\t" << pragma::shadergraph::to_glsl_type(prop.parameter.type) << " " << prop.parameter.name << ";\n";
 	}
 	code << "} u_globalInputData;\n";
+
+	for(auto *graphNode : m_imageTextureNodes) {
+		auto *node = dynamic_cast<const ImageTextureNode *>(&graphNode->node);
+		auto texVarName = node->GetTextureVariableName(*graphNode);
+		auto texVarNameUpper = texVarName;
+		ustring::to_upper(texVarNameUpper);
+		code << "layout(LAYOUT_ID(SHADER_GRAPH, " << texVarNameUpper << ")) uniform sampler2D " << texVarName << ";\n";
+	}
+
 	outPrefixCode += code.str();
 }
 
@@ -61,14 +99,27 @@ void InputDataModule::InitializeGfxPipelineDescriptorSets()
 
 	// TODO: One per shader
 	m_globalInputDsg = context.CreateDescriptorSetGroup(m_globalInputDataDsInfo);
-	auto &dummyTex = context.GetDummyTexture();
-	auto &dummyCubemapTex = context.GetDummyCubemapTexture();
 	auto &ds = *m_globalInputDsg->GetDescriptorSet(0);
 	constexpr uint32_t BINDING_IDX = 0;
 	auto buf = inputDataManager.GetBuffer();
 	if(!buf)
 		buf = c_engine->GetRenderContext().GetDummyBuffer();
 	ds.SetBindingUniformBuffer(*buf, BINDING_IDX);
+
+	// Image texture nodes
+	auto &texManager = static_cast<msys::CMaterialManager &>(client->GetMaterialManager()).GetTextureManager();
+	uint32_t bindingIdx = 1; // Binding 0 is global input data
+	for(auto *node : m_imageTextureNodes) {
+		std::string fileName;
+		node->GetInputValue<std::string>(pragma::rendering::shader_graph::ImageTextureNode::IN_FILENAME, fileName);
+		auto tex = texManager.LoadAsset(fileName);
+		std::shared_ptr<prosper::Texture> prosperTex;
+		if(tex)
+			prosperTex = tex->GetVkTexture();
+		if(!prosperTex)
+			prosperTex = context.GetDummyTexture();
+		ds.SetBindingTexture(*prosperTex, bindingIdx++);
+	}
 }
 void InputDataModule::RecordBindScene(rendering::ShaderProcessor &shaderProcessor, const pragma::CSceneComponent &scene, const pragma::CRasterizationRendererComponent &renderer, ShaderGameWorld::SceneFlags &inOutSceneFlags) const
 {
diff --git a/core/client/src/rendering/shader_graph/modules/pbr.cpp b/core/client/src/rendering/shader_graph/modules/pbr.cpp
index 07e5db830..af58f55bb 100644
--- a/core/client/src/rendering/shader_graph/modules/pbr.cpp
+++ b/core/client/src/rendering/shader_graph/modules/pbr.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "stdafx_client.h"
+#include "pragma/rendering/shaders/world/c_shader_graph.hpp"
 #include "pragma/rendering/shader_graph/modules/pbr.hpp"
 #include "pragma/rendering/render_processor.hpp"
 #include "pragma/entities/environment/c_env_reflection_probe.hpp"
@@ -15,9 +16,10 @@
 using namespace pragma::rendering::shader_graph;
 
 extern DLLCLIENT CEngine *c_engine;
+#pragma optimize("", off)
 std::shared_ptr<prosper::IDescriptorSetGroup> PbrModule::g_defaultPbrDsg = {};
 size_t PbrModule::g_instanceCount = 0;
-PbrModule::PbrModule(prosper::Shader &shader) : pragma::rendering::ShaderGraphModule {shader}
+PbrModule::PbrModule(ShaderGraph &shader) : pragma::rendering::ShaderGraphModule {shader}
 {
 	m_pbrDescSetInfo = {
 	  "PBR",
diff --git a/core/client/src/rendering/shader_graph/nodes/image_texture.cpp b/core/client/src/rendering/shader_graph/nodes/image_texture.cpp
index 0b3a66308..1a3ade6a7 100644
--- a/core/client/src/rendering/shader_graph/nodes/image_texture.cpp
+++ b/core/client/src/rendering/shader_graph/nodes/image_texture.cpp
@@ -21,14 +21,19 @@ ImageTextureNode::ImageTextureNode(const std::string_view &type) : Node {type}
 	AddModuleDependency("image_texture");
 }
 
+std::string ImageTextureNode::GetTextureVariableName(const pragma::shadergraph::GraphNode &gn) const
+{
+	auto prefix = gn.GetBaseVarName() + "_";
+	return prefix + "tex";
+}
+
 std::string ImageTextureNode::DoEvaluateResourceDeclarations(const pragma::shadergraph::Graph &graph, const pragma::shadergraph::GraphNode &gn) const
 {
 	std::ostringstream code;
-	auto prefix = gn.GetBaseVarName() + "_";
-	std::string texName = prefix + "tex";
-	auto upperTexName = texName;
-	ustring::to_upper(upperTexName);
-	code << "layout(LAYOUT_ID(TEST, " << upperTexName << ")) uniform sampler2D " << texName << ";\n";
+	//auto texName = GetTextureVariableName(gn);
+	//auto upperTexName = texName;
+	//ustring::to_upper(upperTexName);
+	//code << "layout(LAYOUT_ID(TEST, " << upperTexName << ")) uniform sampler2D " << texName << ";\n";
 	return code.str();
 }
 
@@ -42,8 +47,7 @@ std::string ImageTextureNode::DoEvaluate(const pragma::shadergraph::Graph &graph
 		uv = "vec3(get_vertex_uv(), 0.0)";
 
 	auto prefix = gn.GetBaseVarName() + "_";
-	std::string texName = prefix + "tex";
-	code << "vec4 " << prefix << "texCol = texture(" << texName << ", " << uv << ".xy);\n";
+	code << "vec4 " << prefix << "texCol = texture(" << GetTextureVariableName(gn) << ", " << uv << ".xy);\n";
 
 	code << gn.GetGlslOutputDeclaration(OUT_COLOR) << " = ";
 	code << prefix << "texCol.rgb;\n";
diff --git a/core/client/src/rendering/shader_graph/nodes/scene_output.cpp b/core/client/src/rendering/shader_graph/nodes/scene_output.cpp
index 0714b619b..6c36059c6 100644
--- a/core/client/src/rendering/shader_graph/nodes/scene_output.cpp
+++ b/core/client/src/rendering/shader_graph/nodes/scene_output.cpp
@@ -15,13 +15,22 @@ SceneOutputNode::SceneOutputNode(const std::string_view &type) : Node {type}
 	AddInput(IN_COLOR, pragma::shadergraph::DataType::Color, Vector3 {1.f, 1.f, 1.f});
 	AddInput(IN_ALPHA, pragma::shadergraph::DataType::Float, 1.f);
 	AddInput(IN_BLOOM_COLOR, pragma::shadergraph::DataType::Color, Vector3 {0.f, 0.f, 0.f});
+
+	AddSocketEnum<AlphaMode>(CONST_ALPHA_MODE, AlphaMode::Opaque);
 }
 
-std::string SceneOutputNode::DoEvaluate(const pragma::shadergraph::Graph &graph, const pragma::shadergraph::GraphNode &instance) const
+std::string SceneOutputNode::DoEvaluate(const pragma::shadergraph::Graph &graph, const pragma::shadergraph::GraphNode &gn) const
 {
 	std::ostringstream code;
-	code << "fs_color = vec4(" << GetInputNameOrValue(instance, IN_COLOR) << ", " << GetInputNameOrValue(instance, IN_ALPHA) << ");\n";
-	code << "fs_brightColor = vec4(" << GetInputNameOrValue(instance, IN_BLOOM_COLOR) << ", 1.0);\n";
+	code << "fs_color = vec4(" << GetInputNameOrValue(gn, IN_COLOR) << ", " << GetInputNameOrValue(gn, IN_ALPHA) << ");\n";
+	code << "fs_brightColor = vec4(" << GetInputNameOrValue(gn, IN_BLOOM_COLOR) << ", 1.0);\n";
+
+	auto alphaMode = *gn.GetConstantInputValue<AlphaMode>(CONST_ALPHA_MODE);
+	if(alphaMode == AlphaMode::Mask) {
+		// TODO: Use alpha cutoff value
+		code << "if(fs_color.a < 0.5)\n";
+		code << "\tdiscard;\n";
+	}
+
 	return code.str();
-	//
 }
diff --git a/core/client/src/rendering/shaders/world/c_shader_graph.cpp b/core/client/src/rendering/shaders/world/c_shader_graph.cpp
index fee05869a..cf7d4f8c0 100644
--- a/core/client/src/rendering/shaders/world/c_shader_graph.cpp
+++ b/core/client/src/rendering/shaders/world/c_shader_graph.cpp
@@ -17,6 +17,7 @@
 #include "pragma/rendering/shader_graph/module.hpp"
 #include "pragma/rendering/shader_graph/nodes/shader_material.hpp"
 #include "pragma/rendering/shader_graph/nodes/input_parameter.hpp"
+#include "pragma/rendering/shader_graph/nodes/scene_output.hpp"
 #include "pragma/model/vk_mesh.h"
 #include "pragma/model/c_modelmesh.h"
 #include <shader/prosper_pipeline_create_info.hpp>
@@ -115,6 +116,9 @@ void ShaderGraph::InitializeShaderResources()
 		}
 	}
 
+	for(auto &mod : m_modules)
+		mod->InitializeShaderResources();
+
 	ShaderGameWorldLightingPass::InitializeShaderResources();
 }
 
@@ -138,7 +142,32 @@ void ShaderGraph::InitializeMaterialData(const CMaterial &mat, const rendering::
 
 std::shared_ptr<prosper::IDescriptorSetGroup> ShaderGraph::InitializeMaterialDescriptorSet(CMaterial &mat, const prosper::DescriptorSetInfo &descSetInfo) { return ShaderGameWorldLightingPass::InitializeMaterialDescriptorSet(mat, descSetInfo); }
 void ShaderGraph::OnPipelinesInitialized() { ShaderGameWorldLightingPass::OnPipelinesInitialized(); }
-void ShaderGraph::InitializeGfxPipeline(prosper::GraphicsPipelineCreateInfo &pipelineInfo, uint32_t pipelineIdx) { ShaderGameWorldLightingPass::InitializeGfxPipeline(pipelineInfo, pipelineIdx); }
+void ShaderGraph::InitializeGfxPipeline(prosper::GraphicsPipelineCreateInfo &pipelineInfo, uint32_t pipelineIdx)
+{
+	ShaderGameWorldLightingPass::InitializeGfxPipeline(pipelineInfo, pipelineIdx);
+
+	auto *graph = GetGraph();
+	if(graph) {
+		for(auto &node : graph->GetNodes()) {
+			auto *outputNode = dynamic_cast<const pragma::rendering::shader_graph::SceneOutputNode *>(&node->node);
+			if(!outputNode)
+				continue;
+			AlphaMode alphaMode;
+			if(node->GetInputValue(pragma::rendering::shader_graph::SceneOutputNode::CONST_ALPHA_MODE, alphaMode)) {
+				switch(alphaMode) {
+				case AlphaMode::Blend:
+					SetGenericAlphaColorBlendAttachmentProperties(pipelineInfo);
+					break;
+				case AlphaMode::Mask:
+					SetGenericAlphaColorBlendAttachmentProperties(pipelineInfo);
+					pipelineInfo.ToggleDepthWrites(true);
+					break;
+				}
+			}
+			break;
+		}
+	}
+}
 
 void ShaderGraph::RecordBindScene(rendering::ShaderProcessor &shaderProcessor, const pragma::CSceneComponent &scene, const pragma::CRasterizationRendererComponent &renderer, prosper::IDescriptorSet &dsScene, prosper::IDescriptorSet &dsRenderer, prosper::IDescriptorSet &dsRenderSettings,
   prosper::IDescriptorSet &dsShadows, const Vector4 &drawOrigin, ShaderGameWorld::SceneFlags &inOutSceneFlags) const