Unifrom缓冲区对象中成员的对齐

时间:2016-10-24 23:24:05

标签: opengl

我有Uniform缓冲区对象:

layout (std140) uniform ubo{
    vec3 A;
    float B;
    vec4 C;
    vec4 D;
    vec4 E;
    vec4 F;
    float G;
};

我假设每个人的偏移为A:0,B:12,C:16,D:32 E:48 F:64 G:80

但如果我将所有这些都用作vec4s,那么它似乎并非如此。 他们每个人的抵消会是什么?

我尝试了这些新的补偿: 答:0,B:16,C:32,D:48 E:64 F:80 G:96但它仍然无法正常工作

1 个答案:

答案 0 :(得分:-1)

来自ARB_uniform_buffer_object

  (1) If the member is a scalar consuming <N> basic machine units, the
      base alignment is <N>.

  (2) If the member is a two- or four-component vector with components
      consuming <N> basic machine units, the base alignment is 2<N> or
      4<N>, respectively.

  (3) If the member is a three-component vector with components consuming
      <N> basic machine units, the base alignment is 4<N>.

  (4) If the member is an array of scalars or vectors, the base alignment
      and array stride are set to match the base alignment of a single
      array element, according to rules (1), (2), and (3), and rounded up
      to the base alignment of a vec4. The array may have padding at the
      end; the base offset of the member following the array is rounded up
      to the next multiple of the base alignment.

  (5) If the member is a column-major matrix with <C> columns and <R>
      rows, the matrix is stored identically to an array of <C> column
      vectors with <R> components each, according to rule (4).

  (6) If the member is an array of <S> column-major matrices with <C>
      columns and <R> rows, the matrix is stored identically to a row of
      <S>*<C> column vectors with <R> components each, according to rule
      (4).

  (7) If the member is a row-major matrix with <C> columns and <R> rows,
      the matrix is stored identically to an array of <R> row vectors
      with <C> components each, according to rule (4).

  (8) If the member is an array of <S> row-major matrices with <C> columns
      and <R> rows, the matrix is stored identically to a row of <S>*<R>
      row vectors with <C> components each, according to rule (4).

  (9) If the member is a structure, the base alignment of the structure is
      <N>, where <N> is the largest base alignment value of any of its
      members, and rounded up to the base alignment of a vec4. The
      individual members of this sub-structure are then assigned offsets 
      by applying this set of rules recursively, where the base offset of
      the first member of the sub-structure is equal to the aligned offset
      of the structure. The structure may have padding at the end; the 
      base offset of the member following the sub-structure is rounded up
      to the next multiple of the base alignment of the structure.

  (10) If the member is an array of <S> structures, the <S> elements of
       the array are laid out in order, according to rule (9).

根据规范,每个vec3计为vec4。我认为只会给你带来麻烦,这只是一件惊喜。