Prechádzať zdrojové kódy

OpenGL render texture depth buffer is properly hooked up

Marko Pintera 11 rokov pred
rodič
commit
a328c6e377

+ 0 - 6
BansheeEditor/Include/BsHandleDrawManager.h

@@ -51,9 +51,6 @@ namespace BansheeEngine
 	{
 		struct SolidMaterialData
 		{
-			HMaterial material;
-
-			// Core
 			MaterialProxyPtr proxy;
 			GpuParamMat4 mViewProj;
 			GpuParamMat4 mViewIT;
@@ -61,9 +58,6 @@ namespace BansheeEngine
 
 		struct WireMaterialData
 		{
-			HMaterial material;
-
-			// Core
 			MaterialProxyPtr proxy;
 			GpuParamMat4 mViewProj;
 		};

+ 1 - 1
BansheeEditorExec/BsEditorExec.cpp

@@ -11,7 +11,7 @@ int CALLBACK WinMain(
 	_In_  int nCmdShow
 	)
 {
-	EditorApplication::startUp(RenderSystemPlugin::DX11);
+	EditorApplication::startUp(RenderSystemPlugin::OpenGL);
 	EditorApplication::instance().runMainLoop();
 	EditorApplication::shutDown();
 

+ 17 - 23
BansheeGLRenderSystem/Source/BsGLFrameBufferObject.cpp

@@ -8,7 +8,7 @@ namespace BansheeEngine
 {
     GLFrameBufferObject::GLFrameBufferObject()
     {
-        glGenFramebuffersEXT(1, &mFB);
+        glGenFramebuffers(1, &mFB);
 
         for(UINT32 x = 0; x < BS_MAX_MULTIPLE_RENDER_TARGETS; ++x)
             mColor[x].buffer = nullptr;
@@ -18,7 +18,7 @@ namespace BansheeEngine
 
     GLFrameBufferObject::~GLFrameBufferObject()
     {
-        glDeleteFramebuffersEXT(1, &mFB);    
+        glDeleteFramebuffers(1, &mFB);    
 		BS_INC_RENDER_STAT_CAT(ResDestroyed, RenderStatObject_FrameBufferObject);
     }
 
@@ -43,6 +43,9 @@ namespace BansheeEngine
 	void GLFrameBufferObject::bindDepthStencil(GLPixelBufferPtr depthStencilBuffer)
 	{
 		mDepthStencilBuffer = depthStencilBuffer;
+
+		if (mColor[0].buffer)
+			rebuild();
 	}
 
 	void GLFrameBufferObject::unbindDepthStencil()
@@ -64,7 +67,7 @@ namespace BansheeEngine
         UINT16 maxSupportedMRTs = BansheeEngine::RenderSystem::instancePtr()->getCapabilities()->getNumMultiRenderTargets();
 
 		// Bind simple buffer to add color attachments
-		glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mFB);
+		glBindFramebuffer(GL_FRAMEBUFFER, mFB);
 
         // Bind all attachment points to frame buffer
         for(UINT16 x = 0; x < maxSupportedMRTs; ++x)
@@ -92,12 +95,12 @@ namespace BansheeEngine
 				// Note: I'm attaching textures to FBO while renderbuffers might yield better performance if I
 				// don't need to read from them
 
-	            mColor[x].buffer->bindToFramebuffer(GL_COLOR_ATTACHMENT0_EXT + x, mColor[x].zoffset);
+	            mColor[x].buffer->bindToFramebuffer(GL_COLOR_ATTACHMENT0 + x, mColor[x].zoffset);
             }
             else
             {
                 // Detach
-                glFramebufferTextureEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT + x, 0, 0);
+                glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + x, 0, 0);
             }
         }
 
@@ -106,13 +109,13 @@ namespace BansheeEngine
 
 		// Do glDrawBuffer calls
 		GLenum bufs[BS_MAX_MULTIPLE_RENDER_TARGETS];
-		GLsizei n=0;
-		for(UINT32 x=0; x<BS_MAX_MULTIPLE_RENDER_TARGETS; ++x)
+		GLsizei n = 0;
+		for(UINT32 x = 0; x < BS_MAX_MULTIPLE_RENDER_TARGETS; ++x)
 		{
 			// Fill attached colour buffers
 			if(mColor[x].buffer)
 			{
-				bufs[x] = GL_COLOR_ATTACHMENT0_EXT + x;
+				bufs[x] = GL_COLOR_ATTACHMENT0 + x;
 				// Keep highest used buffer + 1
 				n = x+1;
 			}
@@ -122,32 +125,23 @@ namespace BansheeEngine
 			}
 		}
 
