Browse Source

Validate renderable vertex inputs in the renderer
Fixes for incorrect multi-render texture validation
Bind GBuffer to light pass shaders

BearishSun 10 years ago
parent
commit
22aa527617

+ 6 - 0
BansheeCore/Include/BsGpuProgram.h

@@ -150,6 +150,11 @@ namespace BansheeEngine
 		 */
 		GpuParamDescPtr getParamDesc() const { return mParametersDesc; }
 
+		/**
+		 * @brief	Returns GPU program input declaration. Only relevant for vertex programs.
+		 */
+		SPtr<VertexDeclarationCore> getInputDeclaration() const { return mInputDeclaration; }
+
 		/**
 		 * @brief	Returns properties that contain information about the GPU program.
 		 */
@@ -176,6 +181,7 @@ namespace BansheeEngine
 		String mCompileError;
 
 		GpuParamDescPtr mParametersDesc;
+		SPtr<VertexDeclarationCore> mInputDeclaration;
 		GpuProgramProperties mProperties;
 	};
 

+ 4 - 4
BansheeCore/Include/BsMultiRenderTexture.h

@@ -58,7 +58,7 @@ namespace BansheeEngine
 		/**
 		 * @copydoc	CoreObjectCore::initialize
 		 */
-		virtual void initialize();
+		virtual void initialize() override;
 
 		/**
 		 * @brief	Returns properties that describe the render texture.
@@ -71,7 +71,7 @@ namespace BansheeEngine
 		/**
 		 * @copydoc	CoreObjectCore::syncToCore
 		 */
-		virtual void syncToCore(const CoreSyncData& data);
+		virtual void syncToCore(const CoreSyncData& data) override;
 
 	private:
 		/**
@@ -142,12 +142,12 @@ namespace BansheeEngine
 		/**
 		 * @copydoc	RenderTarget::createCore
 		 */
-		SPtr<CoreObjectCore> createCore() const;
+		SPtr<CoreObjectCore> createCore() const override;
 
 		/**
 		 * @copydoc	CoreObjectCore::syncToCore
 		 */
-		virtual CoreSyncData syncToCore(FrameAlloc* allocator);
+		virtual CoreSyncData syncToCore(FrameAlloc* allocator) override;
 
 		MULTI_RENDER_TEXTURE_DESC mDesc;
 		Vector<HTexture> mBindableColorTex;

+ 7 - 1
BansheeCore/Include/BsVertexDeclaration.h

@@ -180,7 +180,7 @@ namespace BansheeEngine
 		/**
 		 * @copydoc	CoreObjectCore::initialize
 		 */
-		void initialize();
+		void initialize() override;
 
 		/**
 		 * @brief	Returns properties describing the vertex declaration.
@@ -192,6 +192,12 @@ namespace BansheeEngine
 		 */
 		UINT32 getId() const { return mId; }
 
+		/**
+		 * @brief	Checks can a vertex buffer declared with this declaration be bound to a shader defined with the
+		 * 			provided declaration.
+		 */
+		bool isCompatible(const SPtr<VertexDeclarationCore>& shaderDecl);
+
     protected:
 		friend class HardwareBufferCoreManager;
 

+ 2 - 2
BansheeCore/Source/BsMultiRenderTexture.cpp

@@ -161,13 +161,13 @@ namespace BansheeEngine
 			if (firstTexProps.getTextureType() != TEX_TYPE_2D)
 				BS_EXCEPT(NotImplementedException, "Render textures are currently only implemented for 2D surfaces.");
 
-			if ((firstSurfaceDesc->getFirstArraySlice() + firstSurfaceDesc->getNumArraySlices()) >= firstTexProps.getNumFaces())
+			if ((firstSurfaceDesc->getFirstArraySlice() + firstSurfaceDesc->getNumArraySlices()) > firstTexProps.getNumFaces())
 			{
 				BS_EXCEPT(InvalidParametersException, "Provided number of faces is out of range. Face: " +
 					toString(firstSurfaceDesc->getFirstArraySlice() + firstSurfaceDesc->getNumArraySlices()) + ". Max num faces: " + toString(firstTexProps.getNumFaces()));
 			}
 
