Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
OpenFlipper-Staging
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
1
Merge Requests
1
Operations
Operations
Incidents
Analytics
Analytics
Repository
Value Stream
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
OpenFlipper-Free
OpenFlipper-Staging
Commits
ea5d24fb
Commit
ea5d24fb
authored
May 25, 2017
by
Christopher Tenter
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
- fix gl resource cleanup
- use correct background color
parent
b9e460fc
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
41 additions
and
24 deletions
+41
-24
PluginCollection-Renderers/Plugin-Render-OITLinkedList/OITLinkedList.cc
...on-Renderers/Plugin-Render-OITLinkedList/OITLinkedList.cc
+33
-17
PluginCollection-Renderers/Plugin-Render-OITLinkedList/OITLinkedList.hh
...on-Renderers/Plugin-Render-OITLinkedList/OITLinkedList.hh
+5
-6
PluginCollection-Renderers/Plugin-Render-OITLinkedList/Shaders/OITLinkedList/resolve.glsl
...n-Render-OITLinkedList/Shaders/OITLinkedList/resolve.glsl
+3
-1
No files found.
PluginCollection-Renderers/Plugin-Render-OITLinkedList/OITLinkedList.cc
View file @
ea5d24fb
...
...
@@ -158,6 +158,9 @@ ABufferGenModifier ABufferGenModifier::instance;
OITLinkedList
::
OITLinkedList
()
{
fragCounter_
=
new
ACG
::
AtomicCounter
();
startOffsetBuffer_
=
new
ACG
::
TextureBuffer
();
ABuffer_
=
new
ACG
::
TextureBuffer
();
}
...
...
@@ -172,6 +175,17 @@ void OITLinkedList::initializePlugin()
ACG
::
ShaderProgGenerator
::
registerModifier
(
&
ABufferGenModifier
::
instance
);
}
void
OITLinkedList
::
exit
()
{
delete
fragCounter_
;
fragCounter_
=
0
;
delete
startOffsetBuffer_
;
startOffsetBuffer_
=
0
;
delete
ABuffer_
;
ABuffer_
=
0
;
}
void
OITLinkedList
::
render
(
ACG
::
GLState
*
_glState
,
Viewer
::
ViewerProperties
&
_properties
)
...
...
@@ -180,7 +194,7 @@ void OITLinkedList::render(ACG::GLState* _glState, Viewer::ViewerProperties& _pr
prepareRenderingPipeline
(
_glState
,
_properties
.
drawMode
(),
PluginFunctions
::
getSceneGraphRootNode
());
renderOIT
(
_glState
->
viewport_width
(),
_glState
->
viewport_height
(),
_properties
.
multisampling
());
renderOIT
(
_glState
->
viewport_width
(),
_glState
->
viewport_height
(),
_properties
.
multisampling
()
,
_properties
.
backgroundColor
()
);
// restore common opengl state
// log window remains hidden otherwise
...
...
@@ -198,24 +212,24 @@ void OITLinkedList::prepareBuffers(int w, int h)
const
int
offsetBufSize
=
numPixels
*
4
;
// uint buffer for each pixel
const
int
ABufSize
=
numPixels
*
16
*
estAvgLayers
;
if
(
startOffsetBuffer_
.
getBufferSize
()
<
offsetBufSize
)
startOffsetBuffer_
.
setBufferData
(
offsetBufSize
,
0
,
GL_R32UI
,
GL_DYNAMIC_DRAW
);
if
(
startOffsetBuffer_
->
getBufferSize
()
<
offsetBufSize
)
startOffsetBuffer_
->
setBufferData
(
offsetBufSize
,
0
,
GL_R32UI
,
GL_DYNAMIC_DRAW
);
if
(
ABuffer_
.
getBufferSize
()
<
ABufSize
)
ABuffer_
.
setBufferData
(
ABufSize
,
0
,
GL_RGBA32UI
,
GL_DYNAMIC_DRAW
);
if
(
ABuffer_
->
getBufferSize
()
<
ABufSize
)
ABuffer_
->
setBufferData
(
ABufSize
,
0
,
GL_RGBA32UI
,
GL_DYNAMIC_DRAW
);
// dbg: force unbind
glBindTexture
(
GL_TEXTURE_BUFFER
,
0
);
// reset fragment counter
fragCounter_
.
set
(
0
);
fragCounter_
->
set
(
0
);
// wait for buffer allocation
glMemoryBarrier
(
GL_BUFFER_UPDATE_BARRIER_BIT
|
GL_SHADER_IMAGE_ACCESS_BARRIER_BIT
);
}
void
OITLinkedList
::
renderOIT
(
int
w
,
int
h
,
bool
multisampled
)
void
OITLinkedList
::
renderOIT
(
int
w
,
int
h
,
bool
multisampled
,
const
ACG
::
Vec4f
&
backColor
)
{
ACG
::
Vec2ui
screenSize
=
ACG
::
Vec2ui
(
GLuint
(
w
),
GLuint
(
h
));
...
...
@@ -231,7 +245,7 @@ void OITLinkedList::renderOIT(int w, int h, bool multisampled)
// load reset shader for startOffsetBuffer
GLSL
::
Program
*
shaderReset
=
ACG
::
ShaderCache
::
getInstance
()
->
getProgram
(
"ScreenQuad/screenquad.glsl"
,
"OITLinkedList/reset.glsl"
);
startOffsetBuffer_
.
bindAsImage
(
0
,
GL_WRITE_ONLY
);
startOffsetBuffer_
->
bindAsImage
(
0
,
GL_WRITE_ONLY
);
shaderReset
->
use
();
...
...
@@ -264,11 +278,11 @@ void OITLinkedList::renderOIT(int w, int h, bool multisampled)
glGetIntegerv
(
GL_SAMPLES
,
&
msaaSampleCount
);
// bind UAV buffers
startOffsetBuffer_
.
bindAsImage
(
0
,
GL_READ_WRITE
);
ABuffer_
.
bindAsImage
(
1
,
GL_WRITE_ONLY
);
startOffsetBuffer_
->
bindAsImage
(
0
,
GL_READ_WRITE
);
ABuffer_
->
bindAsImage
(
1
,
GL_WRITE_ONLY
);
// bind atomic counter
fragCounter_
.
bind
(
0
);
fragCounter_
->
bind
(
0
);
for
(
int
i
=
0
;
i
<
getNumRenderObjects
();
++
i
)
{
...
...
@@ -290,7 +304,7 @@ void OITLinkedList::renderOIT(int w, int h, bool multisampled)
renderObject
(
obj
,
shaderRender
);
}
fragCounter_
.
unbind
();
fragCounter_
->
unbind
();
// wait for render pass to finish!
...
...
@@ -331,11 +345,13 @@ void OITLinkedList::renderOIT(int w, int h, bool multisampled)
// init shader constants
shaderResolve
->
use
();
startOffsetBuffer_
.
bindAsImage
(
0
,
GL_READ_ONLY
);
ABuffer_
.
bindAsImage
(
1
,
GL_READ_ONLY
);
startOffsetBuffer_
->
bindAsImage
(
0
,
GL_READ_ONLY
);
ABuffer_
->
bindAsImage
(
1
,
GL_READ_ONLY
);
shaderResolve
->
setUniform
(
"g_ScreenSize"
,
screenSize
);
shaderResolve
->
setUniform
(
"g_BackColor"
,
backColor
);
if
(
multisampled
)
shaderResolve
->
setUniform
(
"g_SampleCount"
,
GLuint
(
msaaSampleCount
));
...
...
@@ -370,14 +386,14 @@ void OITLinkedList::renderOIT(int w, int h, bool multisampled)
unsigned
int
actualFragmentCount
=
0
;
fragCounter_
.
get
(
&
actualFragmentCount
);
fragCounter_
->
get
(
&
actualFragmentCount
);
// resize ABuffer if too small
// RGBA32UI : 16 bytes per fragment
if
(
int
(
actualFragmentCount
)
*
16
>
ABuffer_
.
getBufferSize
())
if
(
int
(
actualFragmentCount
)
*
16
>
ABuffer_
->
getBufferSize
())
{
ABuffer_
.
setBufferData
(
actualFragmentCount
*
18
,
0
,
ABuffer_
.
getFormat
(),
ABuffer_
.
getUsage
());
ABuffer_
->
setBufferData
(
actualFragmentCount
*
18
,
0
,
ABuffer_
->
getFormat
(),
ABuffer_
->
getUsage
());
// std::cout << "buffer size too small: " << actualFragmentCount << std::endl;
}
...
...
PluginCollection-Renderers/Plugin-Render-OITLinkedList/OITLinkedList.hh
View file @
ea5d24fb
...
...
@@ -89,7 +89,7 @@ private slots:
//BaseInterface
void
initializePlugin
();
void
exit
()
{}
void
exit
()
;
// RenderInterface
void
render
(
ACG
::
GLState
*
_glState
,
Viewer
::
ViewerProperties
&
_properties
);
...
...
@@ -104,19 +104,18 @@ private:
void
prepareBuffers
(
int
w
,
int
h
);
void
renderOIT
(
int
w
,
int
h
,
bool
multisampled
);
void
renderOIT
(
int
w
,
int
h
,
bool
multisampled
,
const
ACG
::
Vec4f
&
backColor
);
// counter for number of processed fragments
ACG
::
AtomicCounter
fragCounter_
;
ACG
::
AtomicCounter
*
fragCounter_
;
// stores start offset into FLBuffer
ACG
::
TextureBuffer
startOffsetBuffer_
;
ACG
::
TextureBuffer
*
startOffsetBuffer_
;
// ABuffer: per pixel linked list buffer
ACG
::
TextureBuffer
ABuffer_
;
ACG
::
TextureBuffer
*
ABuffer_
;
};
PluginCollection-Renderers/Plugin-Render-OITLinkedList/Shaders/OITLinkedList/resolve.glsl
View file @
ea5d24fb
...
...
@@ -17,6 +17,8 @@ layout(binding = 1, rgba32ui) uniform uimageBuffer g_ABuffer;
uniform
uvec2
g_ScreenSize
;
uniform
vec4
g_BackColor
;
struct
FragListEntry
{
...
...
@@ -93,7 +95,7 @@ void main()
uiOffset
=
fragEntry
.
z
;
}
vec4
color
=
vec4
(
0
,
0
,
0
,
1
)
;
vec4
color
=
g_BackColor
;
// blend back to front
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment