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 interfaceInterface describing one eye of the stereoscopic device, seegetEye(int). -
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final intDistortion Bit: Barrel distortion compensating lens pincushion distortionstatic final intDistortion Bit: Chromatic distortion compensating lens chromatic aberration.static final intDistortion Bit: Timewarp distortion technique to predictViewerPosemovement to reduce latency.static final intDistortion Bit: Vignette distortion compensating lens chromatic aberration. -
Method Summary
Modifier and TypeMethodDescriptionvoidbeginFrame(GL gl) Notifying that a new frame is about to start.voidRelease all OpenGL related resourcesvoidNotifying that the frame has been rendered completely.Returns theStereoDeviceof thisStereoDeviceRendererinstance.intReturns used distortion compensation bits, e.g.getEye(int eyeNum) Returns theStereoDeviceRenderer.Eyeinstance for the denotedeyeNum.Returns the surface size for each eye's a single image in pixel units.Returns the lastViewerPose.intReturns the used texture-image count for post-processing, seeppAvailable().intReturns the desired texture-image unit for post-processing, seeppAvailable().Returns the total surface size required for the complete images in pixel units.voidInitialize OpenGL related resourcesbooleanReturnstrueif stereoscopic post-processing is required and available, otherwisefalse.voidBegin stereoscopic post-processing, seeppAvailable().voidEnd stereoscopic post-processing, seeppAvailable().voidPerforms stereoscopic post-processing for one eye, seeppAvailable().Updates theViewerPoseand returns it.booleanMethod returnstrueif 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 predictViewerPosemovement to reduce latency.FIXME: Explanation needs refinement!
- See Also:
-
-
Method Details
-
getDevice
StereoDevice getDevice()Returns theStereoDeviceof thisStereoDeviceRendererinstance. -
getEye
Returns theStereoDeviceRenderer.Eyeinstance for the denotedeyeNum. -
updateViewerPose
ViewerPose updateViewerPose()Updates theViewerPoseand 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 returnstrueif 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-processingis utilized to mergetexturesto 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()Returnstrueif 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-
-