在什么时候使用纹理作为颜色托盘比使用着色器切换语句更有效?

时间:2013-07-06 07:19:29

标签: opengl glsl vertex-shader

为了提高非常大的对象(并填充GPU ram)的显示性能,在一些相当轻的数学之后,我发现我有一个机会来将我的顶点数据从16字节顶点向下压缩到4个字节的顶点(因为数据在概念上可以被认为是一个变换的高度图 - 从顶点id中提取x和y位置),我可以将Z坐标紧紧包装成30位,留下2个颜色托盘索引的位。无论如何,这是个主意。我的问题不在于坐标包装,而在于颜色包装。

颜色托盘将由加载模型的c ++代码选择。由于它还加载了着色器,我现在正在尝试将颜色查找代码编写为switch语句,即:

int colourIndex = (compressedVertex & Mask) >> bitOffset;
switch (colourIndex)
{
case 0: return vec4(....);
case 1: return vec4(....);
case 2: return vec4(....);
case 3: return vec4(....);
}

如果模型有更多的颜色,那么4,我很舒服地牺牲了一些高度精度,以便适应更多的颜色托盘(最多到一点)。我的测量显示,使用switch语句绑定4色托盘并不慢于绑定4像素1D纹理并使用采样器从中读取。

到目前为止,我已经将它扩展到32种颜色,它看起来至少和使用纹理一样快。

什么时候沙子中的好线路停止使用开关并开始使用纹理进行查找表?如果它有助于我正在开发的应用程序已经实施了OpenGl 3.3的最低要求。一旦数据在卡上,它就永远不会被改变。我可以将其调整为256个案例陈述吗? 1024? 32768?限制在哪里?

(先发制人的回应:是的,我可以继续尝试,并使用试错法和一些内插法在我的单张现代卡上挑选一个对我有用的价值;但我对更好的概念感兴趣练习以及是否有其他人尝试过类似的东西,并且知道它可以在野外锻炼吗?)

1 个答案:

答案 0 :(得分:1)

我避免在着色器中尽可能多地分支。我的建议是使用纹理来进行查找。

你问:

  

我可以将其调整为256个案例陈述吗? 1024? 32768?限制在哪里?

你说:

  

到目前为止,我已经将这种颜色扩展到32种颜色,它似乎至少与使用纹理一样快。

OpenGL在查找纹理时茁壮成长。它的目的就是为了做到这一点。它不是为巨大的开关案例陈述而设计的。正如评论者所说,它不会全面表现良好。 64x64像素纹理可以为您提供4096个查找,从长远来看,在我看来,它会比更多的查找速度更快。