gpt4 book ai didi

opengl-es - OpenGL : Single vertex attribute for multiple vertices?

转载 作者:行者123 更新时间:2023-12-03 23:54:28 31 4
gpt4 key购买 nike

我有一个接受以下属性的顶点着色器:

  • a_posCoord : 顶点位置
  • a_texCoord : 纹理坐标(传递给片段着色器)
  • a_alpha : 透明度因子(传递给片段着色器)

  • 我正在渲染的对象都是“广告牌”(一对直角三角形组成一个矩形)。

    我正在使用单个调用 glDrawArrays渲染 许多广告牌,每个广告牌都可能具有唯一的 alpha 值。一个广告牌有 6 个顶点。下面是一些伪代码来说明我如何为单个广告牌组织顶点属性缓冲区:
    vertexAttributes = [

    px1,py1,pz1, // vertex 1: a_posCoord
    tx1,ty1, // vertex 1: a_texCoord
    alpha, // vertex 1: a_alpha

    px2,py2,pz2, // vertex 2: a_posCoord
    tx2,ty2, // vertex 2: a_texCoord
    alpha, // vertex 2: a_alpha

    px3,py3,pz3, // vertex 3: a_posCoord
    tx3,ty3, // vertex 3: a_texCoord
    alpha, // vertex 3: a_alpha

    px4,py4,pz4, // vertex 4: a_posCoord
    tx4,ty4, // vertex 4: a_texCoord
    alpha, // vertex 4: a_alpha

    px5,py5,pz5, // vertex 5: a_posCoord
    tx5,ty5, // vertex 5: a_texCoord
    alpha, // vertex 5: a_alpha

    px6,py6,pz6, // vertex 6: a_posCoord
    tx6,ty6, // vertex 6: a_texCoord
    alpha // vertex 6: a_alpha

    // ... Many more billboards not shown ...
    ];

    注意 alpha值重复 6 次,每个顶点一次。

    有没有一种方法可以为所有 6 个顶点指定一个属性,而无需为每个单独的顶点重复它?

    这是我希望我的顶点属性缓冲区的样子,以减少缓冲区的大小:
    vertexAttributes = [
    px1,py1,pz1, // vertex 1: a_posCoord
    tx1,ty1, // vertex 1: a_texCoord

    px2,py2,pz2, // vertex 2: a_posCoord
    tx2,ty2, // vertex 2: a_texCoord

    px3,py3,pz3, // vertex 3: a_posCoord
    tx3,ty3, // vertex 3: a_texCoord

    px4,py4,pz4, // vertex 4: a_posCoord
    tx4,ty4, // vertex 4: a_texCoord

    px5,py5,pz5, // vertex 5: a_posCoord
    tx5,ty5, // vertex 5: a_texCoord

    px6,py6,pz6, // vertex 6: a_posCoord
    tx6,ty6, // vertex 6: a_texCoord

    alpha // vertex 1-6: a_alpha

    // ... Many more billboards not shown ...
    ];

    对于它的值(value),我目前的解决方案工作得很好,但让我觉得很脏。我才刚刚开始掌握使用 glVertexAttribPointer并且想知道它是否以某种方式支持这样的东西,或者是否有不同的方法或技术可以用来实现不那么蛮力的东西。

    这更具体地说是一个 WebGL 问题,但我对一般意义上的 OpenGL 感到好奇。

    我知道几何着色器确实是这个特定示例所需要的,但这是不可能的,因为它们目前在 WebGL 中不受支持。

    最佳答案

    顶点不是位置顶点是由多个属性组成的长向量。改变一个单一的属性,你最终会得到一个不同的顶点。所以不,你不能对多个顶点使用单个顶点属性,因为这在语义上没有意义。

    然而,较新版本的 OpenGL 可能会设置某个顶点属性的缓冲区偏移量的前进速率。实际上,这意味着给定顶点数组的数据在属性的缓冲区偏移量增加之前被复制到 n 个顶点。设置这个除数的函数是glVertexAttribDivisor .在您的情况下,您将为 alpha 数组设置 6 的绑定(bind)除数。但重要的是,这不会对多个顶点使用单个属性,但它会使 OpenGL 执行您为您执行的重复操作。

    关于opengl-es - OpenGL : Single vertex attribute for multiple vertices?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14169228/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com