-		if(glDrawBuffers)
-		{
-			// Drawbuffer extension supported, use it
-			glDrawBuffers(n, bufs);
-		}
-		else
-		{
-			// In this case, the capabilities will not show more than 1 simultaneaous render target.
-			glDrawBuffer(bufs[0]);
-		}
+		glDrawBuffers(n, bufs);
 
 		// No read buffer, by default, if we want to read anyway we must not forget to set this.
 		glReadBuffer(GL_NONE);
 
         // Check status
         GLuint status;
-        status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
+        status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
         
         // Bind main buffer
-        glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
+        glBindFramebuffer(GL_FRAMEBUFFER, 0);
         
         switch(status)
         {
-        case GL_FRAMEBUFFER_COMPLETE_EXT:
+        case GL_FRAMEBUFFER_COMPLETE:
             break;
-        case GL_FRAMEBUFFER_UNSUPPORTED_EXT:
+        case GL_FRAMEBUFFER_UNSUPPORTED:
             BS_EXCEPT(InvalidParametersException, "All framebuffer formats with this texture internal format unsupported");
         default:
             BS_EXCEPT(InvalidParametersException, "Framebuffer incomplete or other FBO status error");
@@ -156,6 +150,6 @@ namespace BansheeEngine
 
     void GLFrameBufferObject::bind()
     {
-		glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mFB);
+		glBindFramebuffer(GL_FRAMEBUFFER, mFB);
     }
 }

+ 11 - 11
BansheeGLRenderSystem/Source/BsGLPixelBuffer.cpp

@@ -326,20 +326,20 @@ namespace BansheeEngine
 		switch(mTarget)
 		{
 		case GL_TEXTURE_1D:
-			glFramebufferTexture1DEXT(GL_FRAMEBUFFER_EXT, attachment,
+			glFramebufferTexture1D(GL_FRAMEBUFFER, attachment,
 				mFaceTarget, mTextureID, mLevel);
 			break;
 		case GL_TEXTURE_2D:
 		case GL_TEXTURE_CUBE_MAP:
-			glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, attachment,
+			glFramebufferTexture2D(GL_FRAMEBUFFER, attachment,
 				mFaceTarget, mTextureID, mLevel);
 			break;
 		case GL_TEXTURE_2D_MULTISAMPLE:
-			glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, attachment,
+			glFramebufferTexture2D(GL_FRAMEBUFFER, attachment,
 				mFaceTarget, mTextureID, 0);
 			break;
 		case GL_TEXTURE_3D:
-			glFramebufferTexture3DEXT(GL_FRAMEBUFFER_EXT, attachment,
+			glFramebufferTexture3D(GL_FRAMEBUFFER, attachment,
 				mFaceTarget, mTextureID, mLevel, zoffset);
 			break;
 		}
@@ -420,31 +420,31 @@ namespace BansheeEngine
 		mRenderbufferID(0)
 	{
 		mGLInternalFormat = format;
-		glGenRenderbuffersEXT(1, &mRenderbufferID);
-		glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, mRenderbufferID);
+		glGenRenderbuffers(1, &mRenderbufferID);
+		glBindRenderbuffer(GL_RENDERBUFFER, mRenderbufferID);
     
 		/// Allocate storage for depth buffer
 		if (numSamples > 0)
 		{
-			glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, 
+			glRenderbufferStorageMultisample(GL_RENDERBUFFER, 
 				numSamples, format, width, height);
 		}
 		else
 		{
-			glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, format,
+			glRenderbufferStorage(GL_RENDERBUFFER, format,
 								width, height);
 		}
 	}
 
 	GLRenderBuffer::~GLRenderBuffer()
 	{
-		glDeleteRenderbuffersEXT(1, &mRenderbufferID);
+		glDeleteRenderbuffers(1, &mRenderbufferID);
 	}
 
 	void GLRenderBuffer::bindToFramebuffer(GLenum attachment, UINT32 zoffset)
 	{
 		assert(zoffset < mDepth);
-		glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, attachment,
-							GL_RENDERBUFFER_EXT, mRenderbufferID);
+		glFramebufferRenderbuffer(GL_FRAMEBUFFER, attachment,
+							GL_RENDERBUFFER, mRenderbufferID);
 	}
 };

+ 6 - 6
BansheeGLRenderSystem/Source/BsGLRenderSystem.cpp

@@ -808,7 +808,7 @@ namespace BansheeEngine
 		// Reset buffer write state
 		if (!mDepthWrite && (buffers & FBT_DEPTH))
 		{
-			glDepthMask( GL_FALSE );
+			glDepthMask(GL_FALSE);
 		}
 		if (colorMask && (buffers & FBT_COLOR))
 		{
@@ -1077,7 +1077,7 @@ namespace BansheeEngine
 		switch( mode )
 		{
 		case CULL_NONE:
-			glDisable( GL_CULL_FACE );
+			glDisable(GL_CULL_FACE);
 			return;
 		default:
 		case CULL_CLOCKWISE:
@@ -1088,8 +1088,8 @@ namespace BansheeEngine
 			break;
 		}
 
-		glEnable( GL_CULL_FACE );
-		glCullFace( cullMode );
+		glEnable(GL_CULL_FACE);
+		glCullFace(cullMode);
 	}
 
 	void GLRenderSystem::setDepthBufferCheckEnabled(bool enabled)
@@ -1108,8 +1108,8 @@ namespace BansheeEngine
 	void GLRenderSystem::setDepthBufferWriteEnabled(bool enabled)
 	{
 		GLboolean flag = enabled ? GL_TRUE : GL_FALSE;
-		glDepthMask( flag );  
-		// Store for reference in _beginFrame
+		glDepthMask(flag);  
+
 		mDepthWrite = enabled;
 	}
 

+ 43 - 44
BansheeGLRenderSystem/Source/BsGLRenderTexture.cpp

@@ -82,14 +82,14 @@ namespace BansheeEngine
     {
 		detectFBOFormats();
 		
-		glGenFramebuffersEXT(1, &mBlitReadFBO);
-		glGenFramebuffersEXT(1, &mBlitWriteFBO);
+		glGenFramebuffers(1, &mBlitReadFBO);
+		glGenFramebuffers(1, &mBlitWriteFBO);
     }
 
 	GLRTTManager::~GLRTTManager()
 	{
-		glDeleteFramebuffersEXT(1, &mBlitReadFBO);
-		glDeleteFramebuffersEXT(1, &mBlitWriteFBO);
+		glDeleteFramebuffers(1, &mBlitReadFBO);
+		glDeleteFramebuffers(1, &mBlitWriteFBO);
 	}
 
 	bool GLRTTManager::_tryFormat(GLenum depthFormat, GLenum stencilFormat)
@@ -100,57 +100,57 @@ namespace BansheeEngine
         if(depthFormat != GL_NONE)
         {
             // Generate depth renderbuffer
-            glGenRenderbuffersEXT(1, &depthRB);
+            glGenRenderbuffers(1, &depthRB);
 
             // Bind it to FBO
-            glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, depthRB);
+            glBindRenderbuffer(GL_RENDERBUFFER, depthRB);
             
             // Allocate storage for depth buffer
-            glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, depthFormat,
+            glRenderbufferStorage(GL_RENDERBUFFER, depthFormat,
                                 PROBE_SIZE, PROBE_SIZE);
             
             // Attach depth
-            glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
-                                    GL_RENDERBUFFER_EXT, depthRB);
+            glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
+                                    GL_RENDERBUFFER, depthRB);
         }
 
         if(stencilFormat != GL_NONE)
         {
             // Generate stencil renderbuffer
-            glGenRenderbuffersEXT(1, &stencilRB);
+            glGenRenderbuffers(1, &stencilRB);
 
             // Bind it to FBO
-            glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, stencilRB);
+            glBindRenderbuffer(GL_RENDERBUFFER, stencilRB);
             glGetError(); 
 
             // Allocate storage for stencil buffer
-            glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, stencilFormat,
+            glRenderbufferStorage(GL_RENDERBUFFER, stencilFormat,
                                 PROBE_SIZE, PROBE_SIZE); 
 
             if(glGetError() != GL_NO_ERROR)
                 failed = true;
 
             // Attach stencil
-            glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT,
-                            GL_RENDERBUFFER_EXT, stencilRB);
+            glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT,
+                            GL_RENDERBUFFER, stencilRB);
 
             if(glGetError() != GL_NO_ERROR)
                 failed = true;
         }
         
-        status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
+        status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
 
         // Detach and destroy
-        glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, 0);
-        glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, 0);
+        glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, 0);
+        glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, 0);
 
         if (depthRB)
-            glDeleteRenderbuffersEXT(1, &depthRB);
+            glDeleteRenderbuffers(1, &depthRB);
 
         if (stencilRB)
-            glDeleteRenderbuffersEXT(1, &stencilRB);
+            glDeleteRenderbuffers(1, &stencilRB);
         
-        return status == GL_FRAMEBUFFER_COMPLETE_EXT && !failed;
+        return status == GL_FRAMEBUFFER_COMPLETE && !failed;
     }
     
     bool GLRTTManager::_tryPackedFormat(GLenum packedFormat)
@@ -159,37 +159,37 @@ namespace BansheeEngine
         bool failed = false; // flag on GL errors
 
         // Generate renderbuffer
