function Billboard(options, billboardCollection) {
  options = options ?? Frozen.EMPTY_OBJECT;

  //>>includeStart('debug', pragmas.debug);
  if (
    defined(options.disableDepthTestDistance) &&
    options.disableDepthTestDistance < 0.0
  ) {
    throw new DeveloperError(
      "disableDepthTestDistance must be greater than or equal to 0.0.",
    );
  }
  //>>includeEnd('debug');

  let translucencyByDistance = options.translucencyByDistance;
  let pixelOffsetScaleByDistance = options.pixelOffsetScaleByDistance;
  let scaleByDistance = options.scaleByDistance;
  let distanceDisplayCondition = options.distanceDisplayCondition;
  if (defined(translucencyByDistance)) {
    //>>includeStart('debug', pragmas.debug);
    if (translucencyByDistance.far <= translucencyByDistance.near) {
      throw new DeveloperError(
        "translucencyByDistance.far must be greater than translucencyByDistance.near.",
      );
    }
    //>>includeEnd('debug');
    translucencyByDistance = NearFarScalar.clone(translucencyByDistance);
  }
  if (defined(pixelOffsetScaleByDistance)) {
    //>>includeStart('debug', pragmas.debug);
    if (pixelOffsetScaleByDistance.far <= pixelOffsetScaleByDistance.near) {
      throw new DeveloperError(
        "pixelOffsetScaleByDistance.far must be greater than pixelOffsetScaleByDistance.near.",
      );
    }
    //>>includeEnd('debug');
    pixelOffsetScaleByDistance = NearFarScalar.clone(
      pixelOffsetScaleByDistance,
    );
  }
  if (defined(scaleByDistance)) {
    //>>includeStart('debug', pragmas.debug);
    if (scaleByDistance.far <= scaleByDistance.near) {
      throw new DeveloperError(
        "scaleByDistance.far must be greater than scaleByDistance.near.",
      );
    }
    //>>includeEnd('debug');
    scaleByDistance = NearFarScalar.clone(scaleByDistance);
  }
  if (defined(distanceDisplayCondition)) {
    //>>includeStart('debug', pragmas.debug);
    if (distanceDisplayCondition.far <= distanceDisplayCondition.near) {
      throw new DeveloperError(
        "distanceDisplayCondition.far must be greater than distanceDisplayCondition.near.",
      );
    }
    //>>includeEnd('debug');
    distanceDisplayCondition = DistanceDisplayCondition.clone(
      distanceDisplayCondition,
    );
  }

  this._show = options.show ?? true;
  this._position = Cartesian3.clone(options.position ?? Cartesian3.ZERO);
  this._actualPosition = Cartesian3.clone(this._position); // For columbus view and 2D
  this._pixelOffset = Cartesian2.clone(options.pixelOffset ?? Cartesian2.ZERO);
  this._translate = new Cartesian2(0.0, 0.0); // used by labels for glyph vertex translation
  this._eyeOffset = Cartesian3.clone(options.eyeOffset ?? Cartesian3.ZERO);
  this._heightReference = options.heightReference ?? HeightReference.NONE;
  this._verticalOrigin = options.verticalOrigin ?? VerticalOrigin.CENTER;
  this._horizontalOrigin = options.horizontalOrigin ?? HorizontalOrigin.CENTER;
  this._scale = options.scale ?? 1.0;
  this._color = Color.clone(options.color ?? Color.WHITE);
  this._rotation = options.rotation ?? 0.0;
  this._alignedAxis = Cartesian3.clone(options.alignedAxis ?? Cartesian3.ZERO);
  this._width = options.width;
  this._height = options.height;
  this._scaleByDistance = scaleByDistance;
  this._translucencyByDistance = translucencyByDistance;
  this._pixelOffsetScaleByDistance = pixelOffsetScaleByDistance;
  this._sizeInMeters = options.sizeInMeters ?? false;
  this._distanceDisplayCondition = distanceDisplayCondition;
  this._disableDepthTestDistance = options.disableDepthTestDistance;
  this._id = options.id;
  this._collection = options.collection ?? billboardCollection; // Used only for pick ids

  this._pickId = undefined;
  this._pickPrimitive = options._pickPrimitive ?? this;

  this._billboardCollection = billboardCollection;
  this._dirty = false;
  this._index = -1; // Used only by BillboardCollection
  this._batchIndex = undefined; // Used only by Vector3DTilePoints and BillboardCollection

  this._imageTexture = new BillboardTexture(billboardCollection);
  this._imageWidth = undefined;
  this._imageHeight = undefined;

  this._labelDimensions = undefined;
  this._labelHorizontalOrigin = undefined;
  this._labelTranslate = undefined;

  const image = options.image;
  let imageId = options.imageId;
  if (defined(image)) {
    if (!defined(imageId)) {
      if (typeof image === "string") {
        imageId = image;
      } else if (defined(image.src)) {
        imageId = image.src;
      } else {
        imageId = createGuid();
      }
    }

    this._imageTexture.loadImage(imageId, image);
  }

  if (defined(options.imageSubRegion)) {
    this._imageTexture.addImageSubRegion(imageId, options.imageSubRegion);
  }

  this._actualClampedPosition = undefined;
  this._removeCallbackFunc = undefined;
  this._mode = SceneMode.SCENE3D;

  this._clusterShow = true;
  this._outlineColor = Color.clone(options.outlineColor ?? Color.BLACK);
  this._outlineWidth = options.outlineWidth ?? 0.0;

  this._updateClamping();

  this._splitDirection = options.splitDirection ?? SplitDirection.NONE;
}
<div class="notice">
A billboard is created and its initial
properties are set by calling {@link BillboardCollection#add}. Do not call the constructor directly.
</div>
A viewport-aligned image positioned in the 3D scene, that is created
and rendered using a {@link BillboardCollection}.
<br /><br />
<div align='center'>
<img src='Images/Billboard.png' width='400' height='300' /><br />
Example billboards
</div>

@alias Billboard

@performance Reading a property, e.g., {@link Billboard#show}, is constant time.
Assigning to a property is constant time but results in
CPU to GPU traffic when {@link BillboardCollection#update} is called.  The per-billboard traffic is
the same regardless of how many properties were updated.  If most billboards in a collection need to be
updated, it may be more efficient to clear the collection with {@link BillboardCollection#removeAll}
and add new billboards instead of modifying each one.

@exception {DeveloperError} scaleByDistance.far must be greater than scaleByDistance.near
@exception {DeveloperError} translucencyByDistance.far must be greater than translucencyByDistance.near
@exception {DeveloperError} pixelOffsetScaleByDistance.far must be greater than pixelOffsetScaleByDistance.near
@exception {DeveloperError} distanceDisplayCondition.far must be greater than distanceDisplayCondition.near

@see BillboardCollection
@see BillboardCollection#add
@see Label

@internalConstructor
@class

@param {Billboard.ConstructorOptions} options Object describing initialization options
@param {BillboardCollection} billboardCollection Instance of BillboardCollection

@demo {@link https://sandcastle.cesium.com/index.html?src=Billboards.html|Cesium Sandcastle Billboard Demo}