Name

    NV_3dvision_settings

Name Strings

    GL_NV_3dvision_settings

Contributors

    Mathias Heyer, NVIDIA
    Swaminathan Narayanan, NVIDIA
    Greg Roth, NVIDIA

Contact

    Greg Roth, NVIDIA (groth 'at' nvidia.com)

Status

    Complete

Version

    Last Modified Date: 05 Oct 2012
    Revision: 5

Number

    OpenGL ES Extension #129

Dependencies

    Written based on the wording of the OpenGL ES 2.0.25 specification

    OpenGL ES 2.0 is required.

    EGL_NV_3dvision_surface is used to specify a surface
    with support for these features explicitly enabled.

Overview

    NVIDIA 3D Vision provides stereoscopic 3d rendering without
    requiring applications to change their rendering methods. However
    there are cases where applications can benefit from adjusting 3D
    vision parameters directly to experiment with this functionality in
    applications not yet known to 3D Vision, to assist 3D Vision in
    setting parameters correctly for unusual situations, or to present
    application-specific user-accessible controls for 3D Vision
    parameters.

    This extension provides the ability to query the current stereo
    settings and adjust them as necessary.

IP Status

    NVIDIA Proprietary

New Procedures and Functions

    void StereoParameterfNV(enum pname, float param);
    void StereoParameteriNV(enum pname, int param);

New Tokens

    Accepted by the <value> parameter of GetBooleanv, GetIntegerv,
    and GetFloatv, and the <cap> parameter of isEnabled, Enable, and
    Disable:

        3DVISION_STEREO_NV                   0x90F4

    Accepted by the <value> parameter of GetBooleanv, GetIntegerv,
    and GetFloatv and the <param> parameter of StereoParameterfNV,
    and StereoParameteriNV:

        STEREO_SEPARATION_NV                 0x90F5
        STEREO_CONVERGENCE_NV                0x90F6
        STEREO_CUTOFF_NV                     0x90F7
        STEREO_PROJECTION_NV                 0x90F8

    Accepted by the <param> parameter of StereoParameterfNV and
    StereoParameteriNV and returned by GetBooleanv, GetIntegerv, and
    GetFloatv when <value> is STEREO_PROJECTION_NV.

        STEREO_PROJECTION_PERSPECTIVE_NV     0x90F9
        STEREO_PROJECTION_ORTHO_NV           0x90FA

Changes to Chapter 4 of the OpenGL ES 2.0.25 Specification (Per-Fragment
Operations and the Frame Buffer)
  
    Add to section 4.2.1, "Selecting a Buffer for Writing":

    If the bound draw surface is auto stereo enabled and 3d Vision
    rendering is enabled in the GL, color values are written to left and
    right buffers with adjustments according to current separation and
    convergence values.

    Add subsection 4.2.x, "Stereo Parameters":

    3D Vision stereo capability may be enabled at surface creation. If
    the bound draw surface is auto stereo capable, 3D Vision rendering
    can be enabled and disabled by calling Enable or Disable with the
    symbolic constant 3DVISION_STEREO_NV. If the current draw surface is
    not auto stereo capable, enabling 3D Vision rendering has no
    effect. The current state of 3D Vision rendering may be queried
    using isEnabled with <cap> set to 3DVISION_STEREO_NV.

    Various parameters control how 3D Vision stereo rendering is
    performed. Each parameter is set by calling

        void StereoParameter{if}NV(enum pname, T param);

    <pname> is a symbolic constant indicating the parameter to be set.

    If <pname> is STEREO_PROJECTION_NV, then <param> specifies the
    method of rendering 3D Vision will use. <param> must be
    STEREO_PROJECTION_PERSPECTIVE_NV or STEREO_PROJECTION_ORTHO_NV
    identifying the projection type used. If <param> has any other
    value, an INVALID_ENUM error is generated. The current 3D Vision
    stereo method is queried by calling GetIntegerv with <pname> set to
    STEREO_PROJECTION_NV. The initial value of STEREO_PROJECTION_NV is
    STEREO_PROJECTION_PERSPECTIVE_NV, but may differ for contexts
    created with a 3D Vision profile in effect.

    If <pname> is STEREO_SEPARATION_NV, then <param> specifies the
    separation value used in 3D Vision stereo rendering. The current
    separation value is queried by calling GetFloatv with <pname> set
    to STEREO_SEPARATION_NV. The initial value of STEREO_PROJECTION_NV
    depends on 3D Vision system settings at the time the context was
    created. The separation value indicates a percentage. If <param> is
    less than zero or greater than 100, an INVALID_VALUE error is
    generated.

    If <pname> is STEREO_CONVERGENCE_NV, then <param> specifies the
    convergence value used in 3D Vision stereo rendering. The current
    convergence value is queried by calling GetFloatv with <pname> set
    to STEREO_CONVERGENCE_NV. The initial value of STEREO_CONVERGENCE-
    _NV is zero, but may differ for contexts created with a 3D Vision
    profile in effect.

    If <pname> is STEREO_CUTOFF_NV,  then <param> specifies the
    separation cutoff value used in 3D Vision stereo rendering. The
    current separation cutoff value is queried by calling GetFloatv
    with <pname> set to STEREO_CUTOFF_NV. The initial value of
    STEREO_CUTOFF_NV is zero, but may differ for contexts created with a
    3D Vision profile in effect.

    Otherwise, INVALID_ENUM is generated.

    Setting stereo parameters on a context that does not support 3D
    Vision rendering has no effect on rendering.

    The state required to implement these stereo parameters is three
    floats and one integer.

