现代OpenGL - 如何以不同的颜色渲染VBO部分

时间:2014-07-28 14:07:04

标签: opengl glsl vbo

我有大的VBO(100k +三角形)和指定的颜色(x,y,z,r,g,b),我想渲染一些不同颜色的选定三角形(例如,渲染为白色三角形10000) 10007)。渲染只提到VBO的一部分不是问题,但它会以原始颜色呈现。
很少有解决方案出现在我的脑海中,但它们听起来都非常愚蠢:

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

任何想法如何实现如此简单"任务?

3 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

取决于我猜你需要多少控制权。