尝试在mousemove事件期间设置磅值时,WebGL bufferSubData不起作用

时间:2015-07-23 19:49:45

标签: events webgl mousemove

我想在使用webGL的mousemove事件期间绘制不同的磅值。例如,我按下鼠标并绘制大小为1像素的点。然后选择不同的尺寸,当我按下鼠标并移动时,我可以用新尺寸绘制点。

我发现了一些奇怪的东西,并且非常感谢任何反馈。

  1. 我创建了一个点大小数组:

    var pointSizes = new Uint8Array(2000);
    
  2. 我在着色器中添加了一个属性来获取磅值:

    attribute float pointSize;
    

    主要功能有:   gl_PointSize = pointSize;

  3. 如果我用一个大小填充数组,只要我没有在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);
    
  4. 一旦我绑定缓冲区并在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);
    
  5. 再次感谢您的帮助

1 个答案:

答案 0 :(得分:2)

gl.bufferSubData期望第3个参数是TypeArray。您的pointSizes[index]似乎是一个uint8。尝试使用pointSizes.subarray(index, index+1)并查看是否可以修复它。