sig
  type raster_face_cull = [ `Back | `Front ]
  type raster = {
    raster_face_cull : Lit.Effect.raster_face_cull option;
    raster_multisample : bool;
  }
  val raster_default : Lit.Effect.raster
  type depth_test =
      [ `Always
      | `Equal
      | `Gequal
      | `Greater
      | `Lequal
      | `Less
      | `Nequal
      | `Never ]
  type depth = {
    depth_test : Lit.Effect.depth_test option;
    depth_write : bool;
    depth_offset : float * float;
  }
  val depth_default : Lit.Effect.depth
  type blend_mul =
      [ `Cst
      | `Cst_a
      | `Dst
      | `Dst_a
      | `One
      | `One_minus_cst
      | `One_minus_cst_a
      | `One_minus_dst
      | `One_minus_dst_a
      | `One_minus_src
      | `One_minus_src1
      | `One_minus_src1_a
      | `One_minus_src_a
      | `Src
      | `Src1
      | `Src1_a
      | `Src_a
      | `Src_a_saturate
      | `Zero ]
  type blend_eq =
      [ `Add of Lit.Effect.blend_mul * Lit.Effect.blend_mul
      | `Max
      | `Min
      | `Rev_sub of Lit.Effect.blend_mul * Lit.Effect.blend_mul
      | `Sub of Lit.Effect.blend_mul * Lit.Effect.blend_mul ]
  val blend_eq_default : Lit.Effect.blend_eq
  type blend = {
    blend : bool;
    blend_rgb : Lit.Effect.blend_eq;
    blend_a : Lit.Effect.blend_eq;
    blend_cst : Gg.color;
  }
  val blend_default : Lit.Effect.blend
  val blend_alpha : Lit.Effect.blend
  type t = Lit.effect
  val create :
    ?raster:Lit.Effect.raster ->
    ?depth:Lit.Effect.depth ->
    ?blend:Lit.Effect.blend ->
    ?uniforms:Lit.Uniform.set -> Lit.prog -> Lit.effect
  val prog : Lit.effect -> Lit.prog
  val uniforms : Lit.effect -> Lit.Uniform.set
  val get_uniform : Lit.effect -> 'Lit.uniform -> Lit.Uniform.value_untyped
  val set_uniform : Lit.effect -> 'Lit.uniform -> '-> unit
  val raster : Lit.effect -> Lit.Effect.raster
  val depth : Lit.effect -> Lit.Effect.depth
  val blend : Lit.effect -> Lit.Effect.blend
end