Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
OpenWalnut Core
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
44
Issues
44
List
Boards
Labels
Service Desk
Milestones
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
OpenWalnut
OpenWalnut Core
Commits
17b634c4
Commit
17b634c4
authored
Dec 15, 2011
by
Sebastian Eichelbaum
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[ADD] - added GLSL code injector and MRSSAO and ...
parent
c9df513a
Changes
15
Hide whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
760 additions
and
45 deletions
+760
-45
src/core/graphicsEngine/postprocessing/WGEPostprocessor.cpp
src/core/graphicsEngine/postprocessing/WGEPostprocessor.cpp
+52
-4
src/core/graphicsEngine/postprocessing/WGEPostprocessor.h
src/core/graphicsEngine/postprocessing/WGEPostprocessor.h
+40
-3
src/core/graphicsEngine/postprocessing/WGEPostprocessorCelShading.cpp
...phicsEngine/postprocessing/WGEPostprocessorCelShading.cpp
+1
-1
src/core/graphicsEngine/postprocessing/WGEPostprocessorEdgeEnhance.cpp
...hicsEngine/postprocessing/WGEPostprocessorEdgeEnhance.cpp
+1
-1
src/core/graphicsEngine/postprocessing/WGEPostprocessorGauss.cpp
...e/graphicsEngine/postprocessing/WGEPostprocessorGauss.cpp
+9
-15
src/core/graphicsEngine/postprocessing/WGEPostprocessorGauss.h
...ore/graphicsEngine/postprocessing/WGEPostprocessorGauss.h
+2
-12
src/core/graphicsEngine/postprocessing/WGEPostprocessorLineAO.cpp
.../graphicsEngine/postprocessing/WGEPostprocessorLineAO.cpp
+1
-1
src/core/graphicsEngine/postprocessing/WGEPostprocessorMRSSAO.cpp
.../graphicsEngine/postprocessing/WGEPostprocessorMRSSAO.cpp
+123
-0
src/core/graphicsEngine/postprocessing/WGEPostprocessorMRSSAO.h
...re/graphicsEngine/postprocessing/WGEPostprocessorMRSSAO.h
+78
-0
src/core/graphicsEngine/postprocessing/WGEPostprocessorMergeOp.cpp
...graphicsEngine/postprocessing/WGEPostprocessorMergeOp.cpp
+129
-0
src/core/graphicsEngine/postprocessing/WGEPostprocessorMergeOp.h
...e/graphicsEngine/postprocessing/WGEPostprocessorMergeOp.h
+117
-0
src/core/graphicsEngine/postprocessing/WGEPostprocessorSSAO.cpp
...re/graphicsEngine/postprocessing/WGEPostprocessorSSAO.cpp
+1
-1
src/core/graphicsEngine/shaders/WGEShaderCodeInjector.cpp
src/core/graphicsEngine/shaders/WGEShaderCodeInjector.cpp
+78
-0
src/core/graphicsEngine/shaders/WGEShaderCodeInjector.h
src/core/graphicsEngine/shaders/WGEShaderCodeInjector.h
+92
-0
src/core/graphicsEngine/shaders/shaders/WGEPostprocessor-fragment.glsl
...hicsEngine/shaders/shaders/WGEPostprocessor-fragment.glsl
+36
-7
No files found.
src/core/graphicsEngine/postprocessing/WGEPostprocessor.cpp
View file @
17b634c4
...
...
@@ -28,20 +28,21 @@
#include "WGEPostprocessorCelShading.h"
#include "WGEPostprocessorGauss.h"
#include "WGEPostprocessorSSAO.h"
#include "WGEPostprocessorMRSSAO.h"
#include "WGEPostprocessorLineAO.h"
#include "WGEPostprocessor.h"
WGEPostprocessor
::
WGEPostprocessor
(
std
::
string
name
,
std
::
string
description
)
:
WPrototyped
(),
m_resultTexture
(),
m_resultTexture
s
(),
m_depthTexture
(),
m_properties
(
boost
::
shared_ptr
<
WProperties
>
(
new
WProperties
(
"Settings for "
+
name
,
"Post-processing properties"
)
)
),
m_name
(
name
),
m_description
(
description
)
{
// there is always one property:
m_effectOnly
=
m_properties
->
addProperty
(
"Effect
o
nly"
,
"If active, the plain effect will be shown instead a combination of effect "
m_effectOnly
=
m_properties
->
addProperty
(
"Effect
O
nly"
,
"If active, the plain effect will be shown instead a combination of effect "
"and color. This settings does not affect all postprocessors."
,
false
);
// for convenience, also create a preprocessor for this property
...
...
@@ -59,9 +60,14 @@ WPropGroup WGEPostprocessor::getProperties() const
return
m_properties
;
}
osg
::
ref_ptr
<
osg
::
Texture2D
>
WGEPostprocessor
::
getOutput
()
const
osg
::
ref_ptr
<
osg
::
Texture2D
>
WGEPostprocessor
::
getOutput
(
size_t
idx
)
const
{
return
m_resultTexture
;
return
m_resultTextures
[
idx
];
}
const
std
::
vector
<
osg
::
ref_ptr
<
osg
::
Texture2D
>
>&
WGEPostprocessor
::
getOutputList
()
const
{
return
m_resultTextures
;
}
osg
::
ref_ptr
<
osg
::
Texture2D
>
WGEPostprocessor
::
getDepth
()
const
...
...
@@ -69,6 +75,47 @@ osg::ref_ptr< osg::Texture2D > WGEPostprocessor::getDepth() const
return
m_depthTexture
;
}
WGEPostprocessor
::
PostprocessorInput
::
PostprocessorInput
()
{
// leave them uni-initialized
}
WGEPostprocessor
::
PostprocessorInput
::
PostprocessorInput
(
std
::
vector
<
osg
::
ref_ptr
<
osg
::
Texture2D
>
>
from
)
{
if
(
from
.
size
()
>
0
)
{
m_colorTexture
=
from
[
0
];
}
if
(
from
.
size
()
>
1
)
{
m_normalTexture
=
from
[
1
];
}
if
(
from
.
size
()
>
2
)
{
m_parameterTexture
=
from
[
2
];
}
if
(
from
.
size
()
>
3
)
{
m_tangentTexture
=
from
[
3
];
}
if
(
from
.
size
()
>
4
)
{
m_depthTexture
=
from
[
4
];
}
}
WGEPostprocessor
::
PostprocessorInput
::
PostprocessorInput
(
osg
::
ref_ptr
<
osg
::
Texture2D
>
color
,
osg
::
ref_ptr
<
osg
::
Texture2D
>
normal
,
osg
::
ref_ptr
<
osg
::
Texture2D
>
parameter
,
osg
::
ref_ptr
<
osg
::
Texture2D
>
tangent
,
osg
::
ref_ptr
<
osg
::
Texture2D
>
depth
)
:
m_colorTexture
(
color
),
m_normalTexture
(
normal
),
m_parameterTexture
(
parameter
),
m_tangentTexture
(
tangent
),
m_depthTexture
(
depth
)
{
}
WGEPostprocessor
::
PostprocessorInput
WGEPostprocessor
::
PostprocessorInput
::
attach
(
osg
::
ref_ptr
<
WGEOffscreenRenderPass
>
from
)
{
PostprocessorInput
buf
;
...
...
@@ -101,6 +148,7 @@ WGEPostprocessor::ProcessorList WGEPostprocessor::getPostprocessors()
postprocs
.
push_back
(
WGEPostprocessor
::
SPtr
(
new
WGEPostprocessorCelShading
()
)
);
postprocs
.
push_back
(
WGEPostprocessor
::
SPtr
(
new
WGEPostprocessorGauss
()
)
);
postprocs
.
push_back
(
WGEPostprocessor
::
SPtr
(
new
WGEPostprocessorSSAO
()
)
);
postprocs
.
push_back
(
WGEPostprocessor
::
SPtr
(
new
WGEPostprocessorMRSSAO
()
)
);
postprocs
.
push_back
(
WGEPostprocessor
::
SPtr
(
new
WGEPostprocessorLineAO
()
)
);
return
postprocs
;
}
...
...
src/core/graphicsEngine/postprocessing/WGEPostprocessor.h
View file @
17b634c4
...
...
@@ -58,6 +58,34 @@ public:
class
PostprocessorInput
{
public:
/**
* Constructs an instance from a given list of textures. The order in the list define color, normal, parameter, tangent, depth. There are
* no restrictions to the input list. If textures are missing, the corresponding textures in the GBuffer are missing.
*
* \param from source list
*/
explicit
PostprocessorInput
(
std
::
vector
<
osg
::
ref_ptr
<
osg
::
Texture2D
>
>
from
);
/**
* Construct GBuffer with an explicit list of textures.
*
* \param color color texture
* \param normal normal texture
* \param parameter parameter texture
* \param tangent tangent texture
* \param depth depth texture
*/
PostprocessorInput
(
osg
::
ref_ptr
<
osg
::
Texture2D
>
color
,
osg
::
ref_ptr
<
osg
::
Texture2D
>
normal
,
osg
::
ref_ptr
<
osg
::
Texture2D
>
parameter
,
osg
::
ref_ptr
<
osg
::
Texture2D
>
tangent
,
osg
::
ref_ptr
<
osg
::
Texture2D
>
depth
);
/**
* Constructor creates empty GBuffer. All textures are un-initialized.
*/
PostprocessorInput
();
/**
* Attaches the needed textures to the specified render pass and returns the G-Buffer
*
...
...
@@ -156,9 +184,18 @@ public:
/**
* Returns the result texture. Use this to continue processing.
*
* \param idx which output. Each postprocessor returns at least one texture in index 0, which also is the default value
*
* \return the result texture
*/
virtual
osg
::
ref_ptr
<
osg
::
Texture2D
>
getOutput
()
const
;
virtual
osg
::
ref_ptr
<
osg
::
Texture2D
>
getOutput
(
size_t
idx
=
0
)
const
;
/**
* This processor can produce multiple outputs. Grab them here. This vector always contains at least the first filtered texture in unit 0.
*
* \return the vector as copy.
*/
const
std
::
vector
<
osg
::
ref_ptr
<
osg
::
Texture2D
>
>&
getOutputList
()
const
;
/**
* Returns the new depth texture. Allows you to modify the depth values. By default, this is NULL. Check this!
...
...
@@ -182,9 +219,9 @@ public:
virtual
const
std
::
string
getDescription
()
const
;
protected:
/**
* The texture
contains the result
* The texture
s contain the result. Add at least one result texture
*/
osg
::
ref_ptr
<
osg
::
Texture2D
>
m_resultTexture
;
std
::
vector
<
osg
::
ref_ptr
<
osg
::
Texture2D
>
>
m_resultTextures
;
/**
* The texture contains the new depth
...
...
src/core/graphicsEngine/postprocessing/WGEPostprocessorCelShading.cpp
View file @
17b634c4
...
...
@@ -61,7 +61,7 @@ WGEPostprocessorCelShading::WGEPostprocessorCelShading( osg::ref_ptr< WGEOffscre
pass
->
getOrCreateStateSet
()
->
addUniform
(
new
WGEPropertyUniform
<
WPropInt
>
(
"u_celShadingBins"
,
bins
)
);
// attach color0 output
m_resultTexture
=
pass
->
attach
(
osg
::
Camera
::
COLOR_BUFFER0
,
GL_RGBA
);
m_resultTexture
s
.
push_back
(
pass
->
attach
(
osg
::
Camera
::
COLOR_BUFFER0
,
GL_RGBA
)
);
// provide the Gbuffer input
gbuffer
.
bind
(
pass
);
...
...
src/core/graphicsEngine/postprocessing/WGEPostprocessorEdgeEnhance.cpp
View file @
17b634c4
...
...
@@ -65,7 +65,7 @@ WGEPostprocessorEdgeEnhance::WGEPostprocessorEdgeEnhance( osg::ref_ptr< WGEOffsc
pass
->
getOrCreateStateSet
()
->
addUniform
(
new
WGEPropertyUniform
<
WPropDouble
>
(
"u_edgeEdgeThresholdLower"
,
edgeThresholdL
)
);
// attach color0 output
m_resultTexture
=
pass
->
attach
(
osg
::
Camera
::
COLOR_BUFFER0
,
GL_RGB
);
m_resultTexture
s
.
push_back
(
pass
->
attach
(
osg
::
Camera
::
COLOR_BUFFER0
,
GL_RGB
)
);
// provide the Gbuffer input
gbuffer
.
bind
(
pass
);
...
...
src/core/graphicsEngine/postprocessing/WGEPostprocessorGauss.cpp
View file @
17b634c4
...
...
@@ -60,58 +60,57 @@ WGEPostprocessorGauss::WGEPostprocessorGauss( osg::ref_ptr< WGEOffscreenRenderNo
// for each of the textures do:
// attach color0 output and bind tex0
m_resultTexture
=
pass
->
attach
(
osg
::
Camera
::
COLOR_BUFFER0
,
GL_RGBA
);
m_resultTextures
.
push_back
(
m_resultTexture
);
pass
->
bind
(
tex0
);
m_resultTextures
.
push_back
(
pass
->
attach
(
osg
::
Camera
::
COLOR_BUFFER0
,
GL_RGBA
)
);
pass
->
bind
(
tex0
,
0
);
s
->
setDefine
(
"WGE_POSTPROCESSOR_GAUSS_UNIT0"
);
// attach color1 output and bind tex1
if
(
tex1
)
{
m_resultTextures
.
push_back
(
pass
->
attach
(
osg
::
Camera
::
COLOR_BUFFER1
,
GL_RGBA
)
);
pass
->
bind
(
tex1
);
pass
->
bind
(
tex1
,
1
);
s
->
setDefine
(
"WGE_POSTPROCESSOR_GAUSS_UNIT1"
);
}
// attach color2 output and bind tex2
if
(
tex2
)
{
m_resultTextures
.
push_back
(
pass
->
attach
(
osg
::
Camera
::
COLOR_BUFFER2
,
GL_RGBA
)
);
pass
->
bind
(
tex2
);
pass
->
bind
(
tex2
,
2
);
s
->
setDefine
(
"WGE_POSTPROCESSOR_GAUSS_UNIT2"
);
}
// attach color3 output and bind tex3
if
(
tex3
)
{
m_resultTextures
.
push_back
(
pass
->
attach
(
osg
::
Camera
::
COLOR_BUFFER3
,
GL_RGBA
)
);
pass
->
bind
(
tex3
);
pass
->
bind
(
tex3
,
3
);
s
->
setDefine
(
"WGE_POSTPROCESSOR_GAUSS_UNIT3"
);
}
// attach color4 output and bind tex4
if
(
tex4
)
{
m_resultTextures
.
push_back
(
pass
->
attach
(
osg
::
Camera
::
COLOR_BUFFER4
,
GL_RGBA
)
);
pass
->
bind
(
tex4
);
pass
->
bind
(
tex4
,
4
);
s
->
setDefine
(
"WGE_POSTPROCESSOR_GAUSS_UNIT4"
);
}
// attach color5 output and bind tex5
if
(
tex5
)
{
m_resultTextures
.
push_back
(
pass
->
attach
(
osg
::
Camera
::
COLOR_BUFFER5
,
GL_RGBA
)
);
pass
->
bind
(
tex5
);
pass
->
bind
(
tex5
,
5
);
s
->
setDefine
(
"WGE_POSTPROCESSOR_GAUSS_UNIT5"
);
}
// attach color6 output and bind tex6
if
(
tex6
)
{
m_resultTextures
.
push_back
(
pass
->
attach
(
osg
::
Camera
::
COLOR_BUFFER6
,
GL_RGBA
)
);
pass
->
bind
(
tex6
);
pass
->
bind
(
tex6
,
6
);
s
->
setDefine
(
"WGE_POSTPROCESSOR_GAUSS_UNIT6"
);
}
// attach color7 output and bind tex7
if
(
tex7
)
{
m_resultTextures
.
push_back
(
pass
->
attach
(
osg
::
Camera
::
COLOR_BUFFER7
,
GL_RGBA
)
);
pass
->
bind
(
tex7
);
pass
->
bind
(
tex7
,
7
);
s
->
setDefine
(
"WGE_POSTPROCESSOR_GAUSS_UNIT7"
);
}
}
...
...
@@ -127,8 +126,3 @@ WGEPostprocessor::SPtr WGEPostprocessorGauss::create( osg::ref_ptr< WGEOffscreen
return
WGEPostprocessor
::
SPtr
(
new
WGEPostprocessorGauss
(
offscreen
,
gbuffer
.
m_colorTexture
)
);
}
const
std
::
vector
<
osg
::
ref_ptr
<
osg
::
Texture2D
>
>&
WGEPostprocessorGauss
::
getResultTextures
()
const
{
return
m_resultTextures
;
}
src/core/graphicsEngine/postprocessing/WGEPostprocessorGauss.h
View file @
17b634c4
...
...
@@ -87,20 +87,10 @@ public:
* \param offscreen use this offscreen node to add your texture pass'
* \param gbuffer the input textures you should use
*/
virtual
WGEPostprocessor
::
SPtr
create
(
osg
::
ref_ptr
<
WGEOffscreenRenderNode
>
offscreen
,
const
PostprocessorInput
&
gbuffer
)
const
;
/**
* This processor can produce multiple outputs. Grab them here. This vector always contains at least the first filtered texture in unit 0
*
* \return the vector
*/
const
std
::
vector
<
osg
::
ref_ptr
<
osg
::
Texture2D
>
>&
getResultTextures
()
const
;
virtual
WGEPostprocessor
::
SPtr
create
(
osg
::
ref_ptr
<
WGEOffscreenRenderNode
>
offscreen
,
const
PostprocessorInput
&
gbuffer
)
const
;
protected:
private:
/**
* Contains all output textures we produce in the order of binding.
*/
std
::
vector
<
osg
::
ref_ptr
<
osg
::
Texture2D
>
>
m_resultTextures
;
};
#endif // WGEPOSTPROCESSORGAUSS_H
...
...
src/core/graphicsEngine/postprocessing/WGEPostprocessorLineAO.cpp
View file @
17b634c4
...
...
@@ -89,7 +89,7 @@ WGEPostprocessorLineAO::WGEPostprocessorLineAO( osg::ref_ptr< WGEOffscreenRender
pass
->
getOrCreateStateSet
()
->
addUniform
(
new
WGEPropertyUniform
<
WPropDouble
>
(
"u_lineaoRadiusSS"
,
lineaoRadiusSS
)
);
// attach color0 output
m_resultTexture
=
pass
->
attach
(
osg
::
Camera
::
COLOR_BUFFER0
,
GL_RGB
);
m_resultTexture
s
.
push_back
(
pass
->
attach
(
osg
::
Camera
::
COLOR_BUFFER0
,
GL_RGB
)
);
// provide the Gbuffer input
size_t
gBufUnitOffset
=
gbuffer
.
bind
(
pass
);
...
...
src/core/graphicsEngine/postprocessing/WGEPostprocessorMRSSAO.cpp
0 → 100644
View file @
17b634c4
//---------------------------------------------------------------------------
//
// Project: OpenWalnut ( http://www.openwalnut.org )
//
// Copyright 2009 OpenWalnut Community, BSV@Uni-Leipzig and CNCF@MPI-CBS
// For more information see http://www.openwalnut.org/copying
//
// This file is part of OpenWalnut.
//
// OpenWalnut is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// OpenWalnut is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with OpenWalnut. If not, see <http://www.gnu.org/licenses/>.
//
//---------------------------------------------------------------------------
#include <osg/Camera>
#include "../../common/WLogger.h"
#include "../WGETextureUtils.h"
#include "../shaders/WGEPropertyUniform.h"
#include "../shaders/WGEShaderPropertyDefine.h"
#include "WGEPostprocessorGauss.h"
#include "WGEPostprocessorSSAO.h"
#include "WGEPostprocessorMergeOp.h"
#include "WGEPostprocessorMRSSAO.h"
WGEPostprocessorMRSSAO
::
WGEPostprocessorMRSSAO
()
:
WGEPostprocessor
(
"MRSSAO"
,
"MRSSAO is a special ambient occlusion technique which evaluates SSAO at different resolution levels."
)
{
}
WGEPostprocessorMRSSAO
::
WGEPostprocessorMRSSAO
(
osg
::
ref_ptr
<
WGEOffscreenRenderNode
>
offscreen
,
const
WGEPostprocessor
::
PostprocessorInput
&
gbuffer
)
:
WGEPostprocessor
(
"MRSSAO"
,
"MRSSAO is a special ambient occlusion technique which evaluates SSAO at different resolution levels."
)
{
// abbreviate processor input as GBuffer
typedef
WGEPostprocessor
::
PostprocessorInput
GBuffer
;
// also create some prototypes of the needed postprocessors
WGEPostprocessorSSAO
::
SPtr
ssaoProto
=
WGEPostprocessorSSAO
::
SPtr
(
new
WGEPostprocessorSSAO
()
);
// Construct the pipeline:
// first step create a gaussed version of the GBuffer, ... we only need gaussed normals and depths
WGEPostprocessor
::
SPtr
g1
(
new
WGEPostprocessorGauss
(
offscreen
,
gbuffer
.
m_normalTexture
,
gbuffer
.
m_depthTexture
)
);
// SSAO the result of gauss 1: (note: we use the input GBuffer but change depth and normal texture)
WGEPostprocessor
::
SPtr
ssaoOfG1
=
ssaoProto
->
create
(
offscreen
,
GBuffer
(
gbuffer
.
m_colorTexture
,
g1
->
getOutput
(
0
),
gbuffer
.
m_parameterTexture
,
gbuffer
.
m_tangentTexture
,
g1
->
getOutput
(
1
)
)
);
ssaoOfG1
->
getProperties
()
->
getProperty
(
"Effect Only"
)
->
toPropBool
()
->
set
(
true
);
ssaoOfG1
->
getProperties
()
->
getProperty
(
"Radius"
)
->
toPropDouble
()
->
set
(
20
);
// second step: gauss the gauss 1 result again
WGEPostprocessor
::
SPtr
g2
(
new
WGEPostprocessorGauss
(
offscreen
,
g1
->
getOutput
(
0
),
g1
->
getOutput
(
1
)
)
);
// SSAO the result of gauss 2: (note: we use the input GBuffer but change depth and normal texture)
WGEPostprocessor
::
SPtr
ssaoOfG2
=
ssaoProto
->
create
(
offscreen
,
GBuffer
(
gbuffer
.
m_colorTexture
,
g2
->
getOutput
(
0
),
gbuffer
.
m_parameterTexture
,
gbuffer
.
m_tangentTexture
,
g2
->
getOutput
(
1
)
)
);
ssaoOfG2
->
getProperties
()
->
getProperty
(
"Effect Only"
)
->
toPropBool
()
->
set
(
true
);
ssaoOfG2
->
getProperties
()
->
getProperty
(
"Radius"
)
->
toPropDouble
()
->
set
(
40
);
// we also need a SSAO of the original buffer:
WGEPostprocessor
::
SPtr
ssaoOfOriginal
=
ssaoProto
->
create
(
offscreen
,
gbuffer
);
ssaoOfOriginal
->
getProperties
()
->
getProperty
(
"Effect Only"
)
->
toPropBool
()
->
set
(
true
);
ssaoOfOriginal
->
getProperties
()
->
getProperty
(
"Radius"
)
->
toPropDouble
()
->
set
(
10
);
WGEPostprocessor
::
SPtr
gOfssaoOfG1
(
new
WGEPostprocessorGauss
(
offscreen
,
ssaoOfG1
->
getOutput
()
)
);
WGEPostprocessor
::
SPtr
gOfssaoOfG2
(
new
WGEPostprocessorGauss
(
offscreen
,
ssaoOfG2
->
getOutput
()
)
);
WGEPostprocessor
::
SPtr
gOfssaoOfGOrg
(
new
WGEPostprocessorGauss
(
offscreen
,
ssaoOfOriginal
->
getOutput
()
)
);
// merge the 3 SSAO images together
WGEPostprocessorMergeOp
::
SPtr
merge
(
new
WGEPostprocessorMergeOp
(
offscreen
,
gbuffer
.
m_colorTexture
,
ssaoOfOriginal
->
getOutput
(),
gOfssaoOfG1
->
getOutput
(),
gOfssaoOfG2
->
getOutput
()
)
);
// set some custom merge code:
std
::
string
mergecode
=
"float ssaoO = texture2D( u_texture1Sampler, pixelCoord ).r;
\n
"
"float ssao0 = texture2D( u_texture2Sampler, pixelCoord ).r;
\n
"
"float ssao1 = texture2D( u_texture3Sampler, pixelCoord ).r;
\n
"
"float combinedSSAO = min( min( ssaoO, ssao0 ), ssao1 );
\n
"
"#ifdef WGE_POSTPROCESSOR_OUTPUT_COMBINE
\n
"
"color = vec4( ( texture2D( u_texture0Sampler, pixelCoord ) * combinedSSAO ).rgb, 1.0 );
\n
"
"#else
\n
"
"color = vec4( vec3( combinedSSAO ), 1.0 );
\n
"
"#endif
\n
"
;
merge
->
setGLSLMergeCode
(
mergecode
);
// thats it. output result
m_resultTextures
.
push_back
(
merge
->
getOutput
()
);
}
WGEPostprocessorMRSSAO
::~
WGEPostprocessorMRSSAO
()
{
// cleanup
}
WGEPostprocessor
::
SPtr
WGEPostprocessorMRSSAO
::
create
(
osg
::
ref_ptr
<
WGEOffscreenRenderNode
>
offscreen
,
const
WGEPostprocessor
::
PostprocessorInput
&
gbuffer
)
const
{
return
WGEPostprocessor
::
SPtr
(
new
WGEPostprocessorMRSSAO
(
offscreen
,
gbuffer
)
);
}
src/core/graphicsEngine/postprocessing/WGEPostprocessorMRSSAO.h
0 → 100644
View file @
17b634c4
//---------------------------------------------------------------------------
//
// Project: OpenWalnut ( http://www.openwalnut.org )
//
// Copyright 2009 OpenWalnut Community, BSV@Uni-Leipzig and CNCF@MPI-CBS
// For more information see http://www.openwalnut.org/copying
//
// This file is part of OpenWalnut.
//
// OpenWalnut is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// OpenWalnut is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with OpenWalnut. If not, see <http://www.gnu.org/licenses/>.
//
//---------------------------------------------------------------------------
#ifndef WGEPOSTPROCESSORMRSSAO_H
#define WGEPOSTPROCESSORMRSSAO_H
#include <boost/shared_ptr.hpp>
#include "WGEPostprocessor.h"
/**
* Naive MRSSAO implementation. It re-implements the technique "Multi-resolution screen-space ambient occlusion" in CGI 2011 by Hoang Thai Duong
* et al.
*/
class
WGEPostprocessorMRSSAO
:
public
WGEPostprocessor
{
public:
/**
* Convenience typedef for a boost::shared_ptr< WGEPostprocessorMRSSAO >.
*/
typedef
boost
::
shared_ptr
<
WGEPostprocessorMRSSAO
>
SPtr
;
/**
* Convenience typedef for a boost::shared_ptr< const WGEPostprocessorMRSSAO >.
*/
typedef
boost
::
shared_ptr
<
const
WGEPostprocessorMRSSAO
>
ConstSPtr
;
/**
* Default constructor.
*/
WGEPostprocessorMRSSAO
();
/**
* Destructor.
*/
virtual
~
WGEPostprocessorMRSSAO
();
/**
* Create instance. Uses the protected constructor. Implement it if you derive from this class!
*
* \param offscreen use this offscreen node to add your texture pass'
* \param gbuffer the input textures you should use
*/
virtual
WGEPostprocessor
::
SPtr
create
(
osg
::
ref_ptr
<
WGEOffscreenRenderNode
>
offscreen
,
const
PostprocessorInput
&
gbuffer
)
const
;
protected:
/**
* Constructor. Implement this constructor and build your processing pipeline in here
*
* \param offscreen use this offscreen node to add your texture pass'
* \param gbuffer the input textures you should use
*/
WGEPostprocessorMRSSAO
(
osg
::
ref_ptr
<
WGEOffscreenRenderNode
>
offscreen
,
const
PostprocessorInput
&
gbuffer
);
private:
};
#endif // WGEPOSTPROCESSORMRSSAO_H
src/core/graphicsEngine/postprocessing/WGEPostprocessorMergeOp.cpp
0 → 100644
View file @
17b634c4
//---------------------------------------------------------------------------
//
// Project: OpenWalnut ( http://www.openwalnut.org )
//
// Copyright 2009 OpenWalnut Community, BSV@Uni-Leipzig and CNCF@MPI-CBS
// For more information see http://www.openwalnut.org/copying
//
// This file is part of OpenWalnut.
//
// OpenWalnut is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// OpenWalnut is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with OpenWalnut. If not, see <http://www.gnu.org/licenses/>.
//
//---------------------------------------------------------------------------
#include <osg/Camera>
#include "../shaders/WGEPropertyUniform.h"
#include "../shaders/WGEShaderPropertyDefineOptions.h"
#include "WGEPostprocessorMergeOp.h"
WGEPostprocessorMergeOp
::
WGEPostprocessorMergeOp
()
:
WGEPostprocessor
(
"MergeOp"
,
"MergeOp - combines all input textures in a user defined way."
)
{
}
WGEPostprocessorMergeOp
::
WGEPostprocessorMergeOp
(
osg
::
ref_ptr
<
WGEOffscreenRenderNode
>
offscreen
,
osg
::
ref_ptr
<
osg
::
Texture2D
>
tex0
,
osg
::
ref_ptr
<
osg
::
Texture2D
>
tex1
,
osg
::
ref_ptr
<
osg
::
Texture2D
>
tex2
,
osg
::
ref_ptr
<
osg
::
Texture2D
>
tex3
,
osg
::
ref_ptr
<
osg
::
Texture2D
>
tex4
,
osg
::
ref_ptr
<
osg
::
Texture2D
>
tex5
,
osg
::
ref_ptr
<
osg
::
Texture2D
>
tex6
,
osg
::
ref_ptr
<
osg
::
Texture2D
>
tex7
)
:
WGEPostprocessor
(
"MergeOp"
,
"MergeOp - combines all input textures in a user defined way."
),
m_codeInjector
(
new
WGEShaderCodeInjector
(
"WGE_POSTPROCESSOR_MERGEOP_CODE"
)
)
{
// Use the standard postprocessor uber-shader
m_mergeOpShader
=
new
WGEShader
(
"WGEPostprocessor"
);
m_mergeOpShader
->
setDefine
(
"WGE_POSTPROCESSOR_MERGEOP"
);
m_mergeOpShader
->
addPreprocessor
(
m_codeInjector
);
// also add the m_effectOnly property as shader preprocessor
m_mergeOpShader
->
addPreprocessor
(
m_effectOnlyPreprocessor
);
// create the rendering pass
osg
::
ref_ptr
<
WGEOffscreenTexturePass
>
pass
=
offscreen
->
addTextureProcessingPass
(
m_mergeOpShader
,
"MergeOp"
);
// for each of the textures do:
// attach color0 output and bind tex0
m_resultTextures
.
push_back
(
pass
->
attach
(
osg
::
Camera
::
COLOR_BUFFER0
,
GL_RGBA
)
);
pass
->
bind
(
tex0
,
0
);
m_mergeOpShader
->
setDefine
(
"WGE_POSTPROCESSOR_MERGEOP_UNIT0"
);
// attach color1 output and bind tex1
if
(
tex1
)
{
pass
->
bind
(
tex1
,
1
);
m_mergeOpShader
->
setDefine
(
"WGE_POSTPROCESSOR_MERGEOP_UNIT1"
);
}
// attach color2 output and bind tex2
if
(
tex2
)
{
pass
->
bind
(
tex2
,
2
);
m_mergeOpShader
->
setDefine
(
"WGE_POSTPROCESSOR_MERGEOP_UNIT2"
);
}
// attach color3 output and bind tex3
if
(
tex3
)
{
pass
->
bind
(
tex3
,
3
);
m_mergeOpShader
->
setDefine
(
"WGE_POSTPROCESSOR_MERGEOP_UNIT3"
);
}
// attach color4 output and bind tex4
if
(
tex4
)
{
pass
->
bind
(
tex4
,
4
);
m_mergeOpShader
->
setDefine
(
"WGE_POSTPROCESSOR_MERGEOP_UNIT4"
);
}
// attach color5 output and bind tex5
if
(
tex5
)
{
pass
->
bind
(
tex5
,
5
);
m_mergeOpShader
->
setDefine
(
"WGE_POSTPROCESSOR_MERGEOP_UNIT5"
);
}
// attach color6 output and bind tex6
if
(
tex6
)
{
pass
->
bind
(
tex6
,
6
);
m_mergeOpShader
->
setDefine
(
"WGE_POSTPROCESSOR_MERGEOP_UNIT6"
);
}
// attach color7 output and bind tex7
if
(
tex7
)
{
pass
->
bind
(
tex7
,
7
);
m_mergeOpShader
->
setDefine
(
"WGE_POSTPROCESSOR_MERGEOP_UNIT7"
);
}
}
WGEPostprocessorMergeOp
::~
WGEPostprocessorMergeOp
()