Errors

    The error INVALID_ENUM is generated if StereoParameter{if} is
    called where <pname> is an unsupported enum value.

    The error INVALID_ENUM is generated if StereoParameter{if} is
    called where <pname> is STEREO_PROJECTION_NV and <param> is an
    unsupported enum value.

New State

    Add new table "Stereo State"
    Get Value                     Type    Get Command  Initial Value        Description                Sec
    ---------                     ----    -----------  -------------        -----------                ------
    3DVISION_STEREO_NV            B       isEnabled    see 4.2.x            3D Vision stereo enable     4.2.x
    STEREO_SEPARATION_NV          R       GetFloatv    see 4.2.x            3D Vision separation        4.2.x
    STEREO_CONVERGENCE_NV         R       GetFloatv    see 4.2.x            3D Vision convergence       4.2.x
    STEREO_CUTOFF_NV              R       GetFloatv    see 4.2.x            3D Vision separation cutoff 4.2.x
    STEREO_PROJECTION_NV          Z       GetIntegerv  see 4.2.x            3D Vision projection method 4.2.x

Issues

    1. What are the default values of 3D Vision stereo parameters?

    RESOLVED: The default values depend on the application being run and
    current system 3D Vision settings. For all but separation, defaults
    for an application with no 3D Vision profile. GL contexts created
    for Applications with established stereo profiles will have
    different default values for stereo parameters.

    2. Should method settings be included?

    RESOLVED: Yes, but in a form that makes sense to the user. Internal
    method settings have many forms, but all the user needs be concerned
    with are orthographic and perspective settings. For Applications
    controlled by application detection, changing this is inadvisable.
    Applications that use context creation attributes to enable 3D
    Vision may have to set the method explicitly.

    3. Should descriptions of how these settings are used by 3D Vision
    be included here?

    RESOLVED: No. This functionality is extensively documented in
    existing 3D Vision documents such as "NVIDIA 3D Vision Automatic Best
    Practices". Merging these explanations into the OpenGL document and
    maintaining them won't add any additional clarity to the functionality
    and may limit the underlying implementation.


    4. What is the behavior of GL calls that may use a 3D Vision surface
    such as ReadPixels, CopyTex[Sub]Image, and BlitFramebuffer?

    RESOLVED: The current implementation makes calls that expect a
    single surface by definition such as ReadPixels read from the left
    buffer only. Calls that permit the number of surfaces to be
    abstracted behind objects that have no direct interaction with the
    user application such as CopyTexImage and BlitFramebuffer sample
    from both surfaces of the source when available to copy to the
    corresponding destination surfaces.

    The intent of this extension is to provide a 3D Vision support
    that is as transparent to the developer as possible. Introducing the
    ability to select which buffer is read from breaks the notion of the
    application that what was developed as a single buffer is
    represented as two surfaces when 3D Vision is enabled. Furthermore,
    this matches behavior of 3D Vision enabled applications that do not
    make use of this extension.

    It's possible that this approach may cause problems with particular
    applications that make meaningful use of ReadPixels. Such
    incidents are not expected to be common. Where they arise, the 3D
    Vision implementation may change to accomodate them. It is in
    keeping with one purpose of this extension to test new development
    with 3D Vision to identify interaction problems before it becomes
    publicly available. By keeping with the current implementation,
    these conflicts can be identified and resolved beforehand. This is
    one such conflict that may be identified and addressed either by the
    application developer or through communication with the extension
    implementor.

    Because the implementation may change according to future
    requirements, this extension makes no changes to the corresponding
    documentation in the specification to enable future implementation
    changes that may do something different. Conceptually, the behavior
    of this functionality does not change any more than that of the draw
    calls.

Revision History

    Rev.    Date        Author      Changes
    ----  ------------- ---------   ----------------------------------------
      5   05 Oct 2012   groth       Add issue addressing ReadPixels.
      4   15 Dec 2011   groth       Refine default values. Add invalid value errors
      3   02 Dec 2011   groth       Restore method settings in limited form
      2   11 Nov 2011   groth       Remove method query and settings
      1   08 Nov 2011   groth       Initial version