-			if (firstSurfaceDesc->getMostDetailedMip() >= firstTexProps.getNumMipmaps())
+			if (firstSurfaceDesc->getMostDetailedMip() > firstTexProps.getNumMipmaps())
 			{
 				BS_EXCEPT(InvalidParametersException, "Provided number of mip maps is out of range. Mip level: " +
 					toString(firstSurfaceDesc->getMostDetailedMip()) + ". Max num mipmaps: " + toString(firstTexProps.getNumMipmaps()));

+ 27 - 0
BansheeCore/Source/BsVertexDeclaration.cpp

@@ -218,6 +218,33 @@ namespace BansheeEngine
 		CoreObjectCore::initialize();
 	}
 
+	bool VertexDeclarationCore::isCompatible(const SPtr<VertexDeclarationCore>& shaderDecl)
+	{
+		const List<VertexElement>& shaderElems = shaderDecl->getProperties().getElements();
+		const List<VertexElement>& bufferElems = getProperties().getElements();
+
+		for (auto shaderIter = shaderElems.begin(); shaderIter != shaderElems.end(); ++shaderIter)
+		{
+			const VertexElement* foundElement = nullptr;
+			for (auto bufferIter = bufferElems.begin(); bufferIter != bufferElems.end(); ++bufferIter)
+			{
+				if (shaderIter->getSemantic() == bufferIter->getSemantic() && shaderIter->getSemanticIdx() == bufferIter->getSemanticIdx())
+				{
+					foundElement = &(*bufferIter);
+					break;
+				}
+			}
+
+			if (foundElement == nullptr)
+			{
+				LOGWRN("Provided vertex buffer doesn't have a required input attribute: " + toString(shaderIter->getSemantic()) + toString(shaderIter->getSemanticIdx()));
+				return false;
+			}
+		}
+
+		return true;
+	}
+
 	VertexDeclaration::VertexDeclaration(const List<VertexElement>& elements)
 		:mProperties(elements)
 	{

+ 0 - 6
BansheeD3D11RenderAPI/Include/BsD3D11GpuProgram.h

@@ -18,11 +18,6 @@ namespace BansheeEngine
 		 */
 		const HLSLMicroCode& getMicroCode() const { return mMicrocode; }
 
-		/**
-		 * @brief	Returns GPU program input declaration. Only relevant for vertex programs.
-		 */
-		SPtr<VertexDeclarationCore> getInputDeclaration() const { return mInputDeclaration; }
-
 		/**
 		 * @brief	Returns unique GPU program ID.
 		 */
@@ -63,7 +58,6 @@ namespace BansheeEngine
 		UINT32 mProgramId;
 
 		HLSLMicroCode mMicrocode;
-		SPtr<VertexDeclarationCore> mInputDeclaration;
 	};
 
 	/**

+ 0 - 7
BansheeD3D11RenderAPI/Include/BsD3D11InputLayoutManager.h

@@ -79,13 +79,6 @@ namespace BansheeEngine
 		 */
 		void removeLeastUsed();
 
-		/**
-		 * @brief	Checks are the specified vertex shader input and vertex buffer declarations compatible.
-		 *			Vertex buffer must provide all inputs to the shader in order for them to be compatible
-		 *			(extra data is allowed).
-		 */
-		bool areCompatible(const SPtr<VertexDeclarationCore>& vertexShaderDecl, const SPtr<VertexDeclarationCore>& vertexBufferDecl);
-
 	private:
 		static const int DECLARATION_BUFFER_SIZE = 1024;
 		static const int NUM_ELEMENTS_TO_PRUNE = 64;

