首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为快速顶点缓冲区处理打包2纹理坐标?(WebGL GPU浮式填料)

如何为快速顶点缓冲区处理打包2纹理坐标?(WebGL GPU浮式填料)
EN

Stack Overflow用户
提问于 2014-04-08 01:13:42
回答 1查看 727关注 0票数 0

考虑到以下情况,我想知道在顶点着色器中快速使用2种纹理和弦的智能方法是什么:

  • 两个质感和弦只能是1.0f或0.0f => 1位就足够了
  • 我将不得不将这两个和弦打包到一个GLByte (8位)属性变量中;不过,最好还是保留6位用于其他用途。

我的问题是,我对浮点数的布局并不熟悉,但我可以想象,0.0f中只有1位需要翻转才能变成1.0f --我只是不知道是哪一位;只使用按位操作,这应该是非常快的(顺便说一句:gpu在按位运算方面的速度也比gpu这样的算术快吗?)

EN

回答 1

Stack Overflow用户

发布于 2014-09-18 20:18:43

就像这样,在顶点着色器里:

代码语言:javascript
复制
uv = fract(vertex.xy);
normal = fract(vertex.z);
gl_Position = mvp * vec4(floor(vertex), 1.0)

显然,在存储到VBO之前,顶点xyz必须以最大的纹理分辨率进行缩放,例如256x256在本例中:

代码语言:javascript
复制
vbo.push_back(vertex.mul_xyz_scalar(256.0).floor().add_xyz(uv.x, uv.y, normal));

所以,如果顶点x是.00390625,它就变成1。低于1/256的位置是次正态分布(丢失,在截断上面的地板)。紫外线已经被假定在0-1的范围内。如果你真的坚持,你只需乘以2,而不是256,那么除了0和1以外的任何东西都会丢失。

一句警告。这种技术只有在内存带宽(许多顶点、简单的着色器、典型的非常复杂的静态网格)约束下才能工作。否则,额外的地板()成本的着色器是不值得的,你最好把紫外线和法线一起存储。

最后,所有顶点必须像这样放大256 (如果你使用不同的着色器而没有包装uv/n),或者通过mvp矩阵缩小256 (这通常不会产生额外的开销,除非在没有使用现有矩阵的情况下天真地直接在着色器中完成)。

忍者编辑:这是一个快速的通用函数“字节”包装在浮动。

代码语言:javascript
复制
/*
 * Packed with: (x*32768+y*128+z)/32768.0 where x and y are 0-255, z is 0-127.
 * This function returns x and y in 0-256, and z in 0-1 range, scale to 128 as needed.
 */
void unpack887(in float v, out float x, out float y, out float z)
{
  x = floor(v);
  float rem = (v - x) * 256.0;
  y = floor(rem);
  z = rem - y;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22925880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档