我想在使用webGL的mousemove事件期间绘制不同的磅值。例如,我按下鼠标并绘制大小为1像素的点。然后选择不同的尺寸,当我按下鼠标并移动时,我可以用新尺寸绘制点。
我发现了一些奇怪的东西,并且非常感谢任何反馈。
我创建了一个点大小数组:
var pointSizes = new Uint8Array(2000);
我在着色器中添加了一个属性来获取磅值:
attribute float pointSize;
主要功能有: gl_PointSize = pointSize;
如果我用一个大小填充数组,只要我没有在mousemove事件中绑定,一切正常:
for(var i = 0; i<=1999; i++)
{pointSizes[i] = 5.0;} //draw points of size 5
aPointSizeBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, aPointSizeBuffer);
gl.bufferData(gl.ARRAY_BUFFER, pointSizes, gl.STATIC_DRAW);
aPointSize = gl.getAttribLocation(program, "pointSize");
gl.vertexAttribPointer(aPointSize, 1, gl.UNSIGNED_BYTE, false, 0, 0);
gl.enableVertexAttribArray(aPointSize);
一旦我绑定缓冲区并在mousemove事件中设置bufferSubData,我移动鼠标时就不会显示任何点。注意:index只是一个随着鼠标移动而增加的变量,用于识别与像素相关的顶点中的位置。这是mousemove事件中的代码:
gl.bindBuffer(gl.ARRAY_BUFFER, aPointSizeBuffer);
pointSizes[index] = fpointSize; //this is the selected size
gl.bufferSubData(gl.ARRAY_BUFFER, index, pointSizes[index]);
如果我做这些事情并不重要:
gl.bufferSubData(gl.ARRAY_BUFFER, index, fpointSize);
甚至:
gl.bufferSubData(gl.ARRAY_BUFFER, index,1);
再次感谢您的帮助
答案 0 :(得分:2)
gl.bufferSubData
期望第3个参数是TypeArray。您的pointSizes[index]
似乎是一个uint8。尝试使用pointSizes.subarray(index, index+1)
并查看是否可以修复它。