+ 3 - 3
BansheeD3D11RenderAPI/Include/BsD3D11MultiRenderTexture.h

@@ -21,7 +21,7 @@ namespace BansheeEngine
 		/**
 		 * @copydoc	MultiRenderTextureCore::getCustomAttribute
 		 */
-		void getCustomAttribute(const String& name, void* pData) const;
+		void getCustomAttribute(const String& name, void* pData) const override;
 
 	protected:
 		friend class D3D11MultiRenderTexture;
@@ -29,7 +29,7 @@ namespace BansheeEngine
 		/**
 		 * @copydoc	MultiRenderTextureCore::getProperties
 		 */
-		const RenderTargetProperties& getPropertiesInternal() const { return mProperties; }
+		const RenderTargetProperties& getPropertiesInternal() const override { return mProperties; }
 
 		MultiRenderTextureProperties mProperties;
 	};
@@ -52,7 +52,7 @@ namespace BansheeEngine
 		/**
 		 * @copydoc	MultiRenderTexture::getProperties
 		 */
-		const RenderTargetProperties& getPropertiesInternal() const { return mProperties; }
+		const RenderTargetProperties& getPropertiesInternal() const override { return mProperties; }
 
 		MultiRenderTextureProperties mProperties;
 	};

+ 1 - 28
BansheeD3D11RenderAPI/Source/BsD3D11InputLayoutManager.cpp

@@ -78,7 +78,7 @@ namespace BansheeEngine
 
 	void D3D11InputLayoutManager::addNewInputLayout(const SPtr<VertexDeclarationCore>& vertexShaderDecl, const SPtr<VertexDeclarationCore>& vertexBufferDecl, D3D11GpuProgramCore& vertexProgram)
 	{
-		if(!areCompatible(vertexShaderDecl, vertexBufferDecl))
+		if (!vertexBufferDecl->isCompatible(vertexShaderDecl))
 			return; // Error was already reported, so just quit here
 
 		const VertexDeclarationProperties& declProps = vertexBufferDecl->getProperties();
@@ -162,31 +162,4 @@ namespace BansheeEngine
 				break;
 		}
 	}
-
-	bool D3D11InputLayoutManager::areCompatible(const SPtr<VertexDeclarationCore>& vertexShaderDecl, const SPtr<VertexDeclarationCore>& vertexBufferDecl)
-	{
-		const List<VertexElement>& shaderElems = vertexShaderDecl->getProperties().getElements();
-		const List<VertexElement>& bufferElems = vertexBufferDecl->getProperties().getElements();
-
-		for (auto shaderIter = shaderElems.begin(); shaderIter != shaderElems.end(); ++shaderIter)
-		{
-			const VertexElement* foundElement = nullptr;
-			for (auto bufferIter = bufferElems.begin(); bufferIter != bufferElems.end(); ++bufferIter)
-			{
-				if(shaderIter->getSemantic() == bufferIter->getSemantic() && shaderIter->getSemanticIdx() == bufferIter->getSemanticIdx())
-				{
-					foundElement = &(*bufferIter);
-					break;
-				}
-			}
-
-			if(foundElement == nullptr)
-			{
-				LOGWRN("Provided vertex buffer doesn't have a required input attribute: " + toString(shaderIter->getSemantic()) + toString(shaderIter->getSemanticIdx()));
-				return false;
-			}
-		}
-
-		return true;
-	}
 }

+ 9 - 9
BansheeD3D11RenderAPI/Source/BsD3D11MultiRenderTexture.cpp

