[英]How do you pack one 32bit int Into 4, 8bit ints in glsl / webgl?
[英]WebGL 32bit floats in vertex shader
有什么方法可以在WebGL着色器中获得32位浮点数吗? 我有很多数据打包成4个无符号字节,我宁愿不将其拆分为三个字节,因为这会在客户端增加许多计算。
例如,对于三对打包数据,我显然更喜欢这种布局:
|u0 u1 u2 u3|u4 u5 u6 u7|u8 u9 u10 u11|
比这个:
|u0 u1 u2|u3 u4 u5|u6 u7 u8|u9 u10 u11|
这不仅增加了通过总线发送的数据的浮点数,而且还使我可以在客户端上生成24位数字,而不是简单地使用自动处理4个字节的Float32Array。
如果不可能获得32位数字,是否有任何巧妙的技巧可以在给定缓冲区的情况下生成24位数字,还是我必须循环遍历字节并对其进行编码(u1 + u2 * 256 + u3 * 65536)?
我不是很了解您的问题,但是如果您要将字节上传到WebGL,为什么不直接传递字节呢?
var data = new Uint8Array([1,2,3,4,5,6,7,8]);
var buf = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, buf);
gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW);
...
gl.enableVertexAttribArray(someLoc);
var numComponents = 4; // number of bytes to pull out each time
var type = gl.BYTE; // BYTE goes from -128 to +127 or -1.0 to 1.0
// UNSIGNED_BYTE goes from 0 to 255 or 0.0 to 1.0
var normalize = false; // false = use the value as is (-128 to +127 for BYTE,
// 0 to 255 for UNSIGNED_BYTE).
// true = convert to -1.0 to +1.0 for BYTE or 0 to 1.0 for
// UNSIGNED_BYTE
var stride = 0; // 0 means just advance numComponents * sizeof type.
var offset = 0; // how far into your buffer to start.
gl.vertexAttribPointer(someLoc, numComponents, type, normalize, stride, offset);
如果您使用的是Uint8Array
或Int8Array
那么似乎似乎没有什么特别的工作可以“打包”这些值,因此numComponents = 3
并不比numComponents = 4
难或易。 您只需直接设置每个组件。 同样,也没有解压缩它们的工作,GL会为您完成。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.