Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
FSL
fsleyes
fsleyes
Commits
5a1d12b6
Commit
5a1d12b6
authored
Oct 05, 2021
by
Paul McCarthy
🚵
Browse files
ENH: Adjust depth values in GL14
parent
2938067c
Changes
2
Hide whitespace changes
Inline
Side-by-side
fsleyes/assets/gl/gl14/glvolume_3d_frag.prog
View file @
5a1d12b6
...
@@ -122,12 +122,16 @@ MOV skipTest, 1;
...
@@ -122,12 +122,16 @@ MOV skipTest, 1;
MOV finalColour, startingColour;
MOV finalColour, startingColour;
# Set depth.w > 0 if depth has
# Set depth.w < 0 if depth has already been
# not been set, < 0 otherwise.
# set in a previous pass, > 0 otherwise. If
# If depth has already been set,
# depth has already been set, we want to pass
# we want to pass through its
# through that value, rather than calculating
# initial value.
# it again. Initial value for a depth texture
SUB depth.w, 0, finalColour.a;
# is 1 (and depth textures are clamped to 0
# [closer to screen], 1 [farther from screen]),
# so if it is < 1, we assume it has already
# been set.
SUB depth.w, depth.x, 1;
CMP depth.w, depth.w, -1, 1;
CMP depth.w, depth.w, -1, 1;
...
@@ -209,7 +213,10 @@ MIN skipTest.x, skipTest.x, tempVar.x;
...
@@ -209,7 +213,10 @@ MIN skipTest.x, skipTest.x, tempVar.x;
# Check whether the accumulated
# Check whether the accumulated
# colour alpha is already high enough
# colour alpha is already high enough.
# If it is, we don't consider the
# values from any more samples on the
# ray.
SLT tempVar.x, finalColour.a, 0.95;
SLT tempVar.x, finalColour.a, 0.95;
MAD tempVar.x, tempVar.x, 2.0, -1;
MAD tempVar.x, tempVar.x, 2.0, -1;
MIN skipTest.x, skipTest.x, tempVar.x;
MIN skipTest.x, skipTest.x, tempVar.x;
...
@@ -250,32 +257,53 @@ MUL colour.rgb, colour, colour.a;
...
@@ -250,32 +257,53 @@ MUL colour.rgb, colour, colour.a;
SUB tempVar.x, 1, finalColour.a;
SUB tempVar.x, 1, finalColour.a;
MAD tempColour, tempVar.x, colour, finalColour;
MAD tempColour, tempVar.x, colour, finalColour;
# Figure out if we should consider this
# sample for depth calculation:
# - skipTest.x tells us whether this sample
# should be discarded
# - depth.w tells us whether we already have
# a depth value
# - {{ param_screenSize }}.z tells us whether
# we are modulating alpha by voxel intensity
# (depth is calculated differently depending
# on whether we are or not)
#
# If modulating alpha by voxel intensity, we
# take the depth of the first sample on the ray
# with intensity >= 0.1 (voxel values are
# normalised to [0, 1] w.r.t. current display
# range).
#
# If not blending by voxel intensity, we
# take the depth of the first sample.
#
# We accumulate all of these conditionals into
# tempVar.x, such that it is == 0 if we should
# take the depth value from this sample, < 0
# otherwise.
SLT tempVar.x, skipTest.x, 0; # set if should skip
SLT tempVar.y, depth.w, 0; # set if already have depth
SLT tempVar.z, voxValue.x, 0.1; # set if below threshold
ADD tempVar.z, tempVar.z, {{ param_screenSize }}.z; # and blending by intensity
SGE tempVar.z, tempVar.z, 2;
ADD tempVar.x, tempVar.x, tempVar.y;
ADD tempVar.x, tempVar.x, tempVar.z;
MUL tempVar.x, tempVar.x, -1;
# Calculate the screen depth of
# Calculate the screen depth of the
# the current ray position. If we
# current ray position, storing it
# have just taken our first sample,
# in tempvar.z
# save the depth, as we will use
DP4 tempVar.z, {{ param_tex2ScreenXform }}, texCoord;
# it for the final fragment depth.
# Figure out if this is the first
# sample taken by testing whether
# skipTest.x > 0, and depth.w > 0
# (the latter is true if the
# startingColour.a == 0).
ADD depth.y, depth.w, skipTest.x;
MUL depth.y, depth.y, -1;
DP4 depth.z, {{ param_tex2ScreenXform }}, texCoord;
CMP depth.x, depth.y, depth.z, depth.x;
# Save the depth value to depth.x, based on
# conditional tests above.
CMP depth.x, tempVar.x, depth.x, tempVar.z;
# If we have just set the depth,
# If we have just set the depth,
# set depth.w to < 0 so that we
# set depth.w to < 0 so that we
# don't overwrite the depth on a
# don't overwrite the depth on a
# subsequent sample.
# subsequent sample.
SUB depth.y, depth.w, skipTest.x;
CMP depth.w, tempVar.x, depth.w, -1;
MAD depth.y, depth.y, -1, 0.5;
CMP depth.w, depth.y, 1, -1;
# Only update the accumulated colour
# Only update the accumulated colour
...
@@ -294,9 +322,25 @@ CMP finalColour, skipTest.x, finalColour, tempColour;
...
@@ -294,9 +322,25 @@ CMP finalColour, skipTest.x, finalColour, tempColour;
ADD texCoord.xyz, texCoord, {{ param_rayStep }};
ADD texCoord.xyz, texCoord, {{ param_rayStep }};
ADD clipTexCoord.xyz, clipTexCoord, {{ param_rayStep }};
ADD clipTexCoord.xyz, clipTexCoord, {{ param_rayStep }};
{% endfor %}
{% endfor %}
# set tempVar.w to -1 if this is the final
# pass, and we still don't have a depth
# value, 0 otherwise.
SGE tempVar.x, {{ param_settings }}.z, 1;
SGE tempVar.y, depth.w, 1;
ADD tempVar.x, tempVar.x, tempVar.y;
SGE tempVar.x, tempVar.x, 2;
MUL tempVar.w, tempVar.x, -1;
# Calculate the depth value corresponding
# to the very first sample in this ray.
ADD tempVar.xyz, {{ param_rayStep }}, {{ varying_texCoord }};
DP4 tempVar.z, {{ param_tex2ScreenXform }}, tempVar;
# Use it if we don't already have a depth
CMP depth.x, tempVar.w, tempVar.z, depth.x;
# If startingColour.a == 0 and
# If startingColour.a == 0 and
# finalColour.a == 0,
# finalColour.a == 0,
...
...
fsleyes/gl/gl14/glvolume_funcs.py
View file @
5a1d12b6
...
@@ -256,6 +256,14 @@ def draw3D(self, xform=None, bbox=None):
...
@@ -256,6 +256,14 @@ def draw3D(self, xform=None, bbox=None):
with
glroutines
.
enabled
((
gl
.
GL_VERTEX_ARRAY
)),
\
with
glroutines
.
enabled
((
gl
.
GL_VERTEX_ARRAY
)),
\
glroutines
.
disabled
((
gl
.
GL_BLEND
)):
glroutines
.
disabled
((
gl
.
GL_BLEND
)):
# The depth value for a fragment will
# not necessary be set at the same
# time that the fragment colour is
# set, so we need to use <= for depth
# testing so that unset depth values
# do not cause depth clipping.
gl
.
glDepthFunc
(
gl
.
GL_LEQUAL
)
for
i
in
range
(
outerLoop
):
for
i
in
range
(
outerLoop
):
settings
=
list
(
settings
)
settings
=
list
(
settings
)
...
@@ -280,6 +288,8 @@ def draw3D(self, xform=None, bbox=None):
...
@@ -280,6 +288,8 @@ def draw3D(self, xform=None, bbox=None):
dest
,
src
=
src
,
dest
dest
,
src
=
src
,
dest
gl
.
glDepthFunc
(
gl
.
GL_LESS
)
shader
.
unloadAtts
()
shader
.
unloadAtts
()
shader
.
unload
()
shader
.
unload
()
...
...
Write
Preview
Supports
Markdown
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