Browse Source

Multisampled texture without autoresolve on OpenGL.

Lasse Öörni 9 years ago
parent
commit
f6ce114830

+ 2 - 2
Source/Urho3D/Graphics/OpenGL/OGLGraphics.cpp

@@ -3248,7 +3248,7 @@ void Graphics::BindColorAttachment(unsigned index, unsigned target, unsigned obj
     if (!gl3Support)
     if (!gl3Support)
     {
     {
         if (!isRenderBuffer)
         if (!isRenderBuffer)
-            glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT + index, GL_TEXTURE_2D, object, 0);
+            glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT + index, target, object, 0);
         else
         else
             glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT + index, GL_RENDERBUFFER_EXT, object);
             glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT + index, GL_RENDERBUFFER_EXT, object);
     }
     }
@@ -3256,7 +3256,7 @@ void Graphics::BindColorAttachment(unsigned index, unsigned target, unsigned obj
 #endif
 #endif
     {
     {
         if (!isRenderBuffer)
         if (!isRenderBuffer)
-            glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + index, GL_TEXTURE_2D, object, 0);
+            glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + index, target, object, 0);
         else
         else
             glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + index, GL_RENDERBUFFER, object);
             glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + index, GL_RENDERBUFFER, object);
     }
     }

+ 24 - 7
Source/Urho3D/Graphics/OpenGL/OGLRenderSurface.cpp

@@ -59,18 +59,35 @@ bool RenderSurface::CreateRenderBuffer(unsigned width, unsigned height, unsigned
 
 
     Release();
     Release();
 
 
+#ifdef GL_ES_VERSION_2_0
     glGenRenderbuffersEXT(1, &renderBuffer_);
     glGenRenderbuffersEXT(1, &renderBuffer_);
     glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, renderBuffer_);
     glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, renderBuffer_);
-
     /// \todo Multisampled renderbuffer on GLES
     /// \todo Multisampled renderbuffer on GLES
-#ifndef GL_ES_VERSION_2_0
-    if (multiSample > 1)
-        glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, multiSample, format, width, height);
-    else
-#endif
     glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, format, width, height);
     glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, format, width, height);
-    
     glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);
     glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);
+#else
+    if (Graphics::GetGL3Support())
+    {
+        glGenRenderbuffers(1, &renderBuffer_);
+        glBindRenderbuffer(GL_RENDERBUFFER, renderBuffer_);
+        if (multiSample > 1)
+            glRenderbufferStorageMultisample(GL_RENDERBUFFER, multiSample, format, width, height);
+        else
+            glRenderbufferStorage(GL_RENDERBUFFER, format, width, height);
+        glBindRenderbuffer(GL_RENDERBUFFER, 0);
+    }
+    else
+    {
+        glGenRenderbuffersEXT(1, &renderBuffer_);
+        glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, renderBuffer_);
+        if (multiSample > 1)
+            glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, multiSample, format, width, height);
+        else
+            glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, format, width, height);
+        glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);
+    }
+#endif
+
     return true;
     return true;
 }
 }
 
 

+ 9 - 0
Source/Urho3D/Graphics/OpenGL/OGLTexture.cpp

@@ -89,6 +89,15 @@ void Texture::UpdateParameters()
     if (!object_.name_ || !graphics_)
     if (!object_.name_ || !graphics_)
         return;
         return;
 
 
+    // If texture is multisampled, do not attempt to set parameters as it's illegal, just return
+#ifndef GL_ES_VERSION_2_0
+    if (target_ == GL_TEXTURE_2D_MULTISAMPLE)
+    {
+        parametersDirty_ = false;
+        return;
+    }
+#endif
+
     // Wrapping
     // Wrapping
     glTexParameteri(target_, GL_TEXTURE_WRAP_S, GetWrapMode(addressMode_[COORD_U]));
     glTexParameteri(target_, GL_TEXTURE_WRAP_S, GetWrapMode(addressMode_[COORD_U]));
     glTexParameteri(target_, GL_TEXTURE_WRAP_T, GetWrapMode(addressMode_[COORD_V]));
     glTexParameteri(target_, GL_TEXTURE_WRAP_T, GetWrapMode(addressMode_[COORD_V]));

+ 30 - 3
Source/Urho3D/Graphics/OpenGL/OGLTexture2D.cpp

@@ -385,9 +385,30 @@ bool Texture2D::Create()
     }
     }
     else
     else
     {
     {
-        // Multisample with autoresolve: create a renderbuffer for rendering, but also a texture
-        if (multiSample_ > 1 && autoResolve_)
-            renderSurface_->CreateRenderBuffer(width_, height_, format, multiSample_);
+        if (multiSample_ > 1)
+        {
+            if (autoResolve_)
+            {
+                // Multisample with autoresolve: create a renderbuffer for rendering, but also a texture
+                renderSurface_->CreateRenderBuffer(width_, height_, format, multiSample_);
+            }
+            else
+            {
+                // Multisample without autoresolve: create a texture only
+                /// \todo Check corresponding GLES extension
+#ifndef GL_ES_VERSION_2_0
+                if (!Graphics::GetGL3Support() && !GLEW_ARB_texture_multisample)
+                {
+                    URHO3D_LOGERROR("Multisampled texture extension not available");
+                    return false;
+                }
+
+                target_ = GL_TEXTURE_2D_MULTISAMPLE;
+                if (renderSurface_)
+                    renderSurface_->target_ = GL_TEXTURE_2D_MULTISAMPLE;
+#endif
+            }
+        }
     }
     }
 
 
     glGenTextures(1, &object_.name_);
     glGenTextures(1, &object_.name_);
@@ -401,6 +422,12 @@ bool Texture2D::Create()
     if (!IsCompressed())
     if (!IsCompressed())
     {
     {
         glGetError();
         glGetError();
+        /// \todo Multisampled texture on GLES
+#ifndef GL_ES_VERSION_2_0
+        if (multiSample_ > 1 && !autoResolve_)
+            glTexImage2DMultisample(target_, multiSample_, format, width_, height_, GL_TRUE);
+        else
+#endif
         glTexImage2D(target_, 0, format, width_, height_, 0, externalFormat, dataType, 0);
         glTexImage2D(target_, 0, format, width_, height_, 0, externalFormat, dataType, 0);
         if (glGetError())
         if (glGetError())
         {
         {