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

Only use FP16 framebuffers if specified in material file

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

BIN
Assets/Default asset pack/hdr.pak


+ 1 - 1
Assets/Default asset pack/hdr/hdr.mat

@@ -55,7 +55,7 @@
 			</shader>
 		</material>	
 		<material name="HDRProcessBloom">
-			<rendertargets>
+			<rendertargets type="rgba_fp16">
 				<rendertarget id="base_target"  sizeMode="normalized" width="1.0" height="1.0"/>			
 				<rendertarget id="bloomtarget"  sizeMode="pixels" width="256" height="256"/>
 				<rendertarget id="bloomtarget2"  sizeMode="pixels" width="256" height="256"/>				

+ 1 - 1
Core/Contents/Include/PolyGLRenderer.h

@@ -120,7 +120,7 @@ namespace Polycode {
 		Texture *createTexture(unsigned int width, unsigned int height, char *textureData, bool clamp, bool createMipmaps, int type = Image::IMAGE_RGBA);
 		void destroyTexture(Texture *texture);		
 		Texture *createFramebufferTexture(unsigned int width, unsigned int height);
-		void createRenderTextures(Texture **colorBuffer, Texture **depthBuffer, int width, int height);
+		void createRenderTextures(Texture **colorBuffer, Texture **depthBuffer, int width, int height, bool floatingPointBuffer);
 		
 		void enableAlphaTest(bool val);
 		

+ 3 - 1
Core/Contents/Include/PolyMaterial.h

@@ -54,7 +54,9 @@ namespace Polycode {
 			Number specularStrength;
 			Color specularColor;
 			Color diffuseColor;
-						
+				
+			bool fp16RenderTargets;
+			
 		protected:
 		
 			std::vector<Shader*> materialShaders;

+ 1 - 1
Core/Contents/Include/PolyRenderer.h

@@ -88,7 +88,7 @@ namespace Polycode {
 		virtual Cubemap *createCubemap(Texture *t0, Texture *t1, Texture *t2, Texture *t3, Texture *t4, Texture *t5) = 0;		
 		virtual Texture *createTexture(unsigned int width, unsigned int height, char *textureData, bool clamp, bool createMipmaps, int type=Image::IMAGE_RGBA) = 0;
 		virtual void destroyTexture(Texture *texture) = 0;
-		virtual void createRenderTextures(Texture **colorBuffer, Texture **depthBuffer, int width, int height) = 0;
+		virtual void createRenderTextures(Texture **colorBuffer, Texture **depthBuffer, int width, int height, bool floatingPointBuffer) = 0;
 		
 		virtual Texture *createFramebufferTexture(unsigned int width, unsigned int height) = 0;
 		virtual void bindFrameBufferTexture(Texture *texture) = 0;

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

@@ -266,7 +266,7 @@ void Camera::createPostFilter(Material *shaderMaterial) {
 //	zBufferSceneTexture = CoreServices::getInstance()->getMaterialManager()->createFramebufferTexture(CoreServices::getInstance()->getCore()->getXRes(), CoreServices::getInstance()->getCore()->getYRes(), 0);
 
 	if(!originalSceneTexture) {
-	CoreServices::getInstance()->getRenderer()->createRenderTextures(&originalSceneTexture, &zBufferSceneTexture, CoreServices::getInstance()->getCore()->getXRes(), CoreServices::getInstance()->getCore()->getYRes());
+	CoreServices::getInstance()->getRenderer()->createRenderTextures(&originalSceneTexture, &zBufferSceneTexture, CoreServices::getInstance()->getCore()->getXRes(), CoreServices::getInstance()->getCore()->getYRes(), shaderMaterial->fp16RenderTargets);
 	}
 	
 	for(int i=0; i < shaderMaterial->getNumShaders(); i++) {

+ 8 - 3
Core/Contents/Source/PolyGLRenderer.cpp

@@ -580,7 +580,7 @@ void OpenGLRenderer::unbindFramebuffers() {
 }
 
 
-void OpenGLRenderer::createRenderTextures(Texture **colorBuffer, Texture **depthBuffer, int width, int height) {
+void OpenGLRenderer::createRenderTextures(Texture **colorBuffer, Texture **depthBuffer, int width, int height, bool floatingPointBuffer) {
 			
 	GLuint depthTexture,colorTexture;
 	GLenum status;
@@ -595,8 +595,13 @@ void OpenGLRenderer::createRenderTextures(Texture **colorBuffer, Texture **depth
 	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 	glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
 	glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);	
-	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F_ARB, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
-
+	
+	if(floatingPointBuffer) {
+		glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F_ARB, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
+	} else {
+		glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);	
+	}
+	
 	glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, colorTexture, 0);
 
 	status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);

+ 1 - 0
Core/Contents/Source/PolyMaterial.cpp

@@ -30,6 +30,7 @@ Material::Material(const String& name) : Resource(Resource::RESOURCE_MATERIAL) {
 	this->name = name;
 	specularValue = 75.0;
 	specularStrength = 1.0;
+	fp16RenderTargets = false;
 }
 
 Material::~Material() {

+ 8 - 1
Core/Contents/Source/PolyMaterialManager.cpp

@@ -247,6 +247,13 @@ Material *MaterialManager::materialFromXMLNode(TiXmlNode *node) {
 
 	for (pChild3 = node->FirstChild(); pChild3 != 0; pChild3 = pChild3->NextSibling()) {
 		if(strcmp(pChild3->Value(), "rendertargets") == 0) {
+			
+			if(pChild3->ToElement()->Attribute("type")) {
+				if(strcmp(pChild3->ToElement()->Attribute("type"), "rgba_fp16") == 0) {
+					newMaterial->fp16RenderTargets = true;
+				}			
+			}
+		
 			for (pChild = pChild3->FirstChild(); pChild != 0; pChild = pChild->NextSibling()) {
 				if(strcmp(pChild->Value(), "rendertarget") == 0) {
 					ShaderRenderTarget *newTarget = new ShaderRenderTarget;
@@ -271,7 +278,7 @@ Material *MaterialManager::materialFromXMLNode(TiXmlNode *node) {
 					}						
 //					Texture *newTexture = CoreServices::getInstance()->getMaterialManager()->createNewTexture(newTarget->width, newTarget->height, true);
 					Texture *newTexture, *temp;
-					CoreServices::getInstance()->getRenderer()->createRenderTextures(&newTexture, &temp, (int)newTarget->width, (int)newTarget->height);
+					CoreServices::getInstance()->getRenderer()->createRenderTextures(&newTexture, &temp, (int)newTarget->width, (int)newTarget->height, newMaterial->fp16RenderTargets);
 					newTexture->setResourceName(newTarget->id);
 					//CoreServices::getInstance()->getResourceManager()->addResource(newTexture);
 					newTarget->texture = newTexture;

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

@@ -94,7 +94,7 @@ void SceneLight::enableDebugDraw(bool val) {
 void SceneLight::enableShadows(bool val, Number resolution) {
 	if(val) {
 		if(!zBufferTexture) {
-			CoreServices::getInstance()->getRenderer()->createRenderTextures(NULL, &zBufferTexture, resolution, resolution);
+			CoreServices::getInstance()->getRenderer()->createRenderTextures(NULL, &zBufferTexture, resolution, resolution, false);
 		}
 		if(!spotCamera) {
 			spotCamera = new Camera(parentScene);

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

@@ -30,7 +30,7 @@ using namespace Polycode;
 
 SceneRenderTexture::SceneRenderTexture(Scene *targetScene, Camera *targetCamera, int renderWidth,int renderHeight) {
 //	targetTexture = CoreServices::getInstance()->getMaterialManager()->createTexture(renderWidth, renderHeight, NULL,true);
-	CoreServices::getInstance()->getRenderer()->createRenderTextures(&targetTexture, &depthTexture, renderWidth, renderHeight);
+	CoreServices::getInstance()->getRenderer()->createRenderTextures(&targetTexture, &depthTexture, renderWidth, renderHeight, false);
 	this->targetScene = targetScene;
 	this->targetCamera = targetCamera;
 	CoreServices::getInstance()->getSceneManager()->registerRenderTexture(this);

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

@@ -164,7 +164,7 @@ void Screen::setScreenShader(const String& shaderName) {
 		return;
 	
 	if(!originalSceneTexture) {
-	CoreServices::getInstance()->getRenderer()->createRenderTextures(&originalSceneTexture, NULL, CoreServices::getInstance()->getCore()->getXRes(), CoreServices::getInstance()->getCore()->getYRes());
+	CoreServices::getInstance()->getRenderer()->createRenderTextures(&originalSceneTexture, NULL, CoreServices::getInstance()->getCore()->getXRes(), CoreServices::getInstance()->getCore()->getYRes(), filterShaderMaterial->fp16RenderTargets);
 	}
 	
 	for(int i=0; i < filterShaderMaterial->getNumShaders(); i++) {