繁体   English   中英

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

[英]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);

如果您使用的是Uint8ArrayInt8Array那么似乎似乎没有什么特别的工作可以“打包”这些值,因此numComponents = 3并不比numComponents = 4难或易。 您只需直接设置每个组件。 同样,也没有解压缩它们的工作,GL会为您完成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM