我正在尝试将顶点数组存储在 WebGL 纹理中,但无法真正弄清楚如何正确执行。这样做的目的是将顶点传递给我的片段着色器并处理它们以进行光线跟踪。
我的 JavaScript 代码目前看起来像这样:
var a = new ArrayBuffer();
// Model.VerticeMap is an array holding all vertices [x1, y1, z1, x2, y2, z2, ...]
a = Model.VerticeMap; // array length: 36864
var dataArray = new Float32Array(a);
var vMapTexture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, vMapTexture);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB, 2, 2, 0, gl.RGB, gl.FLOAT, dataArray);
我没有得到纹理宽度和高度为 2 的错误。取更高的值会导致错误ArrayBufferView not big enough for request
。
我还在OES_texture_float
纹理中使用浮点值的扩展。
我必须承认我不是 100% 确定我在那里做什么。这更像是一个来回的过程,当我达到这段代码没有出现任何错误的地步时,我有点高兴。我的主要想法是将每个顶点的 x,y,z 值存储为纹理每个像素的 r,g,b 值。因此纹理大小必须等于或大于我的 3D 模型的三角形数量。不幸的是,WebGL 中的纹理大小仅限于两个数字的幂。顶点的数量也应该是可变的,因为我打算在我的场景中渲染多个模型。
我将不胜感激有关正确使用ArrayBuffer
aFloat32Array
和texImage2D()
命令的一些帮助,以解决我在 WebGL 中将顶点发送到片段着色器的问题。