@@ -20,22 +20,22 @@ namespace BansheeEngine
 	{
 		if(name == "RTV")
 		{
-			ID3D11RenderTargetView** pRTVs = (ID3D11RenderTargetView **)pData;
-			for(size_t x = 0; x < mColorSurfaces.size(); ++x)		
+			ID3D11RenderTargetView** rtvs = (ID3D11RenderTargetView **)pData;
+			for(UINT32 i = 0; i < (UINT32)mColorSurfaces.size(); ++i)		
 			{
-				D3D11TextureView* textureView = static_cast<D3D11TextureView*>(mColorSurfaces[x].get());
-				pRTVs[x] = textureView->getRTV();	
-			}
+				if (mColorSurfaces[i] == nullptr)
+					continue;
 
-			return;
+				D3D11TextureView* textureView = static_cast<D3D11TextureView*>(mColorSurfaces[i].get());
+				rtvs[i] = textureView->getRTV();	
+			}
 		}
 		else if(name == "DSV")
 		{
-			ID3D11DepthStencilView** pDSV = (ID3D11DepthStencilView **)pData;
+			ID3D11DepthStencilView** dsv = (ID3D11DepthStencilView **)pData;
 
 			D3D11TextureView* depthStencilView = static_cast<D3D11TextureView*>(mDepthStencilSurface.get());
-			*pDSV = depthStencilView->getDSV();
-			return;
+			*dsv = depthStencilView->getDSV();
 		}
 	}
 

+ 6 - 9
BansheeD3D11RenderAPI/Source/BsD3D11RenderAPI.cpp

@@ -744,20 +744,17 @@ namespace BansheeEngine
 
 		mActiveRenderTarget = target;
 
-		// Retrieve render surfaces
 		UINT32 maxRenderTargets = mCurrentCapabilities->getNumMultiRenderTargets();
 		ID3D11RenderTargetView** views = bs_newN<ID3D11RenderTargetView*>(maxRenderTargets);
 		memset(views, 0, sizeof(ID3D11RenderTargetView*) * maxRenderTargets);
-		target->getCustomAttribute("RTV", views);
-		if (!views[0])
-		{
-			bs_deleteN(views, maxRenderTargets);
-			return;
-		}
 
-		// Retrieve depth stencil
 		ID3D11DepthStencilView* depthStencilView = nullptr;
-		target->getCustomAttribute("DSV", &depthStencilView);
+
+		if (target != nullptr)
+		{
+			target->getCustomAttribute("RTV", views);
+			target->getCustomAttribute("DSV", &depthStencilView);
+		}
 
 		// Bind render targets
 		mDevice->getImmediateContext()->OMSetRenderTargets(maxRenderTargets, views, depthStencilView);

+ 5 - 0
BansheeD3D9RenderAPI/Include/BsD3D9Mappings.h

@@ -103,6 +103,11 @@ namespace BansheeEngine
 		 */
 		static D3DDECLUSAGE get(VertexElementSemantic sem);
         
+		/**
+		 * @brief	Converts DirectX9 vertex element semantic to engine vertex element semantic.
+		 */
+		static VertexElementSemantic get(D3DDECLUSAGE sem);
+
 		/**
 		 * @brief	Converts a matrix to one usable by DirectX 9 API.
 		 */

+ 24 - 0
BansheeD3D9RenderAPI/Source/BsD3D9GpuProgram.cpp

@@ -9,6 +9,7 @@
 #include "BsGpuProgramManager.h"
 #include "BsD3D9HLSLParamParser.h"
 #include "BsRenderStats.h"
