【问题标题】:Modern OpenGL - how to render VBO part in different color现代 OpenGL - 如何以不同颜色渲染 VBO 部分
【发布时间】:2014-07-28 14:07:04
【问题描述】:

我有大的 VBO(100k+ 三角形)并分配了颜色(x、y、z、r、g、b),我想用不同颜色渲染几个选定的三角形(例如,用白色三角形渲染 10000- 10007)。仅渲染提到的 VBO 部分不是问题,但它会以原始颜色渲染。
我想到的解决方案很少,但听起来都很愚蠢:

  • 更改 VBO 部分。工作量太大,当然效率不高(我必须读取和重新解释字节,存储它们,覆盖,渲染和恢复)
  • 添加新的统一 selectedColor 并检查每个片段是否不是黑色(无用条件执行 100k 次)
  • 如上所述,但添加全新着色器只是为了这个简单的任务,避免条件(有这么多着色器很快就会丢失)

知道如何完成如此“简单”的任务吗?

【问题讨论】:

    标签: opengl glsl vbo


    【解决方案1】:

    为什么不直接调整你当前的着色器。只需为颜色添加一个统一变量,并在渲染 VBO 的突出显示部分时上传一个新值。

    如果 VBO 中未突出显示的部分使用一些计算来获取颜色,您可能需要考虑一种方法来合并制服,使其具有“身份”值。这意味着如果您输入所述身份值,您将获得原始颜色。 示例是将计算出的颜色乘以制服的 alpha 分量,然后添加制服的 rgb 部分:computedColor * uniform.a + uniform.rgb。如果您输入值(0,0,0,1),您将获得计算颜色。如果你输入值(r,g,b,0),你会得到统一的颜色,你甚至可以“混合”这两者。

    关于其他建议的解决方案。编辑 VBO 确实听起来很愚蠢,我只会在您的数据动态变化时才这样做,例如软网格或粒子之类的东西,但即便如此,也可能有更好的方法使用变换反馈。与我的建议类似,但不完全是,添加新着色器听起来没有必要。使新程序处于活动状态的上下文切换相当昂贵,可能比我上面建议的简单统一示例更昂贵(可能非常非常)。

    我的观点是,另一种解决方案是找到一些数学公式,以便您利用它来表现得像计算颜色和替换颜色(或替换公式)。这将消除在着色器中放置昂贵的分支等的需要。您也不需要进行昂贵的缓冲区编辑或程序切换。

    【讨论】:

    • 非常聪明,没想到。有什么想法可以在哪里找到比较成本的资源?我的意思是 3 次乘法可能比一个分支更便宜/更贵,或者着色器开关多于 10 万个分支? (大致当然)
    • 基本上是这样的:假设切换程序非常昂贵,除非您的着色器正在执行大量内存访问等(纹理查找或类似操作),否则请避免使用它。基本算术计算速度非常快,分支可能非常昂贵,但并非必须如此。如果您想决定分支是否值得,请先阅读以下内容:http.developer.nvidia.com/GPUGems2/gpugems2_chapter34.html 另外,个人资料!
    【解决方案2】:

    理想情况下,我会在选定的多边形上绘制另一个多边形,在这种情况下,您甚至可以在其中进行一些混合以获得更好的效果。

    【讨论】:

    • 你能指定怎么做吗?绘制 VBO 的一部分不是问题 - 但改变它的颜色是。 (您是否推荐第三个选项,添加新着色器忽略原始颜色并使用统一代替?)
    • 渲染要突出显示某些三角形的整个对象,然后仅使用选定的三角形但另一种颜色渲染另一个 VBO。您甚至可以使用相同的着色器。
    • @wondra 我认为这里最好的是具有统一颜色的新着色器。在内存中拥有另一个 VBO 对我来说似乎是一种浪费。
    • @greenboxal 复制选定的部分,对其进行编辑,然后渲染为另一个 VBO,我做对了吗?
    【解决方案3】:

    您还可以生成一个小的 1D 纹理并为每个顶点发送一个纹理坐标。然后你可以改变纹理数据来修改颜色。

    我猜你需要多少控制。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-27
      • 1970-01-01
      • 2023-04-09
      相关资源
      最近更新 更多