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