Javascript WebGL 32位浮动在顶点着色器中

Javascript WebGL 32位浮动在顶点着色器中,javascript,webgl,typed-arrays,Javascript,Webgl,Typed Arrays,有没有办法在WebGL着色器中获得32位浮动? 我将大量数据打包成4个无符号字节,我不希望将其拆分为3个字节,因为这将在客户端添加许多计算 例如,对于三对压缩数据,我显然更喜欢这种布局: |u0 u1 u2 u3|u4 u5 u6 u7|u8 u9 u10 u11| 除此之外: |u0 u1 u2|u3 u4 u5|u6 u7 u8|u9 u10 u11| 这不仅添加了一个float,用于添加通过总线发送的数据,还使我能够在客户机上生成24位数字,而不是简单地使用Float32Array自动

有没有办法在WebGL着色器中获得32位浮动? 我将大量数据打包成4个无符号字节,我不希望将其拆分为3个字节,因为这将在客户端添加许多计算

例如,对于三对压缩数据,我显然更喜欢这种布局:

|u0 u1 u2 u3|u4 u5 u6 u7|u8 u9 u10 u11|
除此之外:

|u0 u1 u2|u3 u4 u5|u6 u7 u8|u9 u10 u11|
这不仅添加了一个float,用于添加通过总线发送的数据,还使我能够在客户机上生成24位数字,而不是简单地使用Float32Array自动处理4个字节


如果无法获取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会为您解包。

注意,浮点32的精度只有23位。这里的诀窍是使用float32的符号位来填充最后24位。我不理解你的问题。当然,您可以在WebGL中获得32位浮点值。几乎99.999%的样本使用
Float32Array
gl.FLOAT
作为属性和各种
uniform FLOAT
制服。我不知道你的
|u0 u1…
图应该代表什么。在顶点着色器中只能获取128位浮点纹理。大多数现代GPU允许使用单字节,但绝大多数GPU不允许使用单字节,因此WebGLit也不依赖于实现,特别是GL 3.x硬件有这样的限制,假设它在每个硬件上都能工作,因为在您的系统中工作会导致代码具有未定义的行为(这也是我猜答案不被接受的原因)除了WebGL需要这样做。这是规范的一部分,也是WebGL一致性测试的一部分。所有GPU WebGL都支持这一点。从我的计算机上看,我的硬件不支持它,运行WebGL时也不支持。事实上,我没有一台完全符合WebGL的PC,但我认为大多数PC都不完全符合,除了硬件细节最近的个人电脑(4/5年).据我所知,没有任何GPU在运行WebGL的测试中失败。如果您的GPU在测试中失败,那么我猜WebGL将被列入黑名单,而您将其取消?WebGL的全部任务是在任何地方运行。浏览器会将不运行它的GPU列入黑名单。但任何DirectX 9 GPU都应该能够运行它,没有问题。可能角度正在扩大但这不是重点。从WebGL用户的角度来看,它应该可以正常工作。