Class OVRMultiview
The method of stereo rendering supported in OpenGL is currently achieved by rendering to the two eye buffers sequentially. This typically incurs double the application and driver overhead, despite the fact that the command streams and render states are almost identical.
This extension seeks to address the inefficiency of sequential multiview rendering by adding a means to render to multiple elements of a 2D texture
array simultaneously. In multiview rendering, draw calls are instanced into each corresponding element of the texture array. The vertex program uses a
new gl_ViewID_OVR
variable to compute per-view values, typically the vertex position and view-dependent variables like reflection.
The formulation of this extension is high level in order to allow implementation freedom. On existing hardware, applications and drivers can realize the benefits of a single scene traversal, even if all GPU work is fully duplicated per-view. But future support could enable simultaneous rendering via multi-GPU, tile-based architectures could sort geometry into tiles for multiple views in a single pass, and the implementation could even choose to interleave at the fragment level for better texture cache utilization and more coherent fragment shader branching.
The most obvious use case in this model is to support two simultaneous views: one view for each eye. However, we also anticipate a usage where two views are rendered per eye, where one has a wide field of view and the other has a narrow one. The nature of wide field of view planar projection is that the sample density can become unacceptably low in the view direction. By rendering two inset eye views per eye, we can get the required sample density in the center of projection without wasting samples, memory, and time by oversampling in the periphery.
Requires OpenGL 3.0
.
-
Field Summary
Modifier and TypeFieldDescriptionstatic final int
Accepted by thepname
parameter ofGetFramebufferAttachmentParameteriv
.static final int
Accepted by thepname
parameter ofGetFramebufferAttachmentParameteriv
.static final int
Returned byCheckFramebufferStatus
.static final int
Accepted by thepname
parameter of GetIntegerv. -
Method Summary
Modifier and TypeMethodDescriptionstatic void
glFramebufferTextureMultiviewOVR
(int target, int attachment, int texture, int level, int baseViewIndex, int numViews) Operates similarly to theFramebufferTextureLayer
command, except thatbaseViewIndex
andnumViews
select a range of texture array elements that will be targeted when rendering.static void
glNamedFramebufferTextureMultiviewOVR
(int framebuffer, int attachment, int texture, int level, int baseViewIndex, int numViews)
-
Field Details
-
GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_OVR
public static final int GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_OVRAccepted by thepname
parameter ofGetFramebufferAttachmentParameteriv
.- See Also:
-
GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_OVR
public static final int GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_OVRAccepted by thepname
parameter ofGetFramebufferAttachmentParameteriv
.- See Also:
-
GL_MAX_VIEWS_OVR
public static final int GL_MAX_VIEWS_OVRAccepted by thepname
parameter of GetIntegerv.- See Also:
-
GL_FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_OVR
public static final int GL_FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_OVRReturned byCheckFramebufferStatus
.- See Also:
-
-
Method Details
-
glFramebufferTextureMultiviewOVR
public static void glFramebufferTextureMultiviewOVR(int target, int attachment, int texture, int level, int baseViewIndex, int numViews) Operates similarly to theFramebufferTextureLayer
command, except thatbaseViewIndex
andnumViews
select a range of texture array elements that will be targeted when rendering. Such an attachment is considered multiview and rendering commands issued when such a framebuffer object is bound are termed "multiview rendering". The maximum number of views which can be bound simultaneously is determined by the value ofMAX_VIEWS_OVR
, which can be queried with theGetIntegerv
command.The command
View( uint id );
does not exist in the GL, but is used here to describe the multiview functionality in this section. The effect of this hypothetical function is to set the value of the shader built-in input
gl_ViewID_OVR
.When multiview rendering is enabled, the
Clear
,ClearBuffer*
,Draw*
, andDispatch*
commands have the same effect as:for( int i = 0; i < numViews; i++ ) { FramebufferTextureLayer( target, attachment, texture, level, baseViewIndex + i ); View( i ); <drawing-command> }
The result is that every drawing command is broadcast into every active view. The shader uses
gl_ViewID_OVR
to compute view dependent outputs.The number of views, as specified by
numViews
, must be the same for all framebuffer attachments points where the value ofFRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
is notNONE
or the framebuffer is incomplete.If
texture
is non-zero and the command does not result in an error, the framebuffer attachment state corresponding toattachment
is updated as in theFramebufferTextureLayer
command, except that the values ofFRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER
andFRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_OVR
are is set tobaseViewIndex
, and the value ofFRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_OVR
is set tonumViews
.Errors
In addition to the corresponding errors for
FramebufferTextureLayer
when called with the same parameters (other thanlayer
):An
INVALID_VALUE
error is generated if:numViews
is less than 1 or ifnumViews
is greater thanMAX_VIEWS_OVR
.texture
is a two-dimensional array texture andbaseViewIndex
+numViews
is larger than the value ofMAX_ARRAY_TEXTURE_LAYERS
minus one.texture
is non-zero andbaseViewIndex
is negative.
An
INVALID_OPERATION
error is generated if texture is non-zero and is not the name of a two-dimensional array texture.- Parameters:
target
- the framebuffer target. One of:FRAMEBUFFER
READ_FRAMEBUFFER
DRAW_FRAMEBUFFER
attachment
- the attachment point of the framebuffer. One of:texture
- the texture object to attach to the framebuffer attachment point named byattachment
level
- the mipmap level oftexture
to attachbaseViewIndex
- the base framebuffer texture layer indexnumViews
- the number of views to target when rendering
-
glNamedFramebufferTextureMultiviewOVR
public static void glNamedFramebufferTextureMultiviewOVR(int framebuffer, int attachment, int texture, int level, int baseViewIndex, int numViews) - Parameters:
framebuffer
- the framebuffer nameattachment
- the attachment point of the framebuffer. One of:texture
- the texture object to attach to the framebuffer attachment point named byattachment
level
- the mipmap level oftexture
to attach
-