Interface StereoDeviceRenderer
The following pseudo-code describes how to implement a renderer
using a StereoDeviceRenderer
.
See StereoClientRenderer
which implements the following:
- device.
beginFrame(GL)
- For both eyes:
- device.
#updateViewerPose(int)
- if device.
ppAvailable()
: Set the render target, e.g. FBO - Set the viewport using
StereoDeviceRenderer.Eye.getViewport()
upstream.reshapeEye(..)
upstream.display(..)
.
- device.
- Reset the viewport
- If device.
ppAvailable()
:- device.
ppBegin(GL)
- Use render target, e.g. FBO's texture
- device.
#ppBothEyes(GL)
or device.ppOneEye(GL, int)
for both eyes - device.
ppEnd(GL)
- device.
- device.
endFrame(GL)
Correct Asymmetric FOV
Rendering
The StereoClientRenderer
shall render both images for each eye correctly Off-axis
utilizing an asymmetric camera frustum, i.e. by using StereoDevice
's default
FovHVHalves
.
Some references:
-
Nested Class Summary
Nested ClassesModifier and TypeInterfaceDescriptionstatic interface
Interface describing one eye of the stereoscopic device, seegetEye(int)
. -
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final int
Distortion Bit: Barrel distortion compensating lens pincushion distortionstatic final int
Distortion Bit: Chromatic distortion compensating lens chromatic aberration.static final int
Distortion Bit: Timewarp distortion technique to predictViewerPose
movement to reduce latency.static final int
Distortion Bit: Vignette distortion compensating lens chromatic aberration. -
Method Summary
Modifier and TypeMethodDescriptionvoid
beginFrame
(GL gl) Notifying that a new frame is about to start.void
Release all OpenGL related resourcesvoid
Notifying that the frame has been rendered completely.Returns theStereoDevice
of thisStereoDeviceRenderer
instance.int
Returns used distortion compensation bits, e.g.getEye
(int eyeNum) Returns theStereoDeviceRenderer.Eye
instance for the denotedeyeNum
.Returns the surface size for each eye's a single image in pixel units.Returns the lastViewerPose
.int
Returns the used texture-image count for post-processing, seeppAvailable()
.int
Returns the desired texture-image unit for post-processing, seeppAvailable()
.Returns the total surface size required for the complete images in pixel units.void
Initialize OpenGL related resourcesboolean
Returnstrue
if stereoscopic post-processing is required and available, otherwisefalse
.void
Begin stereoscopic post-processing, seeppAvailable()
.void
End stereoscopic post-processing, seeppAvailable()
.void
Performs stereoscopic post-processing for one eye, seeppAvailable()
.Updates theViewerPose
and returns it.boolean
Method returnstrue
if using side-by-side (SBS) stereoscopic images, otherwisefalse
.
-
Field Details
-
DISTORTION_BARREL
static final int DISTORTION_BARRELDistortion Bit: Barrel distortion compensating lens pincushion distortion- See Also:
-
DISTORTION_CHROMATIC
static final int DISTORTION_CHROMATICDistortion Bit: Chromatic distortion compensating lens chromatic aberration.- See Also:
-
DISTORTION_VIGNETTE
static final int DISTORTION_VIGNETTEDistortion Bit: Vignette distortion compensating lens chromatic aberration.- See Also:
-
DISTORTION_TIMEWARP
static final int DISTORTION_TIMEWARPDistortion Bit: Timewarp distortion technique to predictViewerPose
movement to reduce latency.FIXME: Explanation needs refinement!
- See Also:
-
-
Method Details
-
getDevice
StereoDevice getDevice()Returns theStereoDevice
of thisStereoDeviceRenderer
instance. -
getEye
Returns theStereoDeviceRenderer.Eye
instance for the denotedeyeNum
. -
updateViewerPose
ViewerPose updateViewerPose()Updates theViewerPose
and returns it. -
getLastViewerPose
ViewerPose getLastViewerPose()Returns the lastViewerPose
. -
getDistortionBits
int getDistortionBits()Returns used distortion compensation bits, e.g.DISTORTION_BARREL
, in case the stereoscopic display requires such, i.e. in case lenses are utilized.Distortion requires
post-processing
. -
usesSideBySideStereo
boolean usesSideBySideStereo()Method returnstrue
if using side-by-side (SBS) stereoscopic images, otherwisefalse
.SBS requires that both eye's images are presented side-by-side in the final framebuffer.
Either the renderer presents the images side-by-side according to the
eye's viewport
, orpost-processing
is utilized to mergetextures
to a side-by-side configuration. -
getEyeSurfaceSize
DimensionImmutable[] getEyeSurfaceSize()Returns the surface size for each eye's a single image in pixel units. -
getTotalSurfaceSize
DimensionImmutable getTotalSurfaceSize()Returns the total surface size required for the complete images in pixel units.If
usesSideBySideStereo()
the total size spans over bothgetEyeSurfaceSize()
, side-by-side.Otherwise the size is equal to
getEyeSurfaceSize()
. -
getTextureCount
int getTextureCount()Returns the used texture-image count for post-processing, seeppAvailable()
.In case the renderer does not support multiple textures for post-processing, or no post-processing at all, method returns zero despite the request from
StereoDevice#createRenderer(int, int, float[], com.jogamp.opengl.math.FovHVHalves[], float)
. -
getTextureUnit
int getTextureUnit()Returns the desired texture-image unit for post-processing, seeppAvailable()
. -
init
Initialize OpenGL related resources -
dispose
Release all OpenGL related resources -
beginFrame
Notifying that a new frame is about to start. -
endFrame
Notifying that the frame has been rendered completely. -
ppAvailable
boolean ppAvailable()Returnstrue
if stereoscopic post-processing is required and available, otherwisefalse
.Stereoscopic post-processing is available if:
- one of the distortion bits are set, see
getDistortionBits()
If stereoscopic post-processing is used the following post-processing methods must be called to before
#endFrame()
:ppBegin(GL)
ppOneEye(GL, int)
for both eyesppEnd(GL)
- one of the distortion bits are set, see
-
ppBegin
Begin stereoscopic post-processing, seeppAvailable()
.#updateViewerPose(int)
for both eyes must be called upfront when rendering upstreamStereoGLEventListener
.- Parameters:
gl
-
-
ppOneEye
Performs stereoscopic post-processing for one eye, seeppAvailable()
.- Parameters:
gl
-eyeNum
-
-
ppEnd
End stereoscopic post-processing, seeppAvailable()
.- Parameters:
gl
-
-