考虑到以下情况,我想知道在顶点着色器中快速使用2种纹理和弦的智能方法是什么:
我的问题是,我对浮点数的布局并不熟悉,但我可以想象,0.0f中只有1位需要翻转才能变成1.0f --我只是不知道是哪一位;只使用按位操作,这应该是非常快的(顺便说一句:gpu在按位运算方面的速度也比gpu这样的算术快吗?)
发布于 2014-09-18 20:18:43
就像这样,在顶点着色器里:
uv = fract(vertex.xy);
normal = fract(vertex.z);
gl_Position = mvp * vec4(floor(vertex), 1.0)显然,在存储到VBO之前,顶点xyz必须以最大的纹理分辨率进行缩放,例如256x256在本例中:
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 (这通常不会产生额外的开销,除非在没有使用现有矩阵的情况下天真地直接在着色器中完成)。
忍者编辑:这是一个快速的通用函数“字节”包装在浮动。
/*
* 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;
}https://stackoverflow.com/questions/22925880
复制相似问题