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

use*_*705 5 opengl glsl vertex-shader

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

颜色托盘将由加载模型的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(....);
}
Run Code Online (Sandbox Code Playgroud)

如果模型有更多的颜色然后4,我很舒服牺牲高度精度,以适应更多的颜色托盘(无论如何).我的测量表明,使用switch语句绑定4色托盘并不慢,然后绑定4像素1D纹理并使用采样器从中读取.

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

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

(先发制人的回应:是的我可以继续尝试并使用试错法和一些内插法在我的单张现代卡片上挑选一个对我有用的价值;但我对更好地了解什么是最佳做法以及是否还有其他人尝试过类似的东西并知道它可以在野外锻炼吗?)

bad*_*sel 2

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

你问:

我可以将其增加到 256 个 case 语句吗?1024?32768?极限在哪里?

你说:

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

OpenGL 在查找纹理方面表现出色。它就是为了做到这一点而设计的。它不是为巨大的 switch case 语句而设计的。正如评论者所说,它不会全面表现良好。64x64 像素纹理可以为您提供 4096 次查找,从长远来看,我认为,查找次数越多,速度会更快。