【发布时间】:2016-05-31 07:14:50
【问题描述】:
我正在寻找一种将数据存储在纹理中而不是使用制服的有效方法。目标是将骨骼矩阵存储在纹理中。 我目前正在这样做:
- one RGBA pixel = one float
- (128, 255, 32, 14) = 0.128 255 032 014
它很有效,而且比通过制服传递 var 快得多。不过,我认为做这样一件小事需要大量的计算。
那么您知道从 RGBA 像素构造浮点数的更好方法吗? 有没有一种内置方法可以从几个 RGBA 像素构造一个 4*4 矩阵?
【问题讨论】:
-
"它可以工作,而且比通过制服传递 var 快得多。" 你怎么认为它更快?您尚未读取 等量 量的数据。
-
假设你没有原生浮点纹理支持你仍然可以pack your data like this。老实说,虽然在极少数情况下纹理读取会“比通过制服传递 vars 快得多”......
-
感谢您的回答。我说它更快,因为我有一个身体(83 块骨头,126 000 个三角形),我尝试了两种方法。第一种方法,我通过制服传递预先计算的矩阵,我得到了 340 FPS。第二种方法,我绑定一个存储矩阵的纹理,我得到了 390 FPS。感谢您的链接,我会看看这个(但我需要一些时间才能正确理解)。我认为纹理读取可以比制服更快,因为纹理读取只使用 GPU,而制服使用 CPU-GPU 流,据我所知,这是当今 3d API 最大的弱点。
-
经过测试,完美运行,再次感谢。说到性能,成本几乎为零。我目前正在以 449 FPS(340 使用标准统一矩阵而不是纹理存储矩阵)运行我的测试模型。我试图用一个简单的单位矩阵替换纹理中的矩阵构造,但我只获得了 3 FPS。所以我觉得值得。我的模型有 83 个骨骼,126 000 个三角形,每个顶点最多可以有 8 个骨骼,所以我认为这个测试具有足够的代表性。
-
你的目标 openGL 版本是什么?我的意思是您也可以只使用浮动纹理 (GL_R32F)、UBO、SSBO 之类的东西……有很多选择。