I need to save the alpha channel to images rendered using OpenSG (1.8 recent cvs). I'm using a FileGrabForeground and it works fine with a normal Viewport.

However I've found that it doesn't work with a ShadowViewport because the alpha channel is overwritten with 1. ShadowViewport::setAlpha(false) doesn't work.

Looking at the code, the simplest solution is to use glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_FALSE) around the drawCombineMap() and createShadowFactorMap() functions. However this doesn't work if USE_FBO_FOR_COLOR_AND_FACTOR_MAP is defined, and for me using FBOs is a win for performance.

So instead I changed the color map texture from GL_RGB to GL_RGBA and modified the shadow_combine shader to pass through the alpha instead of overwriting it.

I tested with the 5 different tree renderers with and without USE_FBO_FOR_COLOR_AND_FACTOR_MAP and it works. I've attached a patch in case others run across this issue. Apply in Source/Experimental/ShadowViewport.

? cvs.diff
Index: OSGDitherShadowMap.cpp
===================================================================
RCS file: /cvsroot/opensg/OpenSG/Source/Experimental/ShadowViewport/OSGDitherShadowMap.cpp,v
retrieving revision 1.42
diff -u -r1.42 OSGDitherShadowMap.cpp
--- OSGDitherShadowMap.cpp	7 Dec 2008 20:28:19 -0000	1.42
+++ OSGDitherShadowMap.cpp	10 Nov 2009 23:49:00 -0000
@@ -27,6 +27,7 @@
 #include "OSGTreeRenderer.h"
 
 //#define USE_FBO_FOR_COLOR_AND_FACTOR_MAP
+#define COLORMAP_FORMAT GL_RGBA
 
 //--------------------------------------------------------------------
 #ifndef GL_CLAMP_TO_EDGE
@@ -651,8 +652,8 @@
 
     beginEditCP(_colorMap);
     _colorMap->setImage(_colorMapImage);
-    _colorMap->setInternalFormat(GL_RGB);
-    _colorMap->setExternalFormat(GL_RGB);
+    _colorMap->setInternalFormat(COLORMAP_FORMAT);
+    _colorMap->setExternalFormat(COLORMAP_FORMAT);
     _colorMap->setMinFilter(GL_NEAREST);
     _colorMap->setMagFilter(GL_NEAREST);
     _colorMap->setWrapS(GL_REPEAT);
@@ -663,13 +664,13 @@
     if(_useNPOTTextures)
     {
         beginEditCP(_colorMapImage);
-        _colorMapImage->set(GL_RGB, _width, _height);
+        _colorMapImage->set(COLORMAP_FORMAT, _width, _height);
         endEditCP(_colorMapImage);
     }
     else
     {
         beginEditCP(_colorMapImage);
-        _colorMapImage->set(GL_RGB, _widthHeightPOT, _widthHeightPOT);
+        _colorMapImage->set(COLORMAP_FORMAT, _widthHeightPOT, _widthHeightPOT);
         endEditCP(_colorMapImage);
     }
 
@@ -1078,7 +1079,7 @@
 
         beginEditCP(_colorMap);
         beginEditCP(_colorMapImage);
-        _colorMapImage->set(GL_RGB, _widthHeightPOT, _widthHeightPOT);
+        _colorMapImage->set(COLORMAP_FORMAT, _widthHeightPOT, _widthHeightPOT);
         endEditCP(_colorMapImage);
         endEditCP(_colorMap);
 
@@ -2905,7 +2906,7 @@
             {
                 beginEditCP(_colorMap);
                 beginEditCP(_colorMapImage);
-                _colorMapImage->set(GL_RGB, _width, _height);
+                _colorMapImage->set(COLORMAP_FORMAT, _width, _height);
                 endEditCP(_colorMapImage);
                 endEditCP(_colorMap);
 
@@ -2932,7 +2933,7 @@
 
                 beginEditCP(_colorMap);
                 beginEditCP(_colorMapImage);
-                _colorMapImage->set(GL_RGB, _widthHeightPOT, _widthHeightPOT);
+                _colorMapImage->set(COLORMAP_FORMAT, _widthHeightPOT, _widthHeightPOT);
                 endEditCP(_colorMapImage);
                 endEditCP(_colorMap);
 
Index: OSGPCFShadowMap.cpp
===================================================================
RCS file: /cvsroot/opensg/OpenSG/Source/Experimental/ShadowViewport/OSGPCFShadowMap.cpp,v
retrieving revision 1.57
diff -u -r1.57 OSGPCFShadowMap.cpp
--- OSGPCFShadowMap.cpp	7 Dec 2008 20:28:20 -0000	1.57
+++ OSGPCFShadowMap.cpp	10 Nov 2009 23:49:04 -0000
@@ -26,6 +26,7 @@
 #include "OSGTreeRenderer.h"
 
 //#define USE_FBO_FOR_COLOR_AND_FACTOR_MAP
+#define COLORMAP_FORMAT GL_RGBA
 
 //--------------------------------------------------------------------
 #ifndef GL_CLAMP_TO_EDGE
@@ -2527,8 +2528,8 @@
 
     beginEditCP(_colorMap);
     _colorMap->setImage(_colorMapImage);
-    _colorMap->setInternalFormat(GL_RGB);
-    _colorMap->setExternalFormat(GL_RGB);
+    _colorMap->setInternalFormat(COLORMAP_FORMAT);
+    _colorMap->setExternalFormat(COLORMAP_FORMAT);
     _colorMap->setMinFilter(GL_NEAREST);
     _colorMap->setMagFilter(GL_NEAREST);
     _colorMap->setWrapS(GL_REPEAT);
@@ -2539,13 +2540,13 @@
     if(_useNPOTTextures)
     {
         beginEditCP(_colorMapImage);
-        _colorMapImage->set(GL_RGB, _width, _height);
+        _colorMapImage->set(COLORMAP_FORMAT, _width, _height);
         endEditCP(_colorMapImage);
     }
     else
     {
         beginEditCP(_colorMapImage);
-        _colorMapImage->set(GL_RGB, _widthHeightPOT, _widthHeightPOT);
+        _colorMapImage->set(COLORMAP_FORMAT, _widthHeightPOT, _widthHeightPOT);
         endEditCP(_colorMapImage);
     }
 
@@ -3105,7 +3106,7 @@
 
         beginEditCP(_colorMap);
         beginEditCP(_colorMapImage);
-        _colorMapImage->set(GL_RGB, _widthHeightPOT, _widthHeightPOT);
+        _colorMapImage->set(COLORMAP_FORMAT, _widthHeightPOT, _widthHeightPOT);
         endEditCP(_colorMapImage);
         endEditCP(_colorMap);
 
@@ -4966,7 +4967,7 @@
             {
                 beginEditCP(_colorMap);
                 beginEditCP(_colorMapImage);
-                _colorMapImage->set(GL_RGB, _width, _height);
+                _colorMapImage->set(COLORMAP_FORMAT, _width, _height);
                 endEditCP(_colorMapImage);
                 endEditCP(_colorMap);
 
@@ -4993,7 +4994,7 @@
 
                 beginEditCP(_colorMap);
                 beginEditCP(_colorMapImage);
-                _colorMapImage->set(GL_RGB, _widthHeightPOT, _widthHeightPOT);
+                _colorMapImage->set(COLORMAP_FORMAT, _widthHeightPOT, _widthHeightPOT);
                 endEditCP(_colorMapImage);
                 endEditCP(_colorMap);
 
Index: OSGPCSSShadowMap.cpp
===================================================================
RCS file: /cvsroot/opensg/OpenSG/Source/Experimental/ShadowViewport/OSGPCSSShadowMap.cpp,v
retrieving revision 1.35
diff -u -r1.35 OSGPCSSShadowMap.cpp
--- OSGPCSSShadowMap.cpp	7 Dec 2008 20:28:20 -0000	1.35
+++ OSGPCSSShadowMap.cpp	10 Nov 2009 23:49:04 -0000
@@ -25,6 +25,7 @@
 #include "OSGTreeRenderer.h"
 
 //#define USE_FBO_FOR_COLOR_AND_FACTOR_MAP
+#define COLORMAP_FORMAT GL_RGBA
 
 //--------------------------------------------------------------------
 #ifndef GL_CLAMP_TO_EDGE
@@ -319,8 +320,8 @@
 
     beginEditCP(_colorMap);
     _colorMap->setImage(_colorMapImage);
-    _colorMap->setInternalFormat(GL_RGB);
-    _colorMap->setExternalFormat(GL_RGB);
+    _colorMap->setInternalFormat(COLORMAP_FORMAT);
+    _colorMap->setExternalFormat(COLORMAP_FORMAT);
     _colorMap->setMinFilter(GL_NEAREST);
     _colorMap->setMagFilter(GL_NEAREST);
     _colorMap->setWrapS(GL_REPEAT);
@@ -331,13 +332,13 @@
     if(_useNPOTTextures)
     {
         beginEditCP(_colorMapImage);
-        _colorMapImage->set(GL_RGB, _width, _height);
+        _colorMapImage->set(COLORMAP_FORMAT, _width, _height);
         endEditCP(_colorMapImage);
     }
     else
     {
         beginEditCP(_colorMapImage);
-        _colorMapImage->set(GL_RGB, _widthHeightPOT, _widthHeightPOT);
+        _colorMapImage->set(COLORMAP_FORMAT, _widthHeightPOT, _widthHeightPOT);
         endEditCP(_colorMapImage);
     }
 
@@ -632,7 +633,7 @@
 
         beginEditCP(_colorMap);
         beginEditCP(_colorMapImage);
-        _colorMapImage->set(GL_RGB, _widthHeightPOT, _widthHeightPOT);
+        _colorMapImage->set(COLORMAP_FORMAT, _widthHeightPOT, _widthHeightPOT);
         endEditCP(_colorMapImage);
         endEditCP(_colorMap);
 
@@ -1279,7 +1280,7 @@
             {
                 beginEditCP(_colorMap);
                 beginEditCP(_colorMapImage);
-                _colorMapImage->set(GL_RGB, _width, _height);
+                _colorMapImage->set(COLORMAP_FORMAT, _width, _height);
                 endEditCP(_colorMapImage);
                 endEditCP(_colorMap);
 
@@ -1300,7 +1301,7 @@
 
                 beginEditCP(_colorMap);
                 beginEditCP(_colorMapImage);
-                _colorMapImage->set(GL_RGB, _widthHeightPOT, _widthHeightPOT);
+                _colorMapImage->set(COLORMAP_FORMAT, _widthHeightPOT, _widthHeightPOT);
                 endEditCP(_colorMapImage);
                 endEditCP(_colorMap);
 
Index: OSGPerspectiveShadowMap.cpp
===================================================================
RCS file: /cvsroot/opensg/OpenSG/Source/Experimental/ShadowViewport/OSGPerspectiveShadowMap.cpp,v
retrieving revision 1.45
diff -u -r1.45 OSGPerspectiveShadowMap.cpp
--- OSGPerspectiveShadowMap.cpp	7 Dec 2008 20:28:20 -0000	1.45
+++ OSGPerspectiveShadowMap.cpp	10 Nov 2009 23:49:05 -0000
@@ -25,6 +25,7 @@
 #include "OSGTreeRenderer.h"
 
 //#define USE_FBO_FOR_COLOR_AND_FACTOR_MAP
+#define COLORMAP_FORMAT GL_RGBA
 
 //--------------------------------------------------------------------
 #ifndef GL_CLAMP_TO_EDGE
@@ -806,8 +807,8 @@
 
     beginEditCP(_colorMap);
     _colorMap->setImage(_colorMapImage);
-    _colorMap->setInternalFormat(GL_RGB);
-    _colorMap->setExternalFormat(GL_RGB);
+    _colorMap->setInternalFormat(COLORMAP_FORMAT);
+    _colorMap->setExternalFormat(COLORMAP_FORMAT);
     _colorMap->setMinFilter(GL_NEAREST);
     _colorMap->setMagFilter(GL_NEAREST);
     _colorMap->setWrapS(GL_REPEAT);
@@ -818,13 +819,13 @@
     if(_useNPOTTextures)
     {
         beginEditCP(_colorMapImage);
-        _colorMapImage->set(GL_RGB, _width, _height);
+        _colorMapImage->set(COLORMAP_FORMAT, _width, _height);
         endEditCP(_colorMapImage);
     }
     else
     {
         beginEditCP(_colorMapImage);
-        _colorMapImage->set(GL_RGB, _widthHeightPOT, _widthHeightPOT);
+        _colorMapImage->set(COLORMAP_FORMAT, _widthHeightPOT, _widthHeightPOT);
         endEditCP(_colorMapImage);
     }
 
@@ -1264,7 +1265,7 @@
 
         beginEditCP(_colorMap);
         beginEditCP(_colorMapImage);
-        _colorMapImage->set(GL_RGB, _widthHeightPOT, _widthHeightPOT);
+        _colorMapImage->set(COLORMAP_FORMAT, _widthHeightPOT, _widthHeightPOT);
         endEditCP(_colorMapImage);
         endEditCP(_colorMap);
 
@@ -4349,7 +4350,7 @@
                 {
                     beginEditCP(_colorMap);
                     beginEditCP(_colorMapImage);
-                    _colorMapImage->set(GL_RGB, _width, _height);
+                    _colorMapImage->set(COLORMAP_FORMAT, _width, _height);
                     endEditCP(_colorMapImage);
                     endEditCP(_colorMap);
 
@@ -4376,7 +4377,7 @@
 	
                     beginEditCP(_colorMap);
                     beginEditCP(_colorMapImage);
-                    _colorMapImage->set(GL_RGB, _widthHeightPOT,
+                    _colorMapImage->set(COLORMAP_FORMAT, _widthHeightPOT,
                                         _widthHeightPOT);
                     endEditCP(_colorMapImage);
                     endEditCP(_colorMap);
Index: OSGStdShadowMap.cpp
===================================================================
RCS file: /cvsroot/opensg/OpenSG/Source/Experimental/ShadowViewport/OSGStdShadowMap.cpp,v
retrieving revision 1.43
diff -u -r1.43 OSGStdShadowMap.cpp
--- OSGStdShadowMap.cpp	7 Dec 2008 20:28:20 -0000	1.43
+++ OSGStdShadowMap.cpp	10 Nov 2009 23:49:07 -0000
@@ -26,6 +26,7 @@
 #include "OSGTreeRenderer.h"
 
 //#define USE_FBO_FOR_COLOR_AND_FACTOR_MAP
+#define COLORMAP_FORMAT GL_RGBA
 
 //--------------------------------------------------------------------
 #ifndef GL_CLAMP_TO_EDGE
@@ -849,8 +850,8 @@
 
     beginEditCP(_colorMap);
     _colorMap->setImage(_colorMapImage);
-    _colorMap->setInternalFormat(GL_RGB);
-    _colorMap->setExternalFormat(GL_RGB);
+    _colorMap->setInternalFormat(COLORMAP_FORMAT);
+    _colorMap->setExternalFormat(COLORMAP_FORMAT);
     _colorMap->setMinFilter(GL_NEAREST);
     _colorMap->setMagFilter(GL_NEAREST);
     _colorMap->setWrapS(GL_REPEAT);
@@ -861,13 +862,13 @@
     if(_useNPOTTextures)
     {
         beginEditCP(_colorMapImage);
-        _colorMapImage->set(GL_RGB, _width, _height);
+        _colorMapImage->set(COLORMAP_FORMAT, _width, _height);
         endEditCP(_colorMapImage);
     }
     else
     {
         beginEditCP(_colorMapImage);
-        _colorMapImage->set(GL_RGB, _widthHeightPOT, _widthHeightPOT);
+        _colorMapImage->set(COLORMAP_FORMAT, _widthHeightPOT, _widthHeightPOT);
         endEditCP(_colorMapImage);
     }
 
@@ -1302,7 +1303,7 @@
 
         beginEditCP(_colorMap);
         beginEditCP(_colorMapImage);
-        _colorMapImage->set(GL_RGB, _widthHeightPOT, _widthHeightPOT);
+        _colorMapImage->set(COLORMAP_FORMAT, _widthHeightPOT, _widthHeightPOT);
         endEditCP(_colorMapImage);
         endEditCP(_colorMap);
 
@@ -3863,7 +3864,7 @@
                 {
                     beginEditCP(_colorMap);
                     beginEditCP(_colorMapImage);
-                    _colorMapImage->set(GL_RGB, _width, _height);
+                    _colorMapImage->set(COLORMAP_FORMAT, _width, _height);
                     endEditCP(_colorMapImage);
                     endEditCP(_colorMap);
 
@@ -3890,7 +3891,7 @@
 
                     beginEditCP(_colorMap);
                     beginEditCP(_colorMapImage);
-                    _colorMapImage->set(GL_RGB, _widthHeightPOT,
+                    _colorMapImage->set(COLORMAP_FORMAT, _widthHeightPOT,
                                         _widthHeightPOT);
                     endEditCP(_colorMapImage);
                     endEditCP(_colorMap);
Index: OSGTreeRenderer.cpp
===================================================================
RCS file: /cvsroot/opensg/OpenSG/Source/Experimental/ShadowViewport/OSGTreeRenderer.cpp,v
retrieving revision 1.20
diff -u -r1.20 OSGTreeRenderer.cpp
--- OSGTreeRenderer.cpp	10 Jun 2008 05:52:18 -0000	1.20
+++ OSGTreeRenderer.cpp	10 Nov 2009 23:49:07 -0000
@@ -113,9 +113,9 @@
     "void main(void)\n"
     "{\n"
     "    vec2 tc = texCoord * vec2(xFactor, yFactor);\n"
-    "    vec3 color = texture2D(colorMap, tc).rgb;\n"
-    "    color *= hasFactorMap ? (1.0 - texture2D(shadowFactorMap, tc).r) : 1.0;\n"
-    "    gl_FragColor = vec4(color, 1.0);\n"
+    "    vec4 color = texture2D(colorMap, tc);\n"
+    "    color.rgb *= hasFactorMap ? (1.0 - texture2D(shadowFactorMap, tc).r) : 1.0;\n"
+    "    gl_FragColor = color;\n"
     "}\n";
 
 TreeRenderer::TreeRenderer(ShadowViewport *source) :
Index: OSGVarianceShadowMap.cpp
===================================================================
RCS file: /cvsroot/opensg/OpenSG/Source/Experimental/ShadowViewport/OSGVarianceShadowMap.cpp,v
retrieving revision 1.27
diff -u -r1.27 OSGVarianceShadowMap.cpp
--- OSGVarianceShadowMap.cpp	7 Dec 2008 20:28:20 -0000	1.27
+++ OSGVarianceShadowMap.cpp	10 Nov 2009 23:49:07 -0000
@@ -30,7 +30,7 @@
 #include "OSGTreeRenderer.h"
 
 //#define USE_FBO_FOR_COLOR_AND_FACTOR_MAP
-
+#define COLORMAP_FORMAT GL_RGBA
 
 //--------------------------------------------------------------------
 #ifndef GL_CLAMP_TO_EDGE
@@ -319,8 +319,8 @@
 
     beginEditCP(_colorMap);
     _colorMap->setImage(_colorMapImage);
-    _colorMap->setInternalFormat(GL_RGB);
-    _colorMap->setExternalFormat(GL_RGB);
+    _colorMap->setInternalFormat(COLORMAP_FORMAT);
+    _colorMap->setExternalFormat(COLORMAP_FORMAT);
     _colorMap->setMinFilter(GL_NEAREST);
     _colorMap->setMagFilter(GL_NEAREST);
     _colorMap->setWrapS(GL_REPEAT);
@@ -332,13 +332,13 @@
     if(_useNPOTTextures)
     {
         beginEditCP(_colorMapImage);
-        _colorMapImage->set(GL_RGB, _width, _height);
+        _colorMapImage->set(COLORMAP_FORMAT, _width, _height);
         endEditCP(_colorMapImage);
     }
     else
     {
         beginEditCP(_colorMapImage);
-        _colorMapImage->set(GL_RGB, _widthHeightPOT, _widthHeightPOT);
+        _colorMapImage->set(COLORMAP_FORMAT, _widthHeightPOT, _widthHeightPOT);
         endEditCP(_colorMapImage);
     }
 
@@ -702,7 +702,7 @@
 
         beginEditCP(_colorMap);
         beginEditCP(_colorMapImage);
-        _colorMapImage->set(GL_RGB, _widthHeightPOT, _widthHeightPOT);
+        _colorMapImage->set(COLORMAP_FORMAT, _widthHeightPOT, _widthHeightPOT);
         endEditCP(_colorMapImage);
         endEditCP(_colorMap);
 
@@ -1401,7 +1401,7 @@
             {
                 beginEditCP(_colorMap);
                 beginEditCP(_colorMapImage);
-                _colorMapImage->set(GL_RGB, _width, _height);
+                _colorMapImage->set(COLORMAP_FORMAT, _width, _height);
                 endEditCP(_colorMapImage);
                 endEditCP(_colorMap);
 
@@ -1422,7 +1422,7 @@
 
                 beginEditCP(_colorMap);
                 beginEditCP(_colorMapImage);
-                _colorMapImage->set(GL_RGB, _widthHeightPOT, _widthHeightPOT);
+                _colorMapImage->set(COLORMAP_FORMAT, _widthHeightPOT, _widthHeightPOT);
                 endEditCP(_colorMapImage);
                 endEditCP(_colorMap);
 
------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
_______________________________________________
Opensg-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensg-users

Reply via email to