Просмотр исходного кода

Fix for render to texture aspect ratio when post processing filter is applied

Ivan Safrin 14 лет назад
Родитель
Сommit
dc9f716198

+ 2 - 2
Core/Contents/Include/PolyCamera.h

@@ -85,7 +85,7 @@ namespace Polycode {
 			void setLightDepthTexture(Texture *texture);			
 
 			bool hasFilterShader();
-			void drawFilter(Texture *targetTexture = NULL, Number targetTextureWidth = 0.0, Number targetTextureHeight = 0.0);
+			void drawFilter(Texture *targetTexture = NULL, Number targetTextureWidth = 0.0, Number targetTextureHeight = 0.0, Texture *targetColorTexture = NULL, Texture *targetZTexture = NULL);
 			
 			/**
 			* Sets the exposure for the camera. The exposure value can be passed to a shader for HDR rendering.
@@ -135,7 +135,7 @@ namespace Polycode {
 
 			Material *filterShaderMaterial;			
 			Texture *originalSceneTexture;			
-			Texture *zBufferSceneTexture;						
+			Texture *zBufferSceneTexture;
 			std::vector<ShaderBinding*> localShaderOptions;
 			bool _hasFilterShader;
 	};	

+ 6 - 0
Core/Contents/Include/PolySceneRenderTexture.h

@@ -51,6 +51,9 @@ namespace Polycode {
 			*/
 			Texture *getTargetTexture();
 			
+			Texture *getFilterColorBufferTexture();
+			Texture *getFilterZBufferTexture();			
+
 			/**
 			* Returns the target scene.
 			*/			
@@ -63,6 +66,9 @@ namespace Polycode {
 				
 		protected:
 		
+			Texture *filterColorBufferTexture;
+			Texture *filterZBufferTexture;
+		
 			Texture *depthTexture;		
 			Texture *targetTexture;
 			Scene *targetScene;

+ 30 - 4
Core/Contents/Source/PolyCamera.cpp

@@ -295,14 +295,40 @@ void Camera::setLightDepthTexture(Texture *texture) {
 
 }
 
-void Camera::drawFilter(Texture *targetTexture, Number targetTextureWidth, Number targetTextureHeight) {
+void Camera::drawFilter(Texture *targetTexture, Number targetTextureWidth, Number targetTextureHeight, Texture *targetColorTexture, Texture *targetZTexture) {
 
 	if(!filterShaderMaterial)
 		return;
 		
-	CoreServices::getInstance()->getRenderer()->setViewportSize(CoreServices::getInstance()->getRenderer()->getXRes(), CoreServices::getInstance()->getRenderer()->getYRes());
-	CoreServices::getInstance()->getRenderer()->bindFrameBufferTexture(originalSceneTexture);
-//	CoreServices::getInstance()->getRenderer()->bindFrameBufferTexture(zBufferSceneTexture);	
+	Texture *finalTargetColorTexture;
+	Texture *finalTargetZTexture;	
+		
+	if(targetTexture) {	
+		ShaderBinding* binding = localShaderOptions[0];
+		binding->clearTexture("screenColorBuffer");
+		binding->clearTexture("screenDepthBuffer");				
+		binding->addTexture("screenColorBuffer", targetColorTexture);
+		binding->addTexture("screenDepthBuffer", targetZTexture);
+		
+		finalTargetColorTexture = targetColorTexture;
+		finalTargetZTexture = targetZTexture;
+		
+		CoreServices::getInstance()->getRenderer()->setViewportSize(targetTextureWidth, targetTextureHeight);		
+	} else {
+	
+		ShaderBinding* binding = localShaderOptions[0];
+		binding->clearTexture("screenColorBuffer");
+		binding->clearTexture("screenDepthBuffer");				
+		binding->addTexture("screenColorBuffer", originalSceneTexture);
+		binding->addTexture("screenDepthBuffer", zBufferSceneTexture);	
+	
+		finalTargetColorTexture = originalSceneTexture;
+		finalTargetZTexture = zBufferSceneTexture;
+	
+		CoreServices::getInstance()->getRenderer()->setViewportSize(CoreServices::getInstance()->getRenderer()->getXRes(), CoreServices::getInstance()->getRenderer()->getYRes());
+	}
+	CoreServices::getInstance()->getRenderer()->bindFrameBufferTexture(finalTargetColorTexture);
+//	CoreServices::getInstance()->getRenderer()->bindFrameBufferTexture(finalTargetZTexture);	
 	parentScene->Render(this);
 	CoreServices::getInstance()->getRenderer()->unbindFramebuffers();
 

+ 1 - 1
Core/Contents/Source/PolySceneManager.cpp

@@ -78,7 +78,7 @@ void SceneManager::UpdateVirtual() {
 			renderTextures[i]->getTargetScene()->Update();
 						
 			if(renderTextures[i]->getTargetCamera()->hasFilterShader()) {
-				renderTextures[i]->getTargetCamera()->drawFilter(renderTextures[i]->getTargetTexture(), renderTextures[i]->getTargetTexture()->getWidth(), renderTextures[i]->getTargetTexture()->getHeight());
+				renderTextures[i]->getTargetCamera()->drawFilter(renderTextures[i]->getTargetTexture(), renderTextures[i]->getTargetTexture()->getWidth(), renderTextures[i]->getTargetTexture()->getHeight(), renderTextures[i]->getFilterColorBufferTexture(), renderTextures[i]->getFilterZBufferTexture());
 			} else {
 				CoreServices::getInstance()->getRenderer()->bindFrameBufferTexture(renderTextures[i]->getTargetTexture());
 				renderTextures[i]->getTargetScene()->Render(renderTextures[i]->getTargetCamera());

+ 15 - 0
Core/Contents/Source/PolySceneRenderTexture.cpp

@@ -33,6 +33,11 @@ SceneRenderTexture::SceneRenderTexture(Scene *targetScene, Camera *targetCamera,
 	CoreServices::getInstance()->getRenderer()->createRenderTextures(&targetTexture, &depthTexture, renderWidth, renderHeight, false);
 	this->targetScene = targetScene;
 	this->targetCamera = targetCamera;
+	
+	
+	CoreServices::getInstance()->getRenderer()->createRenderTextures(&filterColorBufferTexture, &filterZBufferTexture, renderWidth, renderHeight, true);
+	
+	
 	CoreServices::getInstance()->getSceneManager()->registerRenderTexture(this);
 }
 
@@ -44,6 +49,14 @@ Scene *SceneRenderTexture::getTargetScene() {
 	return targetScene;
 }
 
+Texture *SceneRenderTexture::getFilterColorBufferTexture() {
+	return filterColorBufferTexture;
+}
+
+Texture *SceneRenderTexture::getFilterZBufferTexture() {
+	return filterZBufferTexture;
+}
+
 Camera *SceneRenderTexture::getTargetCamera() {
 	return targetCamera;
 }
@@ -56,4 +69,6 @@ SceneRenderTexture::~SceneRenderTexture() {
 	CoreServices::getInstance()->getSceneManager()->unregisterRenderTexture(this);
 	CoreServices::getInstance()->getRenderer()->destroyTexture(targetTexture);
 	CoreServices::getInstance()->getRenderer()->destroyTexture(depthTexture);	
+	CoreServices::getInstance()->getRenderer()->destroyTexture(filterColorBufferTexture);
+	CoreServices::getInstance()->getRenderer()->destroyTexture(filterZBufferTexture);	
 }