+#include "BsHardwareBufferManager.h"
 
 namespace BansheeEngine 
 {
@@ -190,6 +191,29 @@ namespace BansheeEngine
 			D3D9HLSLParamParser paramParser(constTable, mBlocks);
 			mParametersDesc = paramParser.buildParameterDescriptions();
 
+			// Get input declaration
+			if (mProperties.getType() == GPT_VERTEX_PROGRAM)
+			{
+				UINT32 numInputs = 0;
+				D3DXGetShaderInputSemantics((DWORD*)mMicrocode->GetBufferPointer(), nullptr, &numInputs);
+
+				List<VertexElement> elements;
+				if (numInputs > 0)
+				{
+					D3DXSEMANTIC* semantics = bs_stack_alloc<D3DXSEMANTIC>(numInputs);
+
+					for (UINT32 i = 0; i < numInputs; i++)
+					{
+						elements.push_back(VertexElement(0, 0, VET_FLOAT4, 
+							D3D9Mappings::get((D3DDECLUSAGE)semantics[i].Usage), semantics[i].UsageIndex));
+					}
+
+					bs_stack_free(semantics);
+				}
+
+				mInputDeclaration = HardwareBufferCoreManager::instance().createVertexDeclaration(elements);
+			}
+
 			mIsCompiled = true;
 			mCompileError = "";
 

+ 27 - 8
BansheeD3D9RenderAPI/Source/BsD3D9Mappings.cpp

@@ -368,28 +368,20 @@ namespace BansheeEngine
 		{
 		case VES_BLEND_INDICES:
 			return D3DDECLUSAGE_BLENDINDICES;
-			break;
 		case VES_BLEND_WEIGHTS:
 			return D3DDECLUSAGE_BLENDWEIGHT;
-			break;
 		case VES_COLOR:
 			return D3DDECLUSAGE_COLOR;
-			break;
 		case VES_NORMAL:
 			return D3DDECLUSAGE_NORMAL;
-			break;
 		case VES_POSITION:
 			return D3DDECLUSAGE_POSITION;
-			break;
 		case VES_TEXCOORD:
 			return D3DDECLUSAGE_TEXCOORD;
-			break;
 		case VES_BITANGENT:
 			return D3DDECLUSAGE_BINORMAL;
-			break;
 		case VES_TANGENT:
 			return D3DDECLUSAGE_TANGENT;
-			break;
 		default:
 			BS_EXCEPT(RenderingAPIException, "Invalid semantic for D3D9 render system: " + toString(sem));
 		}
@@ -397,6 +389,33 @@ namespace BansheeEngine
 		return D3DDECLUSAGE_POSITION;
 	}
 
+	VertexElementSemantic D3D9Mappings::get(D3DDECLUSAGE sem)
+	{
+		switch (sem)
+		{
+		case D3DDECLUSAGE_BLENDINDICES:
+			return VES_BLEND_INDICES;
+		case D3DDECLUSAGE_BLENDWEIGHT:
+			return VES_BLEND_WEIGHTS;
+		case D3DDECLUSAGE_COLOR:
+			return VES_COLOR;
+		case D3DDECLUSAGE_NORMAL:
+			return VES_NORMAL;
+		case D3DDECLUSAGE_POSITION:
+			return VES_POSITION;
+		case D3DDECLUSAGE_TEXCOORD:
+			return VES_TEXCOORD;
+		case D3DDECLUSAGE_BINORMAL:
+			return VES_BITANGENT;
+		case D3DDECLUSAGE_TANGENT:
+			return VES_TANGENT;
+		default:
+			BS_EXCEPT(RenderingAPIException, "Invalid semantic for D3D9 render system: " + toString(sem));
+		}
+
+		return VES_POSITION;
+	}
+
 	D3DXMATRIX D3D9Mappings::makeD3DXMatrix(const Matrix4& mat)
 	{
 		// Transpose matrix

+ 1 - 1
BansheeEditorExec/BsEditorExec.cpp

@@ -72,7 +72,7 @@ int CALLBACK WinMain(
 
 	__try
 	{
-		EditorApplication::startUp(EditorRenderAPI::OpenGL);
+		EditorApplication::startUp(EditorRenderAPI::DX11);
 		EditorApplication::instance().runMainLoop();
 		EditorApplication::shutDown();
 	}

+ 10 - 0
BansheeEngine/Source/BsLight.cpp

@@ -101,6 +101,7 @@ namespace BansheeEngine
 
 		UINT32 dirtyFlags = 0;
 		bool oldIsActive = mIsActive;
+		LightType oldType = mType;
 
 		dataPtr = rttiReadElem(mPosition, dataPtr);
 		dataPtr = rttiReadElem(mRotation, dataPtr);
@@ -129,11 +130,20 @@ namespace BansheeEngine
 				if (mIsActive)
 					gRenderer()->_notifyLightAdded(this);
 				else
+				{
+					LightType newType = mType;
+					mType = oldType;
 					gRenderer()->_notifyLightRemoved(this);
+					mType = newType;
+				}
 			}
 			else
 			{
+				LightType newType = mType;
+				mType = oldType;
 				gRenderer()->_notifyLightRemoved(this);
+				mType = newType;
+
 				gRenderer()->_notifyLightAdded(this);
 			}
 		}

+ 1 - 1
BansheeGLRenderAPI/Source/BsGLVertexArrayObjectManager.cpp

@@ -123,7 +123,7 @@ namespace BansheeEngine
 		}
 
 		// Need to create new VAO
-		const List<VertexElement>& inputAttributes = vertexProgram->getInputAttributes().getProperties().getElements();
+		const List<VertexElement>& inputAttributes = vertexProgram->getInputDeclaration()->getProperties().getElements();
 
 		glGenVertexArrays(1, &wantedVAO.mHandle);
 		glBindVertexArray(wantedVAO.mHandle);

+ 0 - 9
BansheeGLRenderAPI/Source/GLSL/include/BsGLSLGpuProgram.h

@@ -18,13 +18,6 @@ namespace BansheeEngine
 		 */
 		bool isSupported() const override;
 
-		/**
-		 * @brief	Gets vertex declaration that determines which input attributes does the GPU
-		 *			program expect (and which attributes will it retrieve from the bound vertex buffer). 
-		 *			Only valid for vertex programs.
-		 */
-		const VertexDeclarationCore& getInputAttributes() const { return *mVertexDeclaration; }
-
 		/**
 		 * @brief	Gets internal OpenGL handle to the program.
 		 */
@@ -51,8 +44,6 @@ namespace BansheeEngine
 		UINT32 mProgramID;
 		GLuint mGLHandle;
 
-		SPtr<VertexDeclarationCore> mVertexDeclaration;
-		
 		static UINT32 mVertexShaderCount;
 		static UINT32 mFragmentShaderCount;
 		static UINT32 mGeometryShaderCount;

+ 1 - 1
BansheeGLRenderAPI/Source/GLSL/src/BsGLSLGpuProgram.cpp

@@ -198,7 +198,7 @@ namespace BansheeEngine
 			if (mProperties.getType() == GPT_VERTEX_PROGRAM)
 			{
 				List<VertexElement> elementList = paramParser.buildVertexDeclaration(mGLHandle);
-				mVertexDeclaration = HardwareBufferCoreManager::instance().createVertexDeclaration(elementList);
+				mInputDeclaration = HardwareBufferCoreManager::instance().createVertexDeclaration(elementList);
 			}
 		}
 

+ 39 - 19
RenderBeast/Source/BsRenderBeast.cpp

@@ -132,6 +132,8 @@ namespace BansheeEngine
 		if (mesh != nullptr)
 		{
 			const MeshProperties& meshProps = mesh->getProperties();
+			SPtr<VertexDeclarationCore> vertexDecl = mesh->getVertexData()->vertexDeclaration;
+
 			for (UINT32 i = 0; i < meshProps.getNumSubMeshes(); i++)
 			{
 				renderableData.elements.push_back(BeastRenderableElement());
@@ -145,6 +147,24 @@ namespace BansheeEngine
 				if (renElement.material == nullptr)
 					renElement.material = renderable->getMaterial(0);
 
+				// Validate mesh <-> shader vertex bindings
+				if (renElement.material != nullptr)
+				{
+					UINT32 numPasses = renElement.material->getNumPasses();
+					for (UINT32 j = 0; j < numPasses; j++)
+					{
+						SPtr<PassCore> pass = renElement.material->getPass(j);
+
+						if (!vertexDecl->isCompatible(pass->getVertexProgram()->getInputDeclaration()))
+						{
+							renElement.material = nullptr;
+							LOGWRN("Provided mesh is missing required vertex attributes to render with the provided shader.");
+							// TODO - Print mesh & shader names, as well as the exact attributes that are missing
+							break;
+						}
+					}
+				}
+
 				if (renElement.material == nullptr)
 				{
 					SPtr<VertexData> vertexData = mesh->getVertexData();
@@ -453,32 +473,32 @@ namespace BansheeEngine
 
 			RenderAPICore::instance().beginFrame();
 
-			//UINT32 numCameras = (UINT32)cameras.size();
-			//for (UINT32 i = 0; i < numCameras; i++)
-			//	render(renderTargetData, i);
+			UINT32 numCameras = (UINT32)cameras.size();
+			for (UINT32 i = 0; i < numCameras; i++)
+				render(renderTargetData, i);
 
 			// BEGIN OLD STUFF
-			RenderAPICore::instance().setRenderTarget(target);
-			for(auto& camera : cameras)
-			{
-				SPtr<ViewportCore> viewport = camera->getViewport();
-				RenderAPICore::instance().setViewport(viewport->getNormArea());
+			//RenderAPICore::instance().setRenderTarget(target);
+			//for(auto& camera : cameras)
+			//{
+			//	SPtr<ViewportCore> viewport = camera->getViewport();
+			//	RenderAPICore::instance().setViewport(viewport->getNormArea());
 
-				UINT32 clearBuffers = 0;
-				if(viewport->getRequiresColorClear())
-					clearBuffers |= FBT_COLOR;
+			//	UINT32 clearBuffers = 0;
+			//	if(viewport->getRequiresColorClear())
+			//		clearBuffers |= FBT_COLOR;
 
-				if(viewport->getRequiresDepthClear())
-					clearBuffers |= FBT_DEPTH;
+			//	if(viewport->getRequiresDepthClear())
+			//		clearBuffers |= FBT_DEPTH;
 
-				if(viewport->getRequiresStencilClear())
-					clearBuffers |= FBT_STENCIL;
+			//	if(viewport->getRequiresStencilClear())
+			//		clearBuffers |= FBT_STENCIL;
 
-				if(clearBuffers != 0)
-					RenderAPICore::instance().clearViewport(clearBuffers, viewport->getClearColor(), viewport->getClearDepthValue(), viewport->getClearStencilValue());
+			//	if(clearBuffers != 0)
+			//		RenderAPICore::instance().clearViewport(clearBuffers, viewport->getClearColor(), viewport->getClearDepthValue(), viewport->getClearStencilValue());
 
-				renderOLD(*camera);
-			}
+			//	renderOLD(*camera);
+			//}
 			// END OLD STUFF
 
 			RenderAPICore::instance().endFrame();

+ 3 - 2
TODOExperimentation.txt

@@ -14,8 +14,9 @@ Assign ViewOrigin, PreViewTranslation, TransViewProj
  - Do this after I have basic rendering working, to avoid additional issues when I'm initially trying to get it to work
  
 Next week:
- - Need to generate a full screen quad for directional light pass (RenderBeast::drawFullscreen(Camera, Material))
-   - Consider drawing a large triangle instead of a quad to improve rasterization (probably just add a TODO, and do it when I can test performance)
+ - Default shaders need to render to gbuffer
+ - When shader input layout doesn't match with the vertex buffer report this error only once except for every frame
+  - When issue is found print mesh & shader names, as well as the exact attributes that are missing
  - Finish up DefferedPointLightPass by generating cone geometry in shader
  - Modify Light so it generated adequate number of vertices required for cone geometry, without actually creating the cone
  - Think about how to handle post-processing shaders (HDR tone mapping)