-        glGenRenderbuffersEXT(1, &packedRB);
+        glGenRenderbuffers(1, &packedRB);
 
         // Bind it to FBO
-        glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, packedRB);
+        glBindRenderbuffer(GL_RENDERBUFFER, packedRB);
 
         // Allocate storage for buffer
-        glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, packedFormat, PROBE_SIZE, PROBE_SIZE);
+        glRenderbufferStorage(GL_RENDERBUFFER, packedFormat, PROBE_SIZE, PROBE_SIZE);
         glGetError();
 
         // Attach depth
-        glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
-            GL_RENDERBUFFER_EXT, packedRB);
+        glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
+            GL_RENDERBUFFER, packedRB);
 
         if(glGetError() != GL_NO_ERROR)
             failed = true;
 
         // Attach stencil
-        glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT,
-            GL_RENDERBUFFER_EXT, packedRB);
+        glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT,
+            GL_RENDERBUFFER, packedRB);
 
         if(glGetError() != GL_NO_ERROR)
             failed = true;
 
-        GLuint status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
+        GLuint status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
 
         // Detach and destroy
-        glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, 0);
-        glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, 0);
-        glDeleteRenderbuffersEXT(1, &packedRB);
+        glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, 0);
+        glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, 0);
+        glDeleteRenderbuffers(1, &packedRB);
 
-        return status == GL_FRAMEBUFFER_COMPLETE_EXT && !failed;
+        return status == GL_FRAMEBUFFER_COMPLETE && !failed;
     }
 
     void GLRTTManager::detectFBOFormats()
@@ -216,8 +216,8 @@ namespace BansheeEngine
 				continue;
 
             // Create and attach framebuffer
-            glGenFramebuffersEXT(1, &fb);
-            glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fb);
+            glGenFramebuffers(1, &fb);
+            glBindFramebuffer(GL_FRAMEBUFFER, fb);
             if (fmt!=GL_NONE && !PixelUtil::isDepth((PixelFormat)x))
             {
 				// Create and attach texture
@@ -233,8 +233,7 @@ namespace BansheeEngine
                 glTexParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
                             
 				glTexImage2D(target, 0, fmt, PROBE_SIZE, PROBE_SIZE, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
-				glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
-                                target, tid, 0);
+				glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, target, tid, 0);
             }
 			else
 			{
@@ -244,19 +243,19 @@ namespace BansheeEngine
 			}
 
             // Check status
-            GLuint status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
+            GLuint status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
 
 			// Ignore status in case of fmt==GL_NONE, because no implementation will accept
 			// a buffer without *any* attachment. Buffers with only stencil and depth attachment
 			// might still be supported, so we must continue probing.
-            if(fmt == GL_NONE || status == GL_FRAMEBUFFER_COMPLETE_EXT)
+            if(fmt == GL_NONE || status == GL_FRAMEBUFFER_COMPLETE)
             {
                 mProps[x].valid = true;
 
                 // For each depth/stencil formats
                 for (UINT32 depth = 0; depth < DEPTHFORMAT_COUNT; ++depth)
                 {
-                    if (depthFormats[depth] != GL_DEPTH24_STENCIL8_EXT && depthFormats[depth] != GL_DEPTH32F_STENCIL8)
+                    if (depthFormats[depth] != GL_DEPTH24_STENCIL8 && depthFormats[depth] != GL_DEPTH32F_STENCIL8)
                     {
                         if (_tryFormat(depthFormats[depth], GL_NONE))
                         {
@@ -283,22 +282,22 @@ namespace BansheeEngine
             }
 
             // Delete texture and framebuffer
-            glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
-            glDeleteFramebuffersEXT(1, &fb);
+            glBindFramebuffer(GL_FRAMEBUFFER, 0);
+            glDeleteFramebuffers(1, &fb);
 			
 			glFinish();
 			
-            if (fmt!=GL_NONE)
+            if (fmt != GL_NONE)
                 glDeleteTextures(1, &tid);
         }
 
-        // It seems a bug in nVidia driver: glBindFramebufferEXT should restore
+        // It seems a bug in nVidia driver: glBindFramebuffer should restore
         // draw and read buffers, but in some unclear circumstances it won't.
         glDrawBuffer(old_drawbuffer);
         glReadBuffer(old_readbuffer);
 
 		String fmtstring = "";
-        for(size_t x=0; x<PF_COUNT; ++x)
+        for(size_t x = 0; x < PF_COUNT; ++x)
         {
             if(mProps[x].valid)
                 fmtstring += PixelUtil::getFormatName((PixelFormat)